Source-Changes-D archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: CVS commit: src/sys/sys



Hi,

2014-09-15 3:07 GMT+09:00 Christos Zoulas <christos%astron.com@localhost>:

> Perhaps it is better to memcpy the data to some aligned struct rather
> than referencing it directly and making it packed (which is not portable).

I wrote the following patch. ok?

Index: ./sys/sys/bootblock.h
===================================================================
RCS file: /cvsroot/src/sys/sys/bootblock.h,v
retrieving revision 1.57
diff -u -r1.57 bootblock.h
--- ./sys/sys/bootblock.h    14 Sep 2014 17:39:06 -0000    1.57
+++ ./sys/sys/bootblock.h    15 Sep 2014 02:50:00 -0000
@@ -815,7 +815,7 @@
     uint32_t    descBlock;    /* first block of driver */
     uint16_t    descSize;    /* driver size in blocks */
     uint16_t    descType;    /* system type */
-} __packed;
+};

 /*
  *    system types; Apple reserves 0-15
@@ -834,6 +834,10 @@
     uint32_t    sbData;        /* (used internally by ROM) */
     uint16_t    sbDrvrCount;    /* number of driver descriptors */
     struct apple_drvr_descriptor sb_dd[APPLE_DRVR_MAP_MAX_DESCRIPTORS];
+                    /* XXX: Don't access directly.
+                     * Data abort occurs by an access to
+                     * unaligned address on arm.
+                     */
     uint16_t    pad[3];
 } __packed;

Index: ./sys/dev/dkwedge/dkwedge_apple.c
===================================================================
RCS file: /cvsroot/src/sys/dev/dkwedge/dkwedge_apple.c,v
retrieving revision 1.1
diff -u -r1.1 dkwedge_apple.c
--- ./sys/dev/dkwedge/dkwedge_apple.c    7 Apr 2012 05:36:10 -0000    1.1
+++ ./sys/dev/dkwedge/dkwedge_apple.c    15 Sep 2014 02:50:00 -0000
@@ -82,8 +82,12 @@
     if (ap->sbDrvrCount >= APPLE_DRVR_MAP_MAX_DESCRIPTORS)
         ap->sbDrvrCount = APPLE_DRVR_MAP_MAX_DESCRIPTORS;

-    for (i = 0; i < ap->sbDrvrCount; i++)
-        swap_apple_drvr_descriptor(&ap->sb_dd[i]);
+    for (i = 0; i < ap->sbDrvrCount; i++) {
+        struct apple_drvr_descriptor sdd;
+        memcpy(&sdd, &ap->sb_dd[i], sizeof(ap->sb_dd[0]));
+        swap_apple_drvr_descriptor(&sdd);
+        memcpy(&ap->sb_dd[i], &sdd, sizeof(ap->sb_dd[0]));
+    }
 }

 static void
Index: ./sbin/apmlabel/apmlabel.c
===================================================================
RCS file: /cvsroot/src/sbin/apmlabel/apmlabel.c,v
retrieving revision 1.3
diff -u -r1.3 apmlabel.c
--- ./sbin/apmlabel/apmlabel.c    19 Oct 2013 01:09:58 -0000    1.3
+++ ./sbin/apmlabel/apmlabel.c    15 Sep 2014 02:50:00 -0000
@@ -249,9 +249,12 @@
     BE32TOH(drvr->sbData);
     BE16TOH(drvr->sbDrvrCount);
     for (i=0; i<APPLE_DRVR_MAP_MAX_DESCRIPTORS; i++) {
-        BE32TOH(drvr->sb_dd[i].descBlock);
-        BE16TOH(drvr->sb_dd[i].descSize);
-        BE16TOH(drvr->sb_dd[i].descType);
+        struct apple_drvr_descriptor sdd;
+        memcpy(&sdd, &drvr->sb_dd[i], sizeof(drvr->sb_dd[0]));
+        BE32TOH(sdd.descBlock);
+        BE16TOH(sdd.descSize);
+        BE16TOH(sdd.descType);
+        memcpy(&drvr->sb_dd[i], &sdd, sizeof(drvr->sb_dd[0]));
     }

     return drvr;


Regards,
-- 
NONAKA Kimihiro


Home | Main Index | Thread Index | Old Index