[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 19/20] s390/bios: Make the s390-ccw.img relocatable
From: |
Christian Borntraeger |
Subject: |
[Qemu-devel] [PULL 19/20] s390/bios: Make the s390-ccw.img relocatable |
Date: |
Tue, 10 Mar 2015 09:38:12 +0100 |
From: Thomas Huth <address@hidden>
The current bios sits at location 0x7e00000 in the guest RAM
and thus prevents loading of bigger ramdisks. By making the
image relocatable we can move it to the end of the RAM so that
it is getting out of the way.
Signed-off-by: Thomas Huth <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Christian Borntraeger <address@hidden>
---
hw/s390x/ipl.c | 23 +++++++++++++++++++++--
pc-bios/s390-ccw/Makefile | 11 ++++++-----
2 files changed, 27 insertions(+), 7 deletions(-)
diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c
index b57adbd..ab7fd8a 100644
--- a/hw/s390x/ipl.c
+++ b/hw/s390x/ipl.c
@@ -14,6 +14,7 @@
#include "sysemu/sysemu.h"
#include "cpu.h"
#include "elf.h"
+#include "exec/ram_addr.h"
#include "hw/loader.h"
#include "hw/sysbus.h"
#include "hw/s390x/virtio-ccw.h"
@@ -95,6 +96,16 @@ static const VMStateDescription vmstate_ipl = {
}
};
+static uint64_t bios_translate_addr(void *opaque, uint64_t srcaddr)
+{
+ uint64_t dstaddr = (uint64_t)opaque;
+ /*
+ * Assuming that our s390-ccw.img was linked for starting at address 0,
+ * we can simply add the destination address for the final location
+ */
+ return srcaddr + dstaddr;
+}
+
static int s390_ipl_init(SysBusDevice *dev)
{
S390IPLState *ipl = S390_IPL(dev);
@@ -109,6 +120,8 @@ static int s390_ipl_init(SysBusDevice *dev)
* even if an external kernel has been defined.
*/
if (!ipl->kernel || ipl->enforce_bios) {
+ uint64_t fwbase = (MIN(ram_size, 0x80000000U) - 0x200000) & ~0xffffUL;
+
if (bios_name == NULL) {
bios_name = ipl->firmware;
}
@@ -118,9 +131,15 @@ static int s390_ipl_init(SysBusDevice *dev)
hw_error("could not find stage1 bootloader\n");
}
- bios_size = load_elf(bios_filename, NULL, NULL, &ipl->bios_start_addr,
+ bios_size = load_elf(bios_filename, bios_translate_addr,
+ (void *)fwbase, &ipl->bios_start_addr,
NULL, NULL, 1, ELF_MACHINE, 0);
- if (bios_size < 0) {
+
+ if (bios_size > 0) {
+ /* Adjust ELF start address to final location */
+ ipl->bios_start_addr += fwbase;
+ } else {
+ /* Try to load non-ELF file (e.g. s390-zipl.rom) */
bios_size = load_image_targphys(bios_filename, ZIPL_IMAGE_START,
4096);
ipl->bios_start_addr = ZIPL_IMAGE_START;
diff --git a/pc-bios/s390-ccw/Makefile b/pc-bios/s390-ccw/Makefile
index ad55a14..009bb8d 100644
--- a/pc-bios/s390-ccw/Makefile
+++ b/pc-bios/s390-ccw/Makefile
@@ -9,10 +9,9 @@ $(call set-vpath, $(SRC_PATH)/pc-bios/s390-ccw)
.PHONY : all clean build-all
-OBJECTS=main.o bootmap.o sclp-ascii.o virtio.o start.o
-CFLAGS += -fno-stack-protector
-# XXX find a more clever to locate the bootloader
-LDFLAGS += -Wl,-Ttext,0x7e00000,-Tbss,0x7f00000 -nostdlib
+OBJECTS = start.o main.o bootmap.o sclp-ascii.o virtio.o
+CFLAGS += -fPIE -fno-stack-protector -ffreestanding
+LDFLAGS += -Wl,-pie -nostdlib
build-all: s390-ccw.img
@@ -20,7 +19,9 @@ s390-ccw.elf: $(OBJECTS)
$(call quiet-command,$(CC) $(LDFLAGS) -o $@ $(OBJECTS)," Building
$(TARGET_DIR)$@")
s390-ccw.img: s390-ccw.elf
- $(call quiet-command,strip $< -o $@," Stripping $(TARGET_DIR)$@")
+ $(call quiet-command,strip --strip-unneeded $< -o $@," Stripping
$(TARGET_DIR)$@")
+
+$(OBJECTS): Makefile
clean:
rm -f *.o *.d *.img *.elf *~
--
2.3.0
- [Qemu-devel] [PULL 20/20] s390-ccw: rebuild BIOS, (continued)
- [Qemu-devel] [PULL 20/20] s390-ccw: rebuild BIOS, Christian Borntraeger, 2015/03/10
- [Qemu-devel] [PULL 11/20] s390x/kvm: enable the new SIGP handling in user space, Christian Borntraeger, 2015/03/10
- [Qemu-devel] [PULL 16/20] s390-ccw.img: Allow bigger ramdisk sizes or offsets, Christian Borntraeger, 2015/03/10
- [Qemu-devel] [PULL 17/20] s390-ccw.img: Reinitialize guessing on reboot, Christian Borntraeger, 2015/03/10
- [Qemu-devel] [PULL 18/20] elf-loader: Provide the possibility to relocate s390 ELF files, Christian Borntraeger, 2015/03/10
- [Qemu-devel] [PULL 03/20] s390x/kvm: more details for SIGP handler with one destination vcpu, Christian Borntraeger, 2015/03/10
- [Qemu-devel] [PULL 09/20] s390x: add function to deliver restart irqs, Christian Borntraeger, 2015/03/10
- [Qemu-devel] [PULL 13/20] virtio-s390: Convert to realize(), Christian Borntraeger, 2015/03/10
- [Qemu-devel] [PULL 07/20] s390x/kvm: implement handling of new SIGP orders, Christian Borntraeger, 2015/03/10
- [Qemu-devel] [PULL 12/20] virtio-s390: s390_virtio_device_init() can't fail, simplify, Christian Borntraeger, 2015/03/10
- [Qemu-devel] [PULL 19/20] s390/bios: Make the s390-ccw.img relocatable,
Christian Borntraeger <=
- [Qemu-devel] [PULL 14/20] virtio-ccw: Convert to realize(), Christian Borntraeger, 2015/03/10
- [Qemu-devel] [PULL 15/20] s390x/kvm: passing max memory size to accelerator, Christian Borntraeger, 2015/03/10
- Re: [Qemu-devel] [PULL 00/20] s390x/kvm: Features and fixes for 2.3, Peter Maydell, 2015/03/10
- Re: [Qemu-devel] [PULL 00/20] s390x/kvm: Features and fixes for 2.3, Christian Borntraeger, 2015/03/10
- Re: [Qemu-devel] [PULL 00/20] s390x/kvm: Features and fixes for 2.3, Markus Armbruster, 2015/03/11
- Re: [Qemu-devel] [PULL 00/20] s390x/kvm: Features and fixes for 2.3, Thomas Huth, 2015/03/11
- Re: [Qemu-devel] [PULL 00/20] s390x/kvm: Features and fixes for 2.3, Christian Borntraeger, 2015/03/11
- Re: [Qemu-devel] [PULL 00/20] s390x/kvm: Features and fixes for 2.3, Thomas Huth, 2015/03/11
- Re: [Qemu-devel] [PULL 00/20] s390x/kvm: Features and fixes for 2.3, Christian Borntraeger, 2015/03/11