grub-devel
[Top][All Lists]
Advanced

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

[RFC PATCH 23/23] Optional: Power7 VSX instructions workaround.


From: Ram Pai
Subject: [RFC PATCH 23/23] Optional: Power7 VSX instructions workaround.
Date: Wed, 26 Feb 2014 10:31:22 -0800

 Power7 cannot handle VSX instructions correctly. It
 segfaults. This patch is applicable only for power7 systems.

Signed-off-by: Ram Pai <address@hidden>
---
 grub-core/fs/fshelp.c   | 10 ++++++++++
 grub-core/kern/term.c   | 11 +++++++++++
 grub-core/normal/term.c | 42 ++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 63 insertions(+)

diff --git a/grub-core/fs/fshelp.c b/grub-core/fs/fshelp.c
index 42bd542..bd610df 100644
--- a/grub-core/fs/fshelp.c
+++ b/grub-core/fs/fshelp.c
@@ -207,12 +207,22 @@ grub_fshelp_find_file (const char *path, 
grub_fshelp_node_t rootnode,
                       read_symlink_func read_symlink,
                       enum grub_fshelp_filetype expecttype)
 {
+#ifdef __powerpc64le__
+   // workaround for a problem on power7 in LE.
+  struct grub_fshelp_find_file_ctx ctx;
+    ctx.path = path;
+    ctx.rootnode = rootnode;
+    ctx.foundtype = GRUB_FSHELP_DIR;
+    ctx.symlinknest = 0;
+#else 
   struct grub_fshelp_find_file_ctx ctx = {
     .path = path,
     .rootnode = rootnode,
     .foundtype = GRUB_FSHELP_DIR,
     .symlinknest = 0
   };
+#endif 
+
   grub_err_t err;
 
   if (!path || path[0] != '/')
diff --git a/grub-core/kern/term.c b/grub-core/kern/term.c
index 07720ee..4ff3886 100644
--- a/grub-core/kern/term.c
+++ b/grub-core/kern/term.c
@@ -40,6 +40,16 @@ static void
 grub_putcode_dumb (grub_uint32_t code,
                   struct grub_term_output *term)
 {
+#ifdef __powerpc64le__
+  // this hack is needed for powerpc64le on power7 cpu only
+  // segfaults on VSX instructions generated by the compiler
+  struct grub_unicode_glyph c;
+      c.base = code;
+      c.variant = 0;
+      c.attributes = 0;
+      c.ncomb = 0;
+      c.estimated_width = 1;
+#else
   struct grub_unicode_glyph c =
     {
       .base = code,
@@ -48,6 +58,7 @@ grub_putcode_dumb (grub_uint32_t code,
       .ncomb = 0,
       .estimated_width = 1
     };
+#endif
 
   if (code == '\t' && term->getxy)
     {
diff --git a/grub-core/normal/term.c b/grub-core/normal/term.c
index 4c2238b..adddcf9 100644
--- a/grub-core/normal/term.c
+++ b/grub-core/normal/term.c
@@ -224,6 +224,14 @@ grub_puts_terminal (const char *str, struct 
grub_term_output *term)
     {
       for (; *str; str++)
        {
+#ifdef __powerpc64le__
+         struct grub_unicode_glyph c;
+             c.variant = 0;
+             c.attributes = 0;
+             c.ncomb = 0;
+             c.estimated_width = 1;
+             c.base = *str;
+#else
          struct grub_unicode_glyph c =
            {
              .variant = 0,
@@ -232,6 +240,7 @@ grub_puts_terminal (const char *str, struct 
grub_term_output *term)
              .estimated_width = 1,
              .base = *str
            };
+#endif
 
          FOR_ACTIVE_TERM_OUTPUTS(term)
          {
@@ -417,6 +426,13 @@ static void
 putglyph (const struct grub_unicode_glyph *c, struct grub_term_output *term,
          int fixed_tab)
 {
+#ifdef __powerpc64le__
+  struct grub_unicode_glyph c2;
+      c2.variant = 0;
+      c2.attributes = 0;
+      c2.ncomb = 0;
+      c2.estimated_width = 1;
+#else
   struct grub_unicode_glyph c2 =
     {
       .variant = 0,
@@ -424,6 +440,7 @@ putglyph (const struct grub_unicode_glyph *c, struct 
grub_term_output *term,
       .ncomb = 0,
       .estimated_width = 1
     };
+#endif
 
   if (c->base == '\t' && fixed_tab)
     {
@@ -500,6 +517,13 @@ putglyph (const struct grub_unicode_glyph *c, struct 
grub_term_output *term,
 static void
 putcode_real (grub_uint32_t code, struct grub_term_output *term, int fixed_tab)
 {
+#ifdef __powerpc64le__
+  struct grub_unicode_glyph c;
+      c.variant = 0;
+      c.attributes = 0;
+      c.ncomb = 0;
+      c.estimated_width = 1;
+#else
   struct grub_unicode_glyph c =
     {
       .variant = 0,
@@ -507,6 +531,7 @@ putcode_real (grub_uint32_t code, struct grub_term_output 
*term, int fixed_tab)
       .ncomb = 0,
       .estimated_width = 1
     };
+#endif
 
   c.base = map_code (code, term);
   putglyph (&c, term, fixed_tab);
@@ -527,12 +552,20 @@ static grub_ssize_t
 get_maxwidth (struct grub_term_output *term,
              int margin_left, int margin_right)
 {
+#ifdef __powerpc64le__
+  struct grub_unicode_glyph space_glyph;
+    space_glyph.base = ' ';
+    space_glyph.variant = 0;
+    space_glyph.attributes = 0;
+    space_glyph.ncomb = 0;
+#else
   struct grub_unicode_glyph space_glyph = {
     .base = ' ',
     .variant = 0,
     .attributes = 0,
     .ncomb = 0,
   };
+#endif
   return (grub_term_width (term)
          - grub_term_getcharwidth (term, &space_glyph) 
          * (margin_left + margin_right) - 1);
@@ -1021,6 +1054,14 @@ grub_xnputs (const char *str, grub_size_t msg_len)
     {
       for (; msg_len--; str++, msg_len++)
        {
+        #ifdef __powerpc64le__
+         struct grub_unicode_glyph c;
+             c.variant = 0;
+             c.attributes = 0;
+             c.ncomb = 0;
+             c.estimated_width = 1;
+             c.base = *str;
+        #else /*  __powerpc64le__ */
          struct grub_unicode_glyph c =
            {
              .variant = 0,
@@ -1029,6 +1070,7 @@ grub_xnputs (const char *str, grub_size_t msg_len)
              .estimated_width = 1,
              .base = *str
            };
+        #endif /*  __powerpc64le__ */
 
          FOR_ACTIVE_TERM_OUTPUTS(term)
          {
-- 
1.8.5.3




reply via email to

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