diff options
author | Aurelien Jarno <aurelien@aurel32.net> | 2010-03-14 21:20:59 +0100 |
---|---|---|
committer | Aurelien Jarno <aurelien@aurel32.net> | 2010-03-16 08:38:05 +0100 |
commit | 409dbce54b57b85bd229174da86d77ca08508508 (patch) | |
tree | 61aaddb4700595752b34e01db383074463336329 /hw/mips_mipssim.c | |
parent | cb66ffcf9e298dc1bfc11682172ff9472bcd4495 (diff) | |
download | qemu-409dbce54b57b85bd229174da86d77ca08508508.tar.gz qemu-409dbce54b57b85bd229174da86d77ca08508508.tar.bz2 qemu-409dbce54b57b85bd229174da86d77ca08508508.zip |
load_elf: replace the address addend by a translation function
A few machines need to translate the ELF header addresses into physical
addresses. Currently the only possibility is to add a value to the
addresses.
This patch replaces the addend argument by and a translation function
and an opaque passed to the function. A NULL function does not translate
the address.
The patch also convert all machines that have an addend, simplify the
PowerPC kernel loading and fix the MIPS kernel loading using this new
feature. Other machines may benefit from this feature.
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
Diffstat (limited to 'hw/mips_mipssim.c')
-rw-r--r-- | hw/mips_mipssim.c | 17 |
1 files changed, 5 insertions, 12 deletions
diff --git a/hw/mips_mipssim.c b/hw/mips_mipssim.c index aa90116760..9a6f50cd15 100644 --- a/hw/mips_mipssim.c +++ b/hw/mips_mipssim.c @@ -35,14 +35,6 @@ #include "loader.h" #include "elf.h" -#ifdef TARGET_MIPS64 -#define PHYS_TO_VIRT(x) ((x) | ~0x7fffffffULL) -#else -#define PHYS_TO_VIRT(x) ((x) | ~0x7fffffffU) -#endif - -#define VIRT_TO_PHYS_ADDEND (-((int64_t)(int32_t)0x80000000)) - static struct _loaderparams { int ram_size; const char *kernel_filename; @@ -57,7 +49,7 @@ typedef struct ResetData { static int64_t load_kernel(void) { - int64_t entry, kernel_low, kernel_high; + int64_t entry, kernel_high; long kernel_size; long initrd_size; ram_addr_t initrd_offset; @@ -69,9 +61,10 @@ static int64_t load_kernel(void) big_endian = 0; #endif - kernel_size = load_elf(loaderparams.kernel_filename, VIRT_TO_PHYS_ADDEND, - (uint64_t *)&entry, (uint64_t *)&kernel_low, - (uint64_t *)&kernel_high, big_endian, ELF_MACHINE, 1); + kernel_size = load_elf(loaderparams.kernel_filename, cpu_mips_kseg0_to_phys, + NULL, (uint64_t *)&entry, NULL, + (uint64_t *)&kernel_high, big_endian, + ELF_MACHINE, 1); if (kernel_size >= 0) { if ((entry & ~0x7fffffffULL) == 0x80000000) entry = (int32_t)entry; |