[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
- [RFC PATCH 13/23] Add 64bit support to powerpc startup code, (continued)
- [RFC PATCH 13/23] Add 64bit support to powerpc startup code, Ram Pai, 2014/02/26
- [RFC PATCH 14/23] Add grub_dl_find_section_addr, Ram Pai, 2014/02/26
- [RFC PATCH 15/23] Add ppc64 relocations, Ram Pai, 2014/02/26
- [RFC PATCH 17/23] Use FUNC_START/FUNC_END for powerpc function definitions, Ram Pai, 2014/02/26
- [RFC PATCH 16/23] ppc64 doesn't need libgcc routines, Ram Pai, 2014/02/26
- [RFC PATCH 19/23] align .toc section on 4byte boundary., Ram Pai, 2014/02/26
- [RFC PATCH 18/23] .TOC. symbol is special in ppc64le, Ram Pai, 2014/02/26
- [RFC PATCH 20/23] fix parameter to firmware calls, Ram Pai, 2014/02/26
- [RFC PATCH 21/23] powerpc64 is not necessarily BigEndian anymore! :), Ram Pai, 2014/02/26
- [RFC PATCH 22/23] fix segfaults if initrd, Ram Pai, 2014/02/26
- [RFC PATCH 23/23] Optional: Power7 VSX instructions workaround.,
Ram Pai <=