grub-devel
[Top][All Lists]
Advanced

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

[PATCH]: grub: Fix ieee1275 call block typing.


From: David Miller
Subject: [PATCH]: grub: Fix ieee1275 call block typing.
Date: Tue, 07 Apr 2009 17:03:26 -0700 (PDT)

This fixes the use of various fundamental types involved in
ieee1275 calls.

In ieee1275, the array of arguments and return values passed
to the ieee1275 call handler is defined as an array of "cells".
No ifs, ands, or buts.  They are all cells and must be of the
size of a cell for a given platform.

On powerpc the cell is currently 32-bits.  Since this matches
the type of phandles and ihandles, the type usage ends up being
arbitrary and things just work.

But on sparc64 a cell is 64-bits, whereas the phandles and ihandles
are still 32-bits.  So it becomes important to get the types right.

This patch does two things:

1) Make all ieee1275 calls use grub_ieee1275_cell_t consistently
   in all arg declarations.

2) Makes grub_ieee1275_ihandle_t and grub_ieee1275_phandle_t defined
   as 32-bit integers.

With this the ieee1275 calls will work on both powerpc and sparc64.

2009-04-07  David S. Miller  <address@hidden>

        * disk/ieee1275/nand.c (grub_nand_open): All ieee1275 call arg
        slots are of type grub_ieee1275_cell_t.
        (grub_nand_read): Likewise.
        * kern/ieee1275/ieee1275.c (IEEE1275_PHANDLE_INVALID,
        IEEE1275_IHANDLE_INVALID): Use grub_ieee1275_cell_t since these
        macros are used to compare values in arg/ret block of the call.
        (grub_ieee1275_finddevice, grub_ieee1275_get_property,
        grub_ieee1275_next_property, grub_ieee1275_get_property_length,
        grub_ieee1275_instance_to_package, grub_ieee1275_package_to_path,
        grub_ieee1275_instance_to_path, grub_ieee1275_write,
        grub_ieee1275_read, grub_ieee1275_seek, grub_ieee1275_peer,
        grub_ieee1275_child, grub_ieee1275_parent, grub_ieee1275_open,
        grub_ieee1275_close, grub_ieee1275_set_property,
        grub_ieee1275_set_color): All ieee1275 call arg slots are of type
        grub_ieee1275_cell_t.
        * kern/ieee1275/openfw.c (grub_map): Likewise.
        * include/grub/ieee1275/ieee1275.h (grub_ieee1275_ihandle_t,
        grub_ieee1275_phandle_t): Define as grub_unit32_t type.
---
 disk/ieee1275/nand.c             |   14 +++++-----
 include/grub/ieee1275/ieee1275.h |    4 +-
 kern/ieee1275/ieee1275.c         |   50 +++++++++++++++++++-------------------
 kern/ieee1275/openfw.c           |   16 ++++++------
 4 files changed, 42 insertions(+), 42 deletions(-)

diff --git a/disk/ieee1275/nand.c b/disk/ieee1275/nand.c
index ba79faa..ed50768 100644
--- a/disk/ieee1275/nand.c
+++ b/disk/ieee1275/nand.c
@@ -60,8 +60,8 @@ grub_nand_open (const char *name, grub_disk_t disk)
   struct size_args
     {
       struct grub_ieee1275_common_hdr common;
-      char *method;
-      grub_ieee1275_ihandle_t ihandle;
+      grub_ieee1275_cell_t method;
+      grub_ieee1275_cell_t ihandle;
       grub_ieee1275_cell_t result;
       grub_ieee1275_cell_t size1;
       grub_ieee1275_cell_t size2;
@@ -84,7 +84,7 @@ grub_nand_open (const char *name, grub_disk_t disk)
   data->handle = dev_ihandle;
 
   INIT_IEEE1275_COMMON (&args.common, "call-method", 2, 2);
-  args.method = "block-size";
+  args.method = (grub_ieee1275_cell_t) "block-size";
   args.ihandle = dev_ihandle;
   args.result = 1;
 
@@ -97,7 +97,7 @@ grub_nand_open (const char *name, grub_disk_t disk)
   data->block_size = (args.size1 >> GRUB_DISK_SECTOR_BITS);
 
   INIT_IEEE1275_COMMON (&args.common, "call-method", 2, 3);
-  args.method = "size";
+  args.method = (grub_ieee1275_cell_t) "size";
   args.ihandle = dev_ihandle;
   args.result = 1;
 
@@ -143,8 +143,8 @@ grub_nand_read (grub_disk_t disk, grub_disk_addr_t sector,
   struct read_args
     {
       struct grub_ieee1275_common_hdr common;
-      char *method;
-      grub_ieee1275_ihandle_t ihandle;
+      grub_ieee1275_cell_t method;
+      grub_ieee1275_cell_t ihandle;
       grub_ieee1275_cell_t ofs;
       grub_ieee1275_cell_t page;
       grub_ieee1275_cell_t len;
@@ -153,7 +153,7 @@ grub_nand_read (grub_disk_t disk, grub_disk_addr_t sector,
     } args;
 
   INIT_IEEE1275_COMMON (&args.common, "call-method", 6, 1);
-  args.method = "pio-read";
+  args.method = (grub_ieee1275_cell_t) "pio-read";
   args.ihandle = data->handle;
   args.buf = (grub_ieee1275_cell_t) buf;
   args.page = (grub_ieee1275_cell_t) ((grub_size_t) sector / data->block_size);
diff --git a/include/grub/ieee1275/ieee1275.h b/include/grub/ieee1275/ieee1275.h
index 628d888..3b5139e 100644
--- a/include/grub/ieee1275/ieee1275.h
+++ b/include/grub/ieee1275/ieee1275.h
@@ -60,8 +60,8 @@ struct grub_ieee1275_common_hdr
   (p)->nr_ins = (grub_ieee1275_cell_t) xins; \
   (p)->nr_outs = (grub_ieee1275_cell_t) xouts
 
-typedef grub_ieee1275_cell_t grub_ieee1275_ihandle_t;
-typedef grub_ieee1275_cell_t grub_ieee1275_phandle_t;
+typedef grub_uint32_t grub_ieee1275_ihandle_t;
+typedef grub_uint32_t grub_ieee1275_phandle_t;
 
 extern grub_ieee1275_phandle_t EXPORT_VAR(grub_ieee1275_chosen);
 extern grub_ieee1275_ihandle_t EXPORT_VAR(grub_ieee1275_mmu);
diff --git a/kern/ieee1275/ieee1275.c b/kern/ieee1275/ieee1275.c
index aa48e20..f537b11 100644
--- a/kern/ieee1275/ieee1275.c
+++ b/kern/ieee1275/ieee1275.c
@@ -20,8 +20,8 @@
 #include <grub/ieee1275/ieee1275.h>
 #include <grub/types.h>
 
-#define IEEE1275_PHANDLE_INVALID  ((grub_ieee1275_phandle_t) -1)
-#define IEEE1275_IHANDLE_INVALID  ((grub_ieee1275_ihandle_t) 0)
+#define IEEE1275_PHANDLE_INVALID  ((grub_ieee1275_cell_t) -1)
+#define IEEE1275_IHANDLE_INVALID  ((grub_ieee1275_cell_t) 0)
 #define IEEE1275_CELL_INVALID     ((grub_ieee1275_cell_t) -1)
 
 
@@ -33,7 +33,7 @@ grub_ieee1275_finddevice (char *name, grub_ieee1275_phandle_t 
*phandlep)
   {
     struct grub_ieee1275_common_hdr common;
     grub_ieee1275_cell_t device;
-    grub_ieee1275_phandle_t phandle;
+    grub_ieee1275_cell_t phandle;
   }
   args;
 
@@ -56,7 +56,7 @@ grub_ieee1275_get_property (grub_ieee1275_phandle_t phandle,
   struct get_property_args
   {
     struct grub_ieee1275_common_hdr common;
-    grub_ieee1275_phandle_t phandle;
+    grub_ieee1275_cell_t phandle;
     grub_ieee1275_cell_t prop;
     grub_ieee1275_cell_t buf;
     grub_ieee1275_cell_t buflen;
@@ -106,7 +106,7 @@ grub_ieee1275_next_property (grub_ieee1275_phandle_t 
phandle, char *prev_prop,
   struct get_property_args
   {
     struct grub_ieee1275_common_hdr common;
-    grub_ieee1275_phandle_t phandle;
+    grub_ieee1275_cell_t phandle;
     grub_ieee1275_cell_t prev_prop;
     grub_ieee1275_cell_t next_prop;
     grub_ieee1275_cell_t flags;
@@ -131,7 +131,7 @@ grub_ieee1275_get_property_length (grub_ieee1275_phandle_t 
phandle,
   struct get_property_args
   {
     struct grub_ieee1275_common_hdr common;
-    grub_ieee1275_phandle_t phandle;
+    grub_ieee1275_cell_t phandle;
     grub_ieee1275_cell_t prop;
     grub_ieee1275_cell_t length;
   }
@@ -157,8 +157,8 @@ grub_ieee1275_instance_to_package (grub_ieee1275_ihandle_t 
ihandle,
   struct instance_to_package_args
   {
     struct grub_ieee1275_common_hdr common;
-    grub_ieee1275_ihandle_t ihandle;
-    grub_ieee1275_phandle_t phandle;
+    grub_ieee1275_cell_t ihandle;
+    grub_ieee1275_cell_t phandle;
   }
   args;
 
@@ -181,7 +181,7 @@ grub_ieee1275_package_to_path (grub_ieee1275_phandle_t 
phandle,
   struct instance_to_package_args
   {
     struct grub_ieee1275_common_hdr common;
-    grub_ieee1275_phandle_t phandle;
+    grub_ieee1275_cell_t phandle;
     grub_ieee1275_cell_t buf;
     grub_ieee1275_cell_t buflen;
     grub_ieee1275_cell_t actual;
@@ -210,7 +210,7 @@ grub_ieee1275_instance_to_path (grub_ieee1275_ihandle_t 
ihandle,
   struct instance_to_path_args
   {
     struct grub_ieee1275_common_hdr common;
-    grub_ieee1275_ihandle_t ihandle;
+    grub_ieee1275_cell_t ihandle;
     grub_ieee1275_cell_t buf;
     grub_ieee1275_cell_t buflen;
     grub_ieee1275_cell_t actual;
@@ -238,7 +238,7 @@ grub_ieee1275_write (grub_ieee1275_ihandle_t ihandle, void 
*buffer,
   struct write_args
   {
     struct grub_ieee1275_common_hdr common;
-    grub_ieee1275_ihandle_t ihandle;
+    grub_ieee1275_cell_t ihandle;
     grub_ieee1275_cell_t buf;
     grub_ieee1275_cell_t len;
     grub_ieee1275_cell_t actual;
@@ -264,7 +264,7 @@ grub_ieee1275_read (grub_ieee1275_ihandle_t ihandle, void 
*buffer,
   struct write_args
   {
     struct grub_ieee1275_common_hdr common;
-    grub_ieee1275_ihandle_t ihandle;
+    grub_ieee1275_cell_t ihandle;
     grub_ieee1275_cell_t buf;
     grub_ieee1275_cell_t len;
     grub_ieee1275_cell_t actual;
@@ -290,7 +290,7 @@ grub_ieee1275_seek (grub_ieee1275_ihandle_t ihandle, int 
pos_hi,
   struct write_args
   {
     struct grub_ieee1275_common_hdr common;
-    grub_ieee1275_ihandle_t ihandle;
+    grub_ieee1275_cell_t ihandle;
     grub_ieee1275_cell_t pos_hi;
     grub_ieee1275_cell_t pos_lo;
     grub_ieee1275_cell_t result;
@@ -317,8 +317,8 @@ grub_ieee1275_peer (grub_ieee1275_phandle_t node,
   struct peer_args
   {
     struct grub_ieee1275_common_hdr common;
-    grub_ieee1275_phandle_t node;
-    grub_ieee1275_phandle_t result;
+    grub_ieee1275_cell_t node;
+    grub_ieee1275_cell_t result;
   }
   args;
 
@@ -340,8 +340,8 @@ grub_ieee1275_child (grub_ieee1275_phandle_t node,
   struct child_args
   {
     struct grub_ieee1275_common_hdr common;
-    grub_ieee1275_phandle_t node;
-    grub_ieee1275_phandle_t result;
+    grub_ieee1275_cell_t node;
+    grub_ieee1275_cell_t result;
   }
   args;
 
@@ -364,8 +364,8 @@ grub_ieee1275_parent (grub_ieee1275_phandle_t node,
   struct parent_args
   {
     struct grub_ieee1275_common_hdr common;
-    grub_ieee1275_phandle_t node;
-    grub_ieee1275_phandle_t result;
+    grub_ieee1275_cell_t node;
+    grub_ieee1275_cell_t result;
   }
   args;
 
@@ -441,7 +441,7 @@ grub_ieee1275_open (const char *path, 
grub_ieee1275_ihandle_t *result)
   {
     struct grub_ieee1275_common_hdr common;
     grub_ieee1275_cell_t path;
-    grub_ieee1275_ihandle_t result;
+    grub_ieee1275_cell_t result;
   }
   args;
 
@@ -462,7 +462,7 @@ grub_ieee1275_close (grub_ieee1275_ihandle_t ihandle)
   struct close_args
   {
     struct grub_ieee1275_common_hdr common;
-    grub_ieee1275_ihandle_t ihandle;
+    grub_ieee1275_cell_t ihandle;
   }
   args;
 
@@ -531,7 +531,7 @@ grub_ieee1275_set_property (grub_ieee1275_phandle_t phandle,
   struct set_property_args
   {
     struct grub_ieee1275_common_hdr common;
-    grub_ieee1275_phandle_t phandle;
+    grub_ieee1275_cell_t phandle;
     grub_ieee1275_cell_t propname;
     grub_ieee1275_cell_t buf;
     grub_ieee1275_cell_t size;
@@ -560,8 +560,8 @@ grub_ieee1275_set_color (grub_ieee1275_ihandle_t ihandle,
   struct set_color_args
   {
     struct grub_ieee1275_common_hdr common;
-    char *method;
-    grub_ieee1275_ihandle_t ihandle;
+    grub_ieee1275_cell_t method;
+    grub_ieee1275_cell_t ihandle;
     grub_ieee1275_cell_t index;
     grub_ieee1275_cell_t b;
     grub_ieee1275_cell_t g;
@@ -571,7 +571,7 @@ grub_ieee1275_set_color (grub_ieee1275_ihandle_t ihandle,
   args;
 
   INIT_IEEE1275_COMMON (&args.common, "call-method", 6, 1);
-  args.method = "color!";
+  args.method = (grub_ieee1275_cell_t) "color!";
   args.ihandle = ihandle;
   args.index = index;
   args.r = r;
diff --git a/kern/ieee1275/openfw.c b/kern/ieee1275/openfw.c
index e88f3b3..4c8cc6a 100644
--- a/kern/ieee1275/openfw.c
+++ b/kern/ieee1275/openfw.c
@@ -154,17 +154,17 @@ grub_map (grub_addr_t phys, grub_addr_t virt, 
grub_uint32_t size,
 {
   struct map_args {
     struct grub_ieee1275_common_hdr common;
-    char *method;
-    grub_ieee1275_ihandle_t ihandle;
-    grub_uint32_t mode;
-    grub_uint32_t size;
-    grub_uint32_t virt;
-    grub_uint32_t phys;
-    int catch_result;
+    grub_ieee1275_cell_t method;
+    grub_ieee1275_cell_t ihandle;
+    grub_ieee1275_cell_t mode;
+    grub_ieee1275_cell_t size;
+    grub_ieee1275_cell_t virt;
+    grub_ieee1275_cell_t phys;
+    grub_ieee1275_cell_t catch_result;
   } args;
 
   INIT_IEEE1275_COMMON (&args.common, "call-method", 6, 1);
-  args.method = "map";
+  args.method = (grub_ieee1275_cell_t) "map";
   args.ihandle = grub_ieee1275_mmu;
   args.phys = phys;
   args.virt = virt;
-- 
1.6.2.2





reply via email to

[Prev in Thread] Current Thread [Next in Thread]