Power7 cannot handle VSX instructions correctly. It segfaults. This patch is applicable only for power7 systems.
Signed-off-by: Ram Pai <linux...@us.ibm.com> --- 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 _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel