Author: mmel
Date: Sat Mar 26 06:57:36 2016
New Revision: 297285
URL: https://svnweb.freebsd.org/changeset/base/297285

Log:
  ARM: Fix ATAG handling in LINUX_BOOT_API:
   - Don't convert atags address passed from U-Boot. It's real physical
     address (and we have 1:1 mapping).
   - Size of tags is encoded in words, not in bytes

Modified:
  head/sys/arm/arm/machdep.c
  head/sys/arm/include/atags.h

Modified: head/sys/arm/arm/machdep.c
==============================================================================
--- head/sys/arm/arm/machdep.c  Sat Mar 26 06:55:55 2016        (r297284)
+++ head/sys/arm/arm/machdep.c  Sat Mar 26 06:57:36 2016        (r297285)
@@ -1035,6 +1035,7 @@ linux_parse_boot_param(struct arm_boot_p
        struct arm_lbabi_tag *walker;
        uint32_t revision;
        uint64_t serial;
+       int size;
 #ifdef FDT
        struct fdt_header *dtb_ptr;
        uint32_t dtb_size;
@@ -1061,8 +1062,7 @@ linux_parse_boot_param(struct arm_boot_p
                return (0);
 
        board_id = abp->abp_r1;
-       walker = (struct arm_lbabi_tag *)
-           (abp->abp_r2 + KERNVIRTADDR - abp->abp_physaddr);
+       walker = (struct arm_lbabi_tag *)abp->abp_r2;
 
        if (ATAG_TAG(walker) != ATAG_CORE)
                return 0;
@@ -1079,8 +1079,9 @@ linux_parse_boot_param(struct arm_boot_p
                case ATAG_INITRD2:
                        break;
                case ATAG_SERIAL:
-                       serial = walker->u.tag_sn.low |
-                           ((uint64_t)walker->u.tag_sn.high << 32);
+                       serial = walker->u.tag_sn.high;
+                       serial <<= 32;
+                       serial |= walker->u.tag_sn.low;
                        board_set_serial(serial);
                        break;
                case ATAG_REVISION:
@@ -1089,8 +1090,12 @@ linux_parse_boot_param(struct arm_boot_p
                        break;
                case ATAG_CMDLINE:
                        /* XXX open question: Parse this for boothowto? */
-                       bcopy(walker->u.tag_cmd.command, linux_command_line,
-                             ATAG_SIZE(walker));
+                       size = ATAG_SIZE(walker) -
+                           sizeof(struct arm_lbabi_header);
+                       size = min(size, sizeof(linux_command_line) - 1);
+                       strncpy(linux_command_line, walker->u.tag_cmd.command,
+                           size);
+                       linux_command_line[size] = '\0';
                        break;
                default:
                        break;

Modified: head/sys/arm/include/atags.h
==============================================================================
--- head/sys/arm/include/atags.h        Sat Mar 26 06:55:55 2016        
(r297284)
+++ head/sys/arm/include/atags.h        Sat Mar 26 06:57:36 2016        
(r297285)
@@ -123,7 +123,7 @@ struct arm_lbabi_tag
 };
 
 #define        ATAG_TAG(a)  (a)->tag_hdr.tag
-#define ATAG_SIZE(a) (a)->tag_hdr.size
+#define ATAG_SIZE(a) ((a)->tag_hdr.size * sizeof(uint32_t))
 #define ATAG_NEXT(a) (struct arm_lbabi_tag *)((char *)(a) + ATAG_SIZE(a))
 
 #endif /* __MACHINE_ATAGS_H__ */
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to