From c311ced5d79d408e24f93bc8986cfac0c0810ce8 Mon Sep 17 00:00:00 2001 From: Vladimir Serbinenko Date: Sun, 8 Dec 2013 02:59:21 +0100 Subject: [PATCH] Make arm-emu work. --- ChangeLog | 4 ++++ conf/Makefile.common | 2 ++ grub-core/kern/emu/cache.c | 2 +- grub-core/kern/emu/cache_s.S | 2 +- grub-core/kern/emu/full.c | 8 +++++--- grub-core/kern/emu/lite.c | 6 ++++++ grub-core/kern/misc.c | 2 +- grub-core/tests/video_checksum.c | 4 ++-- 8 files changed, 22 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index ca2e17fe8..0a725555b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2013-12-08 Vladimir Serbinenko + + Make arm-emu work. + 2013-12-07 Vladimir Serbinenko * util/grub-mkfont.c: Replace stpcpy with grub_stpcpy. diff --git a/conf/Makefile.common b/conf/Makefile.common index 4ec2b811e..47f3b9a03 100644 --- a/conf/Makefile.common +++ b/conf/Makefile.common @@ -13,8 +13,10 @@ endif if COND_arm CFLAGS_PLATFORM += -mthumb-interwork CCASFLAGS_PLATFORM = -mthumb-interwork +if !COND_emu LDFLAGS_PLATFORM = -Wl,--wrap=__clear_cache endif +endif if COND_arm64 CFLAGS_PLATFORM += -mcmodel=large endif diff --git a/grub-core/kern/emu/cache.c b/grub-core/kern/emu/cache.c index 543e457e5..4a701f44a 100644 --- a/grub-core/kern/emu/cache.c +++ b/grub-core/kern/emu/cache.c @@ -1,5 +1,5 @@ -#if defined(__ia64__) +#if defined(__ia64__) || defined (__arm__) || defined (__aarch64__) #include void __clear_cache (char *beg, char *end); diff --git a/grub-core/kern/emu/cache_s.S b/grub-core/kern/emu/cache_s.S index 8ca695c28..7fbebb80d 100644 --- a/grub-core/kern/emu/cache_s.S +++ b/grub-core/kern/emu/cache_s.S @@ -23,7 +23,7 @@ FUNCTION (grub_arch_sync_caches) .set macro #elif defined(__powerpc__) #include "../powerpc/cache.S" -#elif defined(__ia64__) +#elif defined(__ia64__) || defined(__arm__) || defined(__aarch64__) #else #error "No target cpu type is defined" #endif diff --git a/grub-core/kern/emu/full.c b/grub-core/kern/emu/full.c index e056ded97..03888d8ec 100644 --- a/grub-core/kern/emu/full.c +++ b/grub-core/kern/emu/full.c @@ -49,12 +49,14 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr, return GRUB_ERR_BAD_MODULE; } -#if defined (__ia64__) || defined (__powerpc__) || defined (__mips__) -void grub_arch_dl_get_tramp_got_size (const void *ehdr __attribute__ ((unused)), - grub_size_t *tramp, grub_size_t *got) +#if !defined (__i386__) && !defined (__x86_64__) && !defined (__sparc__) +grub_err_t +grub_arch_dl_get_tramp_got_size (const void *ehdr __attribute__ ((unused)), + grub_size_t *tramp, grub_size_t *got) { *tramp = 0; *got = 0; + return GRUB_ERR_BAD_MODULE; } #endif diff --git a/grub-core/kern/emu/lite.c b/grub-core/kern/emu/lite.c index 00b811bf5..be1e67876 100644 --- a/grub-core/kern/emu/lite.c +++ b/grub-core/kern/emu/lite.c @@ -17,6 +17,12 @@ #include "../powerpc/dl.c" #elif defined(__ia64__) #include "../ia64/dl.c" +#elif defined(__arm__) +#include "../arm/dl_helper.c" +#include "../arm/dl.c" +#elif defined(__aarch64__) +#include "../arm64/dl_helper.c" +#include "../arm64/dl.c" #else #error "No target cpu type is defined" #endif diff --git a/grub-core/kern/misc.c b/grub-core/kern/misc.c index cbd2748ed..05cb1faf7 100644 --- a/grub-core/kern/misc.c +++ b/grub-core/kern/misc.c @@ -628,7 +628,7 @@ grub_divmod64 (grub_uint64_t n, grub_uint64_t d, grub_uint64_t *r) return q; } -#ifndef GRUB_UTIL +#if !defined (GRUB_UTIL) && !defined (GRUB_MACHINE_EMU) #if defined (__arm__) diff --git a/grub-core/tests/video_checksum.c b/grub-core/tests/video_checksum.c index 996b936cb..f8927555f 100644 --- a/grub-core/tests/video_checksum.c +++ b/grub-core/tests/video_checksum.c @@ -350,7 +350,7 @@ grub_video_capture_write_bmp (const char *fname, for (y = mode_info->height - 1; y >= 0; y--) { - grub_uint32_t *iptr = (grub_uint32_t *) ((grub_uint8_t *) ptr + mode_info->pitch * y); + grub_uint32_t *iptr = (grub_uint32_t *) ptr + (mode_info->pitch / 4) * y; int x; grub_uint8_t *optr = buffer; for (x = 0; x < (int) mode_info->width; x++) @@ -421,7 +421,7 @@ grub_video_capture_write_bmp (const char *fname, for (y = mode_info->height - 1; y >= 0; y--) { - grub_uint16_t *iptr = (grub_uint16_t *) ((grub_uint8_t *) ptr + mode_info->pitch * y); + grub_uint16_t *iptr = (grub_uint16_t *) ptr + (mode_info->pitch / 2) * y; int x; grub_uint8_t *optr = buffer; for (x = 0; x < (int) mode_info->width; x++)