From 1edb493490c5cb1eb5ddd55ba498dfb5f008050c Mon Sep 17 00:00:00 2001 From: Christian Borntraeger Date: Thu, 29 Dec 2011 23:10:26 +0000 Subject: [PATCH 1/2] s390: Rework kernel loading: supports elf and newer kernels This reworks the image loading on s390. Newer kernels will not always have a 0dd0 (basr 13,0) at address 0x10000. We must not rely on specific code at certain addresses. This check was introduced to warn users that tried to load vmlinux, since ELF loading was not supported. Lets wire that up. If elf loading fails, we assume that this is a standard kernel image and load that via load_image_targphys. This patch also changes all other users of load_image to load_image_targphys to be consistent. (the elf loader registers the kernel as rom). Signed-off-by: Christian Borntraeger Signed-off-by: Alexander Graf --- hw/s390-virtio.c | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/hw/s390-virtio.c b/hw/s390-virtio.c index 51123a7535..15e3ef389a 100644 --- a/hw/s390-virtio.c +++ b/hw/s390-virtio.c @@ -224,13 +224,17 @@ static void s390_init(ram_addr_t my_ram_size, s390_add_running_cpu(env); if (kernel_filename) { - kernel_size = load_image(kernel_filename, qemu_get_ram_ptr(0)); - if (lduw_be_phys(KERN_IMAGE_START) != 0x0dd0) { - fprintf(stderr, "Specified image is not an s390 boot image\n"); - exit(1); + kernel_size = load_elf(kernel_filename, NULL, NULL, NULL, NULL, + NULL, 1, ELF_MACHINE, 0); + if (kernel_size == -1UL) { + kernel_size = load_image_targphys(kernel_filename, 0, ram_size); } - + /* + * we can not rely on the ELF entry point, since up to 3.2 this + * value was 0x800 (the SALIPL loader) and it wont work. For + * all (Linux) cases 0x10000 (KERN_IMAGE_START) should be fine. + */ env->psw.addr = KERN_IMAGE_START; env->psw.mask = 0x0000000180000000ULL; } else { @@ -243,7 +247,7 @@ static void s390_init(ram_addr_t my_ram_size, } bios_filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name); - bios_size = load_image(bios_filename, qemu_get_ram_ptr(ZIPL_LOAD_ADDR)); + bios_size = load_image_targphys(bios_filename, ZIPL_LOAD_ADDR, 4096); g_free(bios_filename); if ((long)bios_size < 0) { @@ -263,15 +267,17 @@ static void s390_init(ram_addr_t my_ram_size, while (kernel_size + 0x100000 > initrd_offset) { initrd_offset += 0x100000; } - initrd_size = load_image(initrd_filename, qemu_get_ram_ptr(initrd_offset)); - - stq_be_phys(INITRD_PARM_START, initrd_offset); - stq_be_phys(INITRD_PARM_SIZE, initrd_size); + initrd_size = load_image_targphys(initrd_filename, initrd_offset, + ram_size - initrd_offset); + /* we have to overwrite values in the kernel image, which are "rom" */ + memcpy(rom_ptr(INITRD_PARM_START), &initrd_offset, 8); + memcpy(rom_ptr(INITRD_PARM_SIZE), &initrd_size, 8); } if (kernel_cmdline) { - cpu_physical_memory_write(KERN_PARM_AREA, kernel_cmdline, - strlen(kernel_cmdline) + 1); + /* we have to overwrite values in the kernel image, which are "rom" */ + memcpy(rom_ptr(KERN_PARM_AREA), kernel_cmdline, + strlen(kernel_cmdline) + 1); } /* Create VirtIO network adapters */ From 3208afbe04ad976e038fdb55d11f9f90629a5217 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Llu=C3=ADs=20Vilanova?= Date: Mon, 13 Feb 2012 05:33:45 +0000 Subject: [PATCH 2/2] Move helpers.h to helper.h MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Provides a file naming scheme consistent with other targets. Signed-off-by: LluĂ­s Vilanova Signed-off-by: Alexander Graf --- target-s390x/{helpers.h => helper.h} | 0 target-s390x/op_helper.c | 2 +- target-s390x/translate.c | 4 ++-- 3 files changed, 3 insertions(+), 3 deletions(-) rename target-s390x/{helpers.h => helper.h} (100%) diff --git a/target-s390x/helpers.h b/target-s390x/helper.h similarity index 100% rename from target-s390x/helpers.h rename to target-s390x/helper.h diff --git a/target-s390x/op_helper.c b/target-s390x/op_helper.c index cf26b29ee9..70d98a80df 100644 --- a/target-s390x/op_helper.c +++ b/target-s390x/op_helper.c @@ -21,7 +21,7 @@ #include "cpu.h" #include "dyngen-exec.h" #include "host-utils.h" -#include "helpers.h" +#include "helper.h" #include #include "kvm.h" #include "qemu-timer.h" diff --git a/target-s390x/translate.c b/target-s390x/translate.c index 71f9dcdff5..8fab38cb1d 100644 --- a/target-s390x/translate.c +++ b/target-s390x/translate.c @@ -38,9 +38,9 @@ static TCGv_ptr cpu_env; #include "gen-icount.h" -#include "helpers.h" +#include "helper.h" #define GEN_HELPER 1 -#include "helpers.h" +#include "helper.h" typedef struct DisasContext DisasContext; struct DisasContext {