* [PATCH 0/7] pc-bios/s390-ccw: Merge the netboot loader into s390-ccw.img
@ 2024-06-21 8:24 Thomas Huth
2024-06-21 8:24 ` [PATCH 1/7] pc-bios/s390-ccw: Remove duplicated LDFLAGS Thomas Huth
` (10 more replies)
0 siblings, 11 replies; 18+ messages in thread
From: Thomas Huth @ 2024-06-21 8:24 UTC (permalink / raw)
To: qemu-s390x, Christian Borntraeger, Jared Rossi
Cc: qemu-devel, Eric Farman, Claudio Imbrenda, Collin L . Walling,
Janosch Frank, Jason J . Herne, Marc Hartmayer
We originally built a separate binary for the netboot code since it
was considered as experimental and we could not be sure that the
necessary SLOF module had been checked out. Time passed, the netboot
code proved its usefulness, and the build system nowadays makes sure
that the SLOF module is checked out if you have a s390x compiler available
for building the s390-ccw bios. In fact, the possibility to build the
s390-ccw.img without s390-netboot.img has been removed in commit
bf6903f6944f ("pc-bios/s390-ccw: always build network bootloader")
already.
So it does not make too much sense anymore to keep the netboot code
in a separate binary. To make it easier to support a more flexible
boot process soon that supports more than one boot device via the
bootindex properties, let's finally merge the netboot code into the
main s390-ccw.img binary now.
Thomas Huth (7):
pc-bios/s390-ccw: Remove duplicated LDFLAGS
hw/s390x/ipl: Provide more memory to the s390-ccw.img firmware
pc-bios/s390-ccw: Use the libc from SLOF for the main s390-ccw.img
binary, too
pc-bios/s390-ccw: Link the netboot code into the main s390-ccw.img
binary
hw/s390x: Remove the possibility to load the s390-netboot.img binary
pc-bios/s390-ccw: Merge netboot.mak into the main Makefile
docs/system/s390x/bootdevices: Update the documentation about network
booting
docs/system/s390x/bootdevices.rst | 20 +++----
pc-bios/s390-ccw/netboot.mak | 62 ---------------------
hw/s390x/ipl.h | 12 ++--
pc-bios/s390-ccw/cio.h | 2 +
pc-bios/s390-ccw/iplb.h | 4 +-
pc-bios/s390-ccw/libc.h | 89 ------------------------------
pc-bios/s390-ccw/s390-ccw.h | 10 +++-
pc-bios/s390-ccw/virtio.h | 1 -
hw/s390x/ipl.c | 65 +++-------------------
hw/s390x/s390-virtio-ccw.c | 10 +---
pc-bios/s390-ccw/bootmap.c | 4 +-
pc-bios/s390-ccw/cio.c | 2 +-
pc-bios/s390-ccw/dasd-ipl.c | 2 +-
pc-bios/s390-ccw/jump2ipl.c | 2 +-
pc-bios/s390-ccw/libc.c | 88 -----------------------------
pc-bios/s390-ccw/main.c | 15 +++--
pc-bios/s390-ccw/menu.c | 25 ++++-----
pc-bios/s390-ccw/netmain.c | 15 +----
pc-bios/s390-ccw/sclp.c | 2 +-
pc-bios/s390-ccw/virtio-blkdev.c | 1 -
pc-bios/s390-ccw/virtio-scsi.c | 2 +-
pc-bios/s390-ccw/virtio.c | 2 +-
pc-bios/meson.build | 1 -
pc-bios/s390-ccw/Makefile | 69 +++++++++++++++++++----
pc-bios/s390-netboot.img | Bin 67232 -> 0 bytes
25 files changed, 122 insertions(+), 383 deletions(-)
delete mode 100644 pc-bios/s390-ccw/netboot.mak
delete mode 100644 pc-bios/s390-ccw/libc.h
delete mode 100644 pc-bios/s390-ccw/libc.c
delete mode 100644 pc-bios/s390-netboot.img
--
2.45.2
^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH 1/7] pc-bios/s390-ccw: Remove duplicated LDFLAGS
2024-06-21 8:24 [PATCH 0/7] pc-bios/s390-ccw: Merge the netboot loader into s390-ccw.img Thomas Huth
@ 2024-06-21 8:24 ` Thomas Huth
2024-06-21 8:24 ` [PATCH 2/7] hw/s390x/ipl: Provide more memory to the s390-ccw.img firmware Thomas Huth
` (9 subsequent siblings)
10 siblings, 0 replies; 18+ messages in thread
From: Thomas Huth @ 2024-06-21 8:24 UTC (permalink / raw)
To: qemu-s390x, Christian Borntraeger, Jared Rossi
Cc: qemu-devel, Eric Farman, Claudio Imbrenda, Collin L . Walling,
Janosch Frank, Jason J . Herne, Marc Hartmayer
The -Wl,-pie and -nostdlib flags are added to LDFLAGS twice. Merge
the two lines to get rid of the duplicates.
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
pc-bios/s390-ccw/Makefile | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/pc-bios/s390-ccw/Makefile b/pc-bios/s390-ccw/Makefile
index acfcd1e71a..6207911b53 100644
--- a/pc-bios/s390-ccw/Makefile
+++ b/pc-bios/s390-ccw/Makefile
@@ -40,7 +40,7 @@ EXTRA_CFLAGS += -ffreestanding -fno-delete-null-pointer-checks -fno-common -fPIE
EXTRA_CFLAGS += -fwrapv -fno-strict-aliasing -fno-asynchronous-unwind-tables
EXTRA_CFLAGS += -msoft-float
EXTRA_CFLAGS += -std=gnu99
-LDFLAGS += -Wl,-pie -nostdlib
+LDFLAGS += -Wl,-pie -nostdlib -z noexecstack
cc-test = $(CC) -Werror $1 -c -o /dev/null -xc /dev/null >/dev/null 2>/dev/null
cc-option = if $(call cc-test, $1); then \
@@ -55,8 +55,6 @@ config-cc.mak: Makefile
$(call cc-option,-march=z900,-march=z10)) 3> config-cc.mak
-include config-cc.mak
-LDFLAGS += -Wl,-pie -nostdlib -z noexecstack
-
build-all: s390-ccw.img s390-netboot.img
s390-ccw.elf: $(OBJECTS)
--
2.45.2
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 2/7] hw/s390x/ipl: Provide more memory to the s390-ccw.img firmware
2024-06-21 8:24 [PATCH 0/7] pc-bios/s390-ccw: Merge the netboot loader into s390-ccw.img Thomas Huth
2024-06-21 8:24 ` [PATCH 1/7] pc-bios/s390-ccw: Remove duplicated LDFLAGS Thomas Huth
@ 2024-06-21 8:24 ` Thomas Huth
2024-06-21 8:24 ` [PATCH 3/7] pc-bios/s390-ccw: Use the libc from SLOF for the main s390-ccw.img binary, too Thomas Huth
` (8 subsequent siblings)
10 siblings, 0 replies; 18+ messages in thread
From: Thomas Huth @ 2024-06-21 8:24 UTC (permalink / raw)
To: qemu-s390x, Christian Borntraeger, Jared Rossi
Cc: qemu-devel, Eric Farman, Claudio Imbrenda, Collin L . Walling,
Janosch Frank, Jason J . Herne, Marc Hartmayer
We are going to link the SLOF libc into the s390-ccw.img, and this
libc needs more memory for providing space for malloc() and friends.
Thus bump the memory size that we reserve for the bios to 3 MiB
instead of only 2 MiB. While we're at it, add a proper check that
there is really enough memory assigned to the machine before blindly
using it.
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
hw/s390x/ipl.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c
index e934bf89d1..9362de0b6f 100644
--- a/hw/s390x/ipl.c
+++ b/hw/s390x/ipl.c
@@ -45,6 +45,7 @@
#define INITRD_PARM_START 0x010408UL
#define PARMFILE_START 0x001000UL
#define ZIPL_IMAGE_START 0x009000UL
+#define BIOS_MAX_SIZE 0x300000UL
#define IPL_PSW_MASK (PSW_MASK_32 | PSW_MASK_64)
static bool iplb_extended_needed(void *opaque)
@@ -144,7 +145,14 @@ static void s390_ipl_realize(DeviceState *dev, Error **errp)
* even if an external kernel has been defined.
*/
if (!ipl->kernel || ipl->enforce_bios) {
- uint64_t fwbase = (MIN(ms->ram_size, 0x80000000U) - 0x200000) & ~0xffffUL;
+ uint64_t fwbase;
+
+ if (ms->ram_size < BIOS_MAX_SIZE) {
+ error_setg(errp, "not enough RAM to load the BIOS file");
+ return;
+ }
+
+ fwbase = (MIN(ms->ram_size, 0x80000000U) - BIOS_MAX_SIZE) & ~0xffffUL;
bios_filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, ipl->firmware);
if (bios_filename == NULL) {
--
2.45.2
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 3/7] pc-bios/s390-ccw: Use the libc from SLOF for the main s390-ccw.img binary, too
2024-06-21 8:24 [PATCH 0/7] pc-bios/s390-ccw: Merge the netboot loader into s390-ccw.img Thomas Huth
2024-06-21 8:24 ` [PATCH 1/7] pc-bios/s390-ccw: Remove duplicated LDFLAGS Thomas Huth
2024-06-21 8:24 ` [PATCH 2/7] hw/s390x/ipl: Provide more memory to the s390-ccw.img firmware Thomas Huth
@ 2024-06-21 8:24 ` Thomas Huth
2024-06-21 8:24 ` [PATCH 4/7] pc-bios/s390-ccw: Link the netboot code into the main s390-ccw.img binary Thomas Huth
` (7 subsequent siblings)
10 siblings, 0 replies; 18+ messages in thread
From: Thomas Huth @ 2024-06-21 8:24 UTC (permalink / raw)
To: qemu-s390x, Christian Borntraeger, Jared Rossi
Cc: qemu-devel, Eric Farman, Claudio Imbrenda, Collin L . Walling,
Janosch Frank, Jason J . Herne, Marc Hartmayer
We are already using the libc from SLOF for the s390-netboot.img, and
this libc implementation is way more complete and accurate than the
simple implementation that we currently use for the s390-ccw.img binary.
Since we are now always assuming that the SLOF submodule is available
when building the s390-ccw bios (see commit bf6903f6944f), we can drop
the simple implementation and use the SLOF libc for the s390-ccw.img
binary, too.
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
pc-bios/s390-ccw/netboot.mak | 3 --
pc-bios/s390-ccw/libc.h | 89 --------------------------------
pc-bios/s390-ccw/s390-ccw.h | 7 +--
pc-bios/s390-ccw/bootmap.c | 2 +-
pc-bios/s390-ccw/cio.c | 2 +-
pc-bios/s390-ccw/dasd-ipl.c | 2 +-
pc-bios/s390-ccw/jump2ipl.c | 2 +-
pc-bios/s390-ccw/libc.c | 88 -------------------------------
pc-bios/s390-ccw/main.c | 5 +-
| 25 ++++-----
pc-bios/s390-ccw/sclp.c | 2 +-
pc-bios/s390-ccw/virtio-blkdev.c | 1 -
pc-bios/s390-ccw/virtio-scsi.c | 2 +-
pc-bios/s390-ccw/virtio.c | 2 +-
pc-bios/s390-ccw/Makefile | 15 ++++--
15 files changed, 34 insertions(+), 213 deletions(-)
delete mode 100644 pc-bios/s390-ccw/libc.h
delete mode 100644 pc-bios/s390-ccw/libc.c
diff --git a/pc-bios/s390-ccw/netboot.mak b/pc-bios/s390-ccw/netboot.mak
index 046aa35587..d2b3d8ee74 100644
--- a/pc-bios/s390-ccw/netboot.mak
+++ b/pc-bios/s390-ccw/netboot.mak
@@ -1,9 +1,6 @@
-SLOF_DIR := $(SRC_PATH)/../../roms/SLOF
-
NETOBJS := start.o sclp.o cio.o virtio.o virtio-net.o jump2ipl.o netmain.o
-LIBC_INC := -nostdinc -I$(SLOF_DIR)/lib/libc/include
LIBNET_INC := -I$(SLOF_DIR)/lib/libnet
NETLDFLAGS := $(LDFLAGS) -Wl,-Ttext=0x7800000
diff --git a/pc-bios/s390-ccw/libc.h b/pc-bios/s390-ccw/libc.h
deleted file mode 100644
index bcdc45732d..0000000000
--- a/pc-bios/s390-ccw/libc.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * libc-style definitions and functions
- *
- * Copyright (c) 2013 Alexander Graf <agraf@suse.de>
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- */
-
-#ifndef S390_CCW_LIBC_H
-#define S390_CCW_LIBC_H
-
-typedef unsigned long size_t;
-typedef int bool;
-typedef unsigned char uint8_t;
-typedef unsigned short uint16_t;
-typedef unsigned int uint32_t;
-typedef unsigned long long uint64_t;
-
-static inline void *memset(void *s, int c, size_t n)
-{
- size_t i;
- unsigned char *p = s;
-
- for (i = 0; i < n; i++) {
- p[i] = c;
- }
-
- return s;
-}
-
-static inline void *memcpy(void *s1, const void *s2, size_t n)
-{
- uint8_t *dest = s1;
- const uint8_t *src = s2;
- size_t i;
-
- for (i = 0; i < n; i++) {
- dest[i] = src[i];
- }
-
- return s1;
-}
-
-static inline int memcmp(const void *s1, const void *s2, size_t n)
-{
- size_t i;
- const uint8_t *p1 = s1, *p2 = s2;
-
- for (i = 0; i < n; i++) {
- if (p1[i] != p2[i]) {
- return p1[i] > p2[i] ? 1 : -1;
- }
- }
-
- return 0;
-}
-
-static inline size_t strlen(const char *str)
-{
- size_t i;
- for (i = 0; *str; i++) {
- str++;
- }
- return i;
-}
-
-static inline char *strcat(char *dest, const char *src)
-{
- int i;
- char *dest_end = dest + strlen(dest);
-
- for (i = 0; i <= strlen(src); i++) {
- dest_end[i] = src[i];
- }
- return dest;
-}
-
-static inline int isdigit(int c)
-{
- return (c >= '0') && (c <= '9');
-}
-
-uint64_t atoui(const char *str);
-char *uitoa(uint64_t num, char *str, size_t len);
-
-#endif
diff --git a/pc-bios/s390-ccw/s390-ccw.h b/pc-bios/s390-ccw/s390-ccw.h
index c977a52b50..b911ebe6d2 100644
--- a/pc-bios/s390-ccw/s390-ccw.h
+++ b/pc-bios/s390-ccw/s390-ccw.h
@@ -13,6 +13,10 @@
/* #define DEBUG */
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdint.h>
+
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;
@@ -26,9 +30,6 @@ typedef unsigned long long u64;
#define EBUSY 2
#define ENODEV 3
-#ifndef NULL
-#define NULL 0
-#endif
#ifndef MIN
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
#endif
diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c
index a2137449dc..bf85a9c5fe 100644
--- a/pc-bios/s390-ccw/bootmap.c
+++ b/pc-bios/s390-ccw/bootmap.c
@@ -8,7 +8,7 @@
* directory.
*/
-#include "libc.h"
+#include <string.h>
#include "s390-ccw.h"
#include "s390-arch.h"
#include "bootmap.h"
diff --git a/pc-bios/s390-ccw/cio.c b/pc-bios/s390-ccw/cio.c
index 83ca27ab41..11f0387ff4 100644
--- a/pc-bios/s390-ccw/cio.c
+++ b/pc-bios/s390-ccw/cio.c
@@ -11,7 +11,7 @@
* directory.
*/
-#include "libc.h"
+#include <string.h>
#include "s390-ccw.h"
#include "s390-arch.h"
#include "helper.h"
diff --git a/pc-bios/s390-ccw/dasd-ipl.c b/pc-bios/s390-ccw/dasd-ipl.c
index 254bb1a15e..6e895abb44 100644
--- a/pc-bios/s390-ccw/dasd-ipl.c
+++ b/pc-bios/s390-ccw/dasd-ipl.c
@@ -8,7 +8,7 @@
* directory.
*/
-#include "libc.h"
+#include <string.h>
#include "s390-ccw.h"
#include "s390-arch.h"
#include "dasd-ipl.h"
diff --git a/pc-bios/s390-ccw/jump2ipl.c b/pc-bios/s390-ccw/jump2ipl.c
index 78f5f46533..6166061045 100644
--- a/pc-bios/s390-ccw/jump2ipl.c
+++ b/pc-bios/s390-ccw/jump2ipl.c
@@ -6,7 +6,7 @@
* directory.
*/
-#include "libc.h"
+#include <string.h>
#include "s390-ccw.h"
#include "s390-arch.h"
diff --git a/pc-bios/s390-ccw/libc.c b/pc-bios/s390-ccw/libc.c
deleted file mode 100644
index 3187923950..0000000000
--- a/pc-bios/s390-ccw/libc.c
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * libc-style definitions and functions
- *
- * Copyright 2018 IBM Corp.
- * Author(s): Collin L. Walling <walling@linux.vnet.ibm.com>
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- */
-
-#include "libc.h"
-#include "s390-ccw.h"
-
-/**
- * atoui:
- * @str: the string to be converted.
- *
- * Given a string @str, convert it to an integer. Leading spaces are
- * ignored. Any other non-numerical value will terminate the conversion
- * and return 0. This function only handles numbers between 0 and
- * UINT64_MAX inclusive.
- *
- * Returns: an integer converted from the string @str, or the number 0
- * if an error occurred.
- */
-uint64_t atoui(const char *str)
-{
- int val = 0;
-
- if (!str || !str[0]) {
- return 0;
- }
-
- while (*str == ' ') {
- str++;
- }
-
- while (*str) {
- if (!isdigit(*(unsigned char *)str)) {
- break;
- }
- val = val * 10 + *str - '0';
- str++;
- }
-
- return val;
-}
-
-/**
- * uitoa:
- * @num: an integer (base 10) to be converted.
- * @str: a pointer to a string to store the conversion.
- * @len: the length of the passed string.
- *
- * Given an integer @num, convert it to a string. The string @str must be
- * allocated beforehand. The resulting string will be null terminated and
- * returned. This function only handles numbers between 0 and UINT64_MAX
- * inclusive.
- *
- * Returns: the string @str of the converted integer @num
- */
-char *uitoa(uint64_t num, char *str, size_t len)
-{
- long num_idx = 1; /* account for NUL */
- uint64_t tmp = num;
-
- IPL_assert(str != NULL, "uitoa: no space allocated to store string");
-
- /* Count indices of num */
- while ((tmp /= 10) != 0) {
- num_idx++;
- }
-
- /* Check if we have enough space for num and NUL */
- IPL_assert(len > num_idx, "uitoa: array too small for conversion");
-
- str[num_idx--] = '\0';
-
- /* Convert int to string */
- while (num_idx >= 0) {
- str[num_idx--] = num % 10 + '0';
- num /= 10;
- }
-
- return str;
-}
diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c
index 5506798098..b8bf9f5fcc 100644
--- a/pc-bios/s390-ccw/main.c
+++ b/pc-bios/s390-ccw/main.c
@@ -8,7 +8,8 @@
* directory.
*/
-#include "libc.h"
+#include <stdlib.h>
+#include <string.h>
#include "helper.h"
#include "s390-arch.h"
#include "s390-ccw.h"
@@ -50,7 +51,7 @@ void write_iplb_location(void)
unsigned int get_loadparm_index(void)
{
- return atoui(loadparm_str);
+ return atoi(loadparm_str);
}
static int is_dev_possibly_bootable(int dev_no, int sch_no)
--git a/pc-bios/s390-ccw/menu.c b/pc-bios/s390-ccw/menu.c
index d601952d3e..eab64f6357 100644
--- a/pc-bios/s390-ccw/menu.c
+++ b/pc-bios/s390-ccw/menu.c
@@ -9,7 +9,10 @@
* directory.
*/
-#include "libc.h"
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
#include "s390-ccw.h"
#include "sclp.h"
#include "s390-time.h"
@@ -140,20 +143,17 @@ static int get_index(void)
}
}
- return atoui(buf);
+ return atoi(buf);
}
static void boot_menu_prompt(bool retry)
{
- char tmp[11];
-
if (retry) {
sclp_print("\nError: undefined configuration"
"\nPlease choose:\n");
} else if (timeout > 0) {
- sclp_print("Please choose (default will boot in ");
- sclp_print(uitoa(timeout / 1000, tmp, sizeof(tmp)));
- sclp_print(" seconds):\n");
+ printf("Please choose (default will boot in %d seconds):\n",
+ (int)(timeout / 1000));
} else {
sclp_print("Please choose:\n");
}
@@ -163,7 +163,6 @@ static int get_boot_index(bool *valid_entries)
{
int boot_index;
bool retry = false;
- char tmp[5];
do {
boot_menu_prompt(retry);
@@ -172,8 +171,7 @@ static int get_boot_index(bool *valid_entries)
} while (boot_index < 0 || boot_index >= MAX_BOOT_ENTRIES ||
!valid_entries[boot_index]);
- sclp_print("\nBooting entry #");
- sclp_print(uitoa(boot_index, tmp, sizeof(tmp)));
+ printf("\nBooting entry #%d", boot_index);
return boot_index;
}
@@ -189,7 +187,7 @@ static int zipl_print_entry(const char *data, size_t len)
sclp_print(buf);
- return buf[0] == ' ' ? atoui(buf + 1) : atoui(buf);
+ return buf[0] == ' ' ? atoi(buf + 1) : atoi(buf);
}
int menu_get_zipl_boot_index(const char *menu_data)
@@ -231,7 +229,6 @@ int menu_get_zipl_boot_index(const char *menu_data)
int menu_get_enum_boot_index(bool *valid_entries)
{
- char tmp[3];
int i;
sclp_print("s390-ccw Enumerated Boot Menu.\n\n");
@@ -241,9 +238,7 @@ int menu_get_enum_boot_index(bool *valid_entries)
if (i < 10) {
sclp_print(" ");
}
- sclp_print("[");
- sclp_print(uitoa(i, tmp, sizeof(tmp)));
- sclp_print("]");
+ printf("[%d]", i);
if (i == 0) {
sclp_print(" default\n");
}
diff --git a/pc-bios/s390-ccw/sclp.c b/pc-bios/s390-ccw/sclp.c
index 7251f9af4d..48b1cc4d16 100644
--- a/pc-bios/s390-ccw/sclp.c
+++ b/pc-bios/s390-ccw/sclp.c
@@ -8,7 +8,7 @@
* directory.
*/
-#include "libc.h"
+#include <string.h>
#include "s390-ccw.h"
#include "sclp.h"
diff --git a/pc-bios/s390-ccw/virtio-blkdev.c b/pc-bios/s390-ccw/virtio-blkdev.c
index a81207b52e..08bb5c1347 100644
--- a/pc-bios/s390-ccw/virtio-blkdev.c
+++ b/pc-bios/s390-ccw/virtio-blkdev.c
@@ -8,7 +8,6 @@
* directory.
*/
-#include "libc.h"
#include "s390-ccw.h"
#include "virtio.h"
#include "virtio-scsi.h"
diff --git a/pc-bios/s390-ccw/virtio-scsi.c b/pc-bios/s390-ccw/virtio-scsi.c
index d1a84b937c..1f24007ab1 100644
--- a/pc-bios/s390-ccw/virtio-scsi.c
+++ b/pc-bios/s390-ccw/virtio-scsi.c
@@ -9,7 +9,7 @@
* directory.
*/
-#include "libc.h"
+#include <string.h>
#include "s390-ccw.h"
#include "virtio.h"
#include "scsi.h"
diff --git a/pc-bios/s390-ccw/virtio.c b/pc-bios/s390-ccw/virtio.c
index 5edd058d88..8c6b0a8a92 100644
--- a/pc-bios/s390-ccw/virtio.c
+++ b/pc-bios/s390-ccw/virtio.c
@@ -8,7 +8,7 @@
* directory.
*/
-#include "libc.h"
+#include <string.h>
#include "s390-ccw.h"
#include "cio.h"
#include "virtio.h"
diff --git a/pc-bios/s390-ccw/Makefile b/pc-bios/s390-ccw/Makefile
index 6207911b53..3f4232636e 100644
--- a/pc-bios/s390-ccw/Makefile
+++ b/pc-bios/s390-ccw/Makefile
@@ -33,13 +33,18 @@ QEMU_DGFLAGS = -MMD -MP -MT $@ -MF $(@D)/$(*F).d
.PHONY : all clean build-all distclean
OBJECTS = start.o main.o bootmap.o jump2ipl.o sclp.o menu.o \
- virtio.o virtio-scsi.o virtio-blkdev.o libc.o cio.o dasd-ipl.o
+ virtio.o virtio-scsi.o virtio-blkdev.o cio.o dasd-ipl.o
+
+SLOF_DIR := $(SRC_PATH)/../../roms/SLOF
+
+LIBC_INC := -nostdinc -I$(SLOF_DIR)/lib/libc/include
EXTRA_CFLAGS += -Wall
EXTRA_CFLAGS += -ffreestanding -fno-delete-null-pointer-checks -fno-common -fPIE
EXTRA_CFLAGS += -fwrapv -fno-strict-aliasing -fno-asynchronous-unwind-tables
EXTRA_CFLAGS += -msoft-float
EXTRA_CFLAGS += -std=gnu99
+EXTRA_CFLAGS += $(LIBC_INC)
LDFLAGS += -Wl,-pie -nostdlib -z noexecstack
cc-test = $(CC) -Werror $1 -c -o /dev/null -xc /dev/null >/dev/null 2>/dev/null
@@ -55,18 +60,18 @@ config-cc.mak: Makefile
$(call cc-option,-march=z900,-march=z10)) 3> config-cc.mak
-include config-cc.mak
+include $(SRC_PATH)/netboot.mak
+
build-all: s390-ccw.img s390-netboot.img
-s390-ccw.elf: $(OBJECTS)
- $(call quiet-command,$(CC) $(LDFLAGS) -o $@ $(OBJECTS),Linking)
+s390-ccw.elf: $(OBJECTS) libc.a
+ $(call quiet-command,$(CC) $(LDFLAGS) -o $@ $^,Linking)
s390-ccw.img: s390-ccw.elf
$(call quiet-command,$(STRIP) --strip-unneeded $< -o $@,Stripping $< into)
$(OBJECTS): Makefile
-include $(SRC_PATH)/netboot.mak
-
ALL_OBJS = $(sort $(OBJECTS) $(NETOBJS) $(LIBCOBJS) $(LIBNETOBJS))
-include $(ALL_OBJS:%.o=%.d)
--
2.45.2
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 4/7] pc-bios/s390-ccw: Link the netboot code into the main s390-ccw.img binary
2024-06-21 8:24 [PATCH 0/7] pc-bios/s390-ccw: Merge the netboot loader into s390-ccw.img Thomas Huth
` (2 preceding siblings ...)
2024-06-21 8:24 ` [PATCH 3/7] pc-bios/s390-ccw: Use the libc from SLOF for the main s390-ccw.img binary, too Thomas Huth
@ 2024-06-21 8:24 ` Thomas Huth
2024-06-21 8:24 ` [PATCH 5/7] hw/s390x: Remove the possibility to load the s390-netboot.img binary Thomas Huth
` (6 subsequent siblings)
10 siblings, 0 replies; 18+ messages in thread
From: Thomas Huth @ 2024-06-21 8:24 UTC (permalink / raw)
To: qemu-s390x, Christian Borntraeger, Jared Rossi
Cc: qemu-devel, Eric Farman, Claudio Imbrenda, Collin L . Walling,
Janosch Frank, Jason J . Herne, Marc Hartmayer
We originally built a separate binary for the netboot code since it
was considered as experimental and we could not be sure that the
necessary SLOF module had been checked out. Time passed, the code
proved its usefulness, and the build system nowadays makes sure that
the SLOF module is checked out if you have a s390x compiler available
for building the s390-ccw bios. So there is no real compelling reason
anymore to keep the netboot code in a separate binary. Linking the
code together with the main s390-ccw.img will make future enhancements
much easier, like supporting more than one boot device.
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
pc-bios/s390-ccw/netboot.mak | 14 --------------
pc-bios/s390-ccw/cio.h | 2 ++
pc-bios/s390-ccw/iplb.h | 4 ++--
pc-bios/s390-ccw/s390-ccw.h | 3 +++
pc-bios/s390-ccw/virtio.h | 1 -
pc-bios/s390-ccw/bootmap.c | 2 +-
pc-bios/s390-ccw/main.c | 10 +++++++---
pc-bios/s390-ccw/netmain.c | 15 ++-------------
pc-bios/s390-ccw/Makefile | 13 +++++++------
9 files changed, 24 insertions(+), 40 deletions(-)
diff --git a/pc-bios/s390-ccw/netboot.mak b/pc-bios/s390-ccw/netboot.mak
index d2b3d8ee74..0a24257ff4 100644
--- a/pc-bios/s390-ccw/netboot.mak
+++ b/pc-bios/s390-ccw/netboot.mak
@@ -1,18 +1,4 @@
-NETOBJS := start.o sclp.o cio.o virtio.o virtio-net.o jump2ipl.o netmain.o
-
-LIBNET_INC := -I$(SLOF_DIR)/lib/libnet
-
-NETLDFLAGS := $(LDFLAGS) -Wl,-Ttext=0x7800000
-
-$(NETOBJS): EXTRA_CFLAGS += $(LIBC_INC) $(LIBNET_INC)
-
-s390-netboot.elf: $(NETOBJS) libnet.a libc.a
- $(call quiet-command,$(CC) $(NETLDFLAGS) -o $@ $^,Linking)
-
-s390-netboot.img: s390-netboot.elf
- $(call quiet-command,$(STRIP) --strip-unneeded $< -o $@,Stripping $< into)
-
# libc files:
LIBC_CFLAGS = $(EXTRA_CFLAGS) $(CFLAGS) $(LIBC_INC) $(LIBNET_INC) \
diff --git a/pc-bios/s390-ccw/cio.h b/pc-bios/s390-ccw/cio.h
index 8b18153deb..6a5e86ba01 100644
--- a/pc-bios/s390-ccw/cio.h
+++ b/pc-bios/s390-ccw/cio.h
@@ -361,6 +361,8 @@ typedef struct CcwSearchIdData {
uint8_t record;
} __attribute__((packed)) CcwSearchIdData;
+extern SubChannelId net_schid;
+
int enable_mss_facility(void);
void enable_subchannel(SubChannelId schid);
uint16_t cu_type(SubChannelId schid);
diff --git a/pc-bios/s390-ccw/iplb.h b/pc-bios/s390-ccw/iplb.h
index cb6ac8a880..3758698468 100644
--- a/pc-bios/s390-ccw/iplb.h
+++ b/pc-bios/s390-ccw/iplb.h
@@ -87,9 +87,9 @@ extern IplParameterBlock iplb __attribute__((__aligned__(PAGE_SIZE)));
struct QemuIplParameters {
uint8_t qipl_flags;
uint8_t reserved1[3];
- uint64_t netboot_start_addr;
+ uint64_t reserved2;
uint32_t boot_menu_timeout;
- uint8_t reserved2[12];
+ uint8_t reserved3[12];
} __attribute__ ((packed));
typedef struct QemuIplParameters QemuIplParameters;
diff --git a/pc-bios/s390-ccw/s390-ccw.h b/pc-bios/s390-ccw/s390-ccw.h
index b911ebe6d2..b960f85b90 100644
--- a/pc-bios/s390-ccw/s390-ccw.h
+++ b/pc-bios/s390-ccw/s390-ccw.h
@@ -54,6 +54,9 @@ void write_iplb_location(void);
unsigned int get_loadparm_index(void);
void main(void);
+/* netmain.c */
+void netmain(void);
+
/* sclp.c */
void sclp_print(const char *string);
void sclp_set_write_mask(uint32_t receive_mask, uint32_t send_mask);
diff --git a/pc-bios/s390-ccw/virtio.h b/pc-bios/s390-ccw/virtio.h
index 85bd9d1695..6f9a558ff5 100644
--- a/pc-bios/s390-ccw/virtio.h
+++ b/pc-bios/s390-ccw/virtio.h
@@ -253,7 +253,6 @@ struct VDev {
uint8_t scsi_dev_heads;
bool scsi_device_selected;
ScsiDevice selected_scsi_device;
- uint64_t netboot_start_addr;
uint32_t max_transfer;
uint32_t guest_features[2];
};
diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c
index bf85a9c5fe..3c56d547ca 100644
--- a/pc-bios/s390-ccw/bootmap.c
+++ b/pc-bios/s390-ccw/bootmap.c
@@ -928,7 +928,7 @@ void zipl_load(void)
}
if (virtio_get_device_type() == VIRTIO_ID_NET) {
- jump_to_IPL_code(vdev->netboot_start_addr);
+ netmain();
}
ipl_scsi();
diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c
index b8bf9f5fcc..558c26c21b 100644
--- a/pc-bios/s390-ccw/main.c
+++ b/pc-bios/s390-ccw/main.c
@@ -37,8 +37,13 @@ LowCore *lowcore; /* Yes, this *is* a pointer to address 0 */
*/
void write_subsystem_identification(void)
{
- lowcore->subchannel_id = blk_schid.sch_id;
- lowcore->subchannel_nr = blk_schid.sch_no;
+ if (cutype == CU_TYPE_VIRTIO && virtio_get_device_type() == VIRTIO_ID_NET) {
+ lowcore->subchannel_id = net_schid.sch_id;
+ lowcore->subchannel_nr = net_schid.sch_no;
+ } else {
+ lowcore->subchannel_id = blk_schid.sch_id;
+ lowcore->subchannel_nr = blk_schid.sch_no;
+ }
lowcore->io_int_parm = 0;
}
@@ -230,7 +235,6 @@ static int virtio_setup(void)
switch (vdev->senseid.cu_model) {
case VIRTIO_ID_NET:
sclp_print("Network boot device detected\n");
- vdev->netboot_start_addr = qipl.netboot_start_addr;
return 0;
case VIRTIO_ID_BLOCK:
ret = virtio_blk_setup_device(blk_schid);
diff --git a/pc-bios/s390-ccw/netmain.c b/pc-bios/s390-ccw/netmain.c
index 5cd619b2d6..99b07f72d9 100644
--- a/pc-bios/s390-ccw/netmain.c
+++ b/pc-bios/s390-ccw/netmain.c
@@ -41,7 +41,6 @@
#define DEFAULT_TFTP_RETRIES 20
extern char _start[];
-void write_iplb_location(void) {}
#define KERNEL_ADDR ((void *)0L)
#define KERNEL_MAX_SIZE ((long)_start)
@@ -50,10 +49,9 @@ void write_iplb_location(void) {}
/* STSI 3.2.2 offset of first vmdb + offset of uuid inside vmdb */
#define STSI322_VMDB_UUID_OFFSET ((8 + 12) * 4)
-IplParameterBlock iplb __attribute__((aligned(PAGE_SIZE)));
static char cfgbuf[2048];
-static SubChannelId net_schid = { .one = 1 };
+SubChannelId net_schid = { .one = 1 };
static uint8_t mac[6];
static uint64_t dest_timer;
@@ -438,15 +436,6 @@ static int net_try_direct_tftp_load(filename_ip_t *fn_ip)
return rc;
}
-void write_subsystem_identification(void)
-{
- SubChannelId *schid = (SubChannelId *) 184;
- uint32_t *zeroes = (uint32_t *) 188;
-
- *schid = net_schid;
- *zeroes = 0;
-}
-
static bool find_net_dev(Schib *schib, int dev_no)
{
int i, r;
@@ -509,7 +498,7 @@ static void virtio_setup(void)
IPL_assert(found, "No virtio net device found");
}
-void main(void)
+void netmain(void)
{
filename_ip_t fn_ip;
int rc, fnlen;
diff --git a/pc-bios/s390-ccw/Makefile b/pc-bios/s390-ccw/Makefile
index 3f4232636e..cf6859823a 100644
--- a/pc-bios/s390-ccw/Makefile
+++ b/pc-bios/s390-ccw/Makefile
@@ -32,19 +32,20 @@ QEMU_DGFLAGS = -MMD -MP -MT $@ -MF $(@D)/$(*F).d
.PHONY : all clean build-all distclean
-OBJECTS = start.o main.o bootmap.o jump2ipl.o sclp.o menu.o \
- virtio.o virtio-scsi.o virtio-blkdev.o cio.o dasd-ipl.o
+OBJECTS = start.o main.o bootmap.o jump2ipl.o sclp.o menu.o netmain.o \
+ virtio.o virtio-net.o virtio-scsi.o virtio-blkdev.o cio.o dasd-ipl.o
SLOF_DIR := $(SRC_PATH)/../../roms/SLOF
LIBC_INC := -nostdinc -I$(SLOF_DIR)/lib/libc/include
+LIBNET_INC := -I$(SLOF_DIR)/lib/libnet
EXTRA_CFLAGS += -Wall
EXTRA_CFLAGS += -ffreestanding -fno-delete-null-pointer-checks -fno-common -fPIE
EXTRA_CFLAGS += -fwrapv -fno-strict-aliasing -fno-asynchronous-unwind-tables
EXTRA_CFLAGS += -msoft-float
EXTRA_CFLAGS += -std=gnu99
-EXTRA_CFLAGS += $(LIBC_INC)
+EXTRA_CFLAGS += $(LIBC_INC) $(LIBNET_INC)
LDFLAGS += -Wl,-pie -nostdlib -z noexecstack
cc-test = $(CC) -Werror $1 -c -o /dev/null -xc /dev/null >/dev/null 2>/dev/null
@@ -62,9 +63,9 @@ config-cc.mak: Makefile
include $(SRC_PATH)/netboot.mak
-build-all: s390-ccw.img s390-netboot.img
+build-all: s390-ccw.img
-s390-ccw.elf: $(OBJECTS) libc.a
+s390-ccw.elf: $(OBJECTS) libnet.a libc.a
$(call quiet-command,$(CC) $(LDFLAGS) -o $@ $^,Linking)
s390-ccw.img: s390-ccw.elf
@@ -72,7 +73,7 @@ s390-ccw.img: s390-ccw.elf
$(OBJECTS): Makefile
-ALL_OBJS = $(sort $(OBJECTS) $(NETOBJS) $(LIBCOBJS) $(LIBNETOBJS))
+ALL_OBJS = $(sort $(OBJECTS) $(LIBCOBJS) $(LIBNETOBJS))
-include $(ALL_OBJS:%.o=%.d)
clean:
--
2.45.2
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 5/7] hw/s390x: Remove the possibility to load the s390-netboot.img binary
2024-06-21 8:24 [PATCH 0/7] pc-bios/s390-ccw: Merge the netboot loader into s390-ccw.img Thomas Huth
` (3 preceding siblings ...)
2024-06-21 8:24 ` [PATCH 4/7] pc-bios/s390-ccw: Link the netboot code into the main s390-ccw.img binary Thomas Huth
@ 2024-06-21 8:24 ` Thomas Huth
2024-06-21 8:24 ` [PATCH 6/7] pc-bios/s390-ccw: Merge netboot.mak into the main Makefile Thomas Huth
` (5 subsequent siblings)
10 siblings, 0 replies; 18+ messages in thread
From: Thomas Huth @ 2024-06-21 8:24 UTC (permalink / raw)
To: qemu-s390x, Christian Borntraeger, Jared Rossi
Cc: qemu-devel, Eric Farman, Claudio Imbrenda, Collin L . Walling,
Janosch Frank, Jason J . Herne, Marc Hartmayer
Since the netboot code has now been merged into the main s390-ccw.img
binary, we don't need the separate s390-netboot.img anymore. Remove
it and the code that was responsible for loading it.
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
hw/s390x/ipl.h | 12 +++-----
hw/s390x/ipl.c | 55 -------------------------------------
hw/s390x/s390-virtio-ccw.c | 10 ++-----
pc-bios/meson.build | 1 -
pc-bios/s390-netboot.img | Bin 67232 -> 0 bytes
5 files changed, 6 insertions(+), 72 deletions(-)
delete mode 100644 pc-bios/s390-netboot.img
diff --git a/hw/s390x/ipl.h b/hw/s390x/ipl.h
index 57cd125769..b2105b616a 100644
--- a/hw/s390x/ipl.h
+++ b/hw/s390x/ipl.h
@@ -134,11 +134,8 @@ void s390_ipl_clear_reset_request(void);
/*
* The QEMU IPL Parameters will be stored at absolute address
* 204 (0xcc) which means it is 32-bit word aligned but not
- * double-word aligned.
- * Placement of data fields in this area must account for
- * their alignment needs. E.g., netboot_start_address must
- * have an offset of 4 + n * 8 bytes within the struct in order
- * to keep it double-word aligned.
+ * double-word aligned. Placement of 64-bit data fields in this
+ * area must account for their alignment needs.
* The total size of the struct must never exceed 28 bytes.
* This definition must be kept in sync with the definition
* in pc-bios/s390-ccw/iplb.h.
@@ -146,9 +143,9 @@ void s390_ipl_clear_reset_request(void);
struct QemuIplParameters {
uint8_t qipl_flags;
uint8_t reserved1[3];
- uint64_t netboot_start_addr;
+ uint64_t reserved2;
uint32_t boot_menu_timeout;
- uint8_t reserved2[12];
+ uint8_t reserved3[12];
} QEMU_PACKED;
typedef struct QemuIplParameters QemuIplParameters;
@@ -178,7 +175,6 @@ struct S390IPLState {
char *initrd;
char *cmdline;
char *firmware;
- char *netboot_fw;
uint8_t cssid;
uint8_t ssid;
uint16_t devno;
diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c
index 9362de0b6f..8a0a3e6961 100644
--- a/hw/s390x/ipl.c
+++ b/hw/s390x/ipl.c
@@ -288,7 +288,6 @@ static Property s390_ipl_properties[] = {
DEFINE_PROP_STRING("initrd", S390IPLState, initrd),
DEFINE_PROP_STRING("cmdline", S390IPLState, cmdline),
DEFINE_PROP_STRING("firmware", S390IPLState, firmware),
- DEFINE_PROP_STRING("netboot_fw", S390IPLState, netboot_fw),
DEFINE_PROP_BOOL("enforce_bios", S390IPLState, enforce_bios, false),
DEFINE_PROP_BOOL("iplbext_migration", S390IPLState, iplbext_migration,
true),
@@ -480,56 +479,6 @@ int s390_ipl_set_loadparm(uint8_t *loadparm)
return -1;
}
-static int load_netboot_image(Error **errp)
-{
- MachineState *ms = MACHINE(qdev_get_machine());
- S390IPLState *ipl = get_ipl_device();
- char *netboot_filename;
- MemoryRegion *sysmem = get_system_memory();
- MemoryRegion *mr = NULL;
- void *ram_ptr = NULL;
- int img_size = -1;
-
- mr = memory_region_find(sysmem, 0, 1).mr;
- if (!mr) {
- error_setg(errp, "Failed to find memory region at address 0");
- return -1;
- }
-
- ram_ptr = memory_region_get_ram_ptr(mr);
- if (!ram_ptr) {
- error_setg(errp, "No RAM found");
- goto unref_mr;
- }
-
- netboot_filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, ipl->netboot_fw);
- if (netboot_filename == NULL) {
- error_setg(errp, "Could not find network bootloader '%s'",
- ipl->netboot_fw);
- goto unref_mr;
- }
-
- img_size = load_elf_ram(netboot_filename, NULL, NULL, NULL,
- &ipl->start_addr,
- NULL, NULL, NULL, 1, EM_S390, 0, 0, NULL,
- false);
-
- if (img_size < 0) {
- img_size = load_image_size(netboot_filename, ram_ptr, ms->ram_size);
- ipl->start_addr = KERN_IMAGE_START;
- }
-
- if (img_size < 0) {
- error_setg(errp, "Failed to load network bootloader");
- }
-
- g_free(netboot_filename);
-
-unref_mr:
- memory_region_unref(mr);
- return img_size;
-}
-
static bool is_virtio_ccw_device_of_type(IplParameterBlock *iplb,
int virtio_id)
{
@@ -754,10 +703,6 @@ void s390_ipl_prepare_cpu(S390CPU *cpu)
ipl->iplb_valid = s390_gen_initial_iplb(ipl);
}
}
- if (ipl->netboot) {
- load_netboot_image(&error_fatal);
- ipl->qipl.netboot_start_addr = cpu_to_be64(ipl->start_addr);
- }
s390_ipl_set_boot_menu(ipl);
s390_ipl_prepare_qipl(cpu);
}
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index 3d0bc3e7f2..779366d551 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -186,11 +186,10 @@ static void s390_memory_init(MemoryRegion *ram)
static void s390_init_ipl_dev(const char *kernel_filename,
const char *kernel_cmdline,
const char *initrd_filename, const char *firmware,
- const char *netboot_fw, bool enforce_bios)
+ bool enforce_bios)
{
Object *new = object_new(TYPE_S390_IPL);
DeviceState *dev = DEVICE(new);
- char *netboot_fw_prop;
if (kernel_filename) {
qdev_prop_set_string(dev, "kernel", kernel_filename);
@@ -201,11 +200,6 @@ static void s390_init_ipl_dev(const char *kernel_filename,
qdev_prop_set_string(dev, "cmdline", kernel_cmdline);
qdev_prop_set_string(dev, "firmware", firmware);
qdev_prop_set_bit(dev, "enforce_bios", enforce_bios);
- netboot_fw_prop = object_property_get_str(new, "netboot_fw", &error_abort);
- if (!strlen(netboot_fw_prop)) {
- qdev_prop_set_string(dev, "netboot_fw", netboot_fw);
- }
- g_free(netboot_fw_prop);
object_property_add_child(qdev_get_machine(), TYPE_S390_IPL,
new);
object_unref(new);
@@ -270,7 +264,7 @@ static void ccw_init(MachineState *machine)
s390_init_ipl_dev(machine->kernel_filename, machine->kernel_cmdline,
machine->initrd_filename,
machine->firmware ?: "s390-ccw.img",
- "s390-netboot.img", true);
+ true);
dev = qdev_new(TYPE_S390_PCI_HOST_BRIDGE);
object_property_add_child(qdev_get_machine(), TYPE_S390_PCI_HOST_BRIDGE,
diff --git a/pc-bios/meson.build b/pc-bios/meson.build
index 0760612bea..3d2e367d31 100644
--- a/pc-bios/meson.build
+++ b/pc-bios/meson.build
@@ -64,7 +64,6 @@ blobs = [
'kvmvapic.bin',
'pvh.bin',
's390-ccw.img',
- 's390-netboot.img',
'slof.bin',
'skiboot.lid',
'palcode-clipper',
diff --git a/pc-bios/s390-netboot.img b/pc-bios/s390-netboot.img
deleted file mode 100644
index 6908e49f06801808b826d3a01f88132cf1b2f57c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 67232
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
ba_Yxv8Q%DF#((bPsWNoHC+0@D`RV@w*b1Nq
--
2.45.2
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 6/7] pc-bios/s390-ccw: Merge netboot.mak into the main Makefile
2024-06-21 8:24 [PATCH 0/7] pc-bios/s390-ccw: Merge the netboot loader into s390-ccw.img Thomas Huth
` (4 preceding siblings ...)
2024-06-21 8:24 ` [PATCH 5/7] hw/s390x: Remove the possibility to load the s390-netboot.img binary Thomas Huth
@ 2024-06-21 8:24 ` Thomas Huth
2024-06-21 8:24 ` [PATCH 7/7] docs/system/s390x/bootdevices: Update the documentation about network booting Thomas Huth
` (4 subsequent siblings)
10 siblings, 0 replies; 18+ messages in thread
From: Thomas Huth @ 2024-06-21 8:24 UTC (permalink / raw)
To: qemu-s390x, Christian Borntraeger, Jared Rossi
Cc: qemu-devel, Eric Farman, Claudio Imbrenda, Collin L . Walling,
Janosch Frank, Jason J . Herne, Marc Hartmayer
Now that the netboot code has been merged into the main s390-ccw.img,
it also does not make sense to keep the build rules in a separate
file. Thus let's merge netboot.mak into the main Makefile.
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
pc-bios/s390-ccw/netboot.mak | 45 ----------------------------------
pc-bios/s390-ccw/Makefile | 47 +++++++++++++++++++++++++++++++++++-
2 files changed, 46 insertions(+), 46 deletions(-)
delete mode 100644 pc-bios/s390-ccw/netboot.mak
diff --git a/pc-bios/s390-ccw/netboot.mak b/pc-bios/s390-ccw/netboot.mak
deleted file mode 100644
index 0a24257ff4..0000000000
--- a/pc-bios/s390-ccw/netboot.mak
+++ /dev/null
@@ -1,45 +0,0 @@
-
-# libc files:
-
-LIBC_CFLAGS = $(EXTRA_CFLAGS) $(CFLAGS) $(LIBC_INC) $(LIBNET_INC) \
- -MMD -MP -MT $@ -MF $(@:%.o=%.d)
-
-CTYPE_OBJS = isdigit.o isxdigit.o toupper.o
-%.o : $(SLOF_DIR)/lib/libc/ctype/%.c
- $(call quiet-command,$(CC) $(LIBC_CFLAGS) -c -o $@ $<,Compiling)
-
-STRING_OBJS = strcat.o strchr.o strrchr.o strcpy.o strlen.o strncpy.o \
- strcmp.o strncmp.o strcasecmp.o strncasecmp.o strstr.o \
- memset.o memcpy.o memmove.o memcmp.o
-%.o : $(SLOF_DIR)/lib/libc/string/%.c
- $(call quiet-command,$(CC) $(LIBC_CFLAGS) -c -o $@ $<,Compiling)
-
-STDLIB_OBJS = atoi.o atol.o strtoul.o strtol.o rand.o malloc.o free.o
-%.o : $(SLOF_DIR)/lib/libc/stdlib/%.c
- $(call quiet-command,$(CC) $(LIBC_CFLAGS) -c -o $@ $<,Compiling)
-
-STDIO_OBJS = sprintf.o snprintf.o vfprintf.o vsnprintf.o vsprintf.o fprintf.o \
- printf.o putc.o puts.o putchar.o stdchnls.o fileno.o
-%.o : $(SLOF_DIR)/lib/libc/stdio/%.c
- $(call quiet-command,$(CC) $(LIBC_CFLAGS) -c -o $@ $<,Compiling)
-
-sbrk.o: $(SLOF_DIR)/slof/sbrk.c
- $(call quiet-command,$(CC) $(LIBC_CFLAGS) -c -o $@ $<,Compiling)
-
-LIBCOBJS := $(STRING_OBJS) $(CTYPE_OBJS) $(STDLIB_OBJS) $(STDIO_OBJS) sbrk.o
-
-libc.a: $(LIBCOBJS)
- $(call quiet-command,$(AR) -rc $@ $^,Creating static library)
-
-# libnet files:
-
-LIBNETOBJS := args.o dhcp.o dns.o icmpv6.o ipv6.o tcp.o udp.o bootp.o \
- dhcpv6.o ethernet.o ipv4.o ndp.o tftp.o pxelinux.o
-LIBNETCFLAGS = $(EXTRA_CFLAGS) $(CFLAGS) $(LIBC_INC) $(LIBNET_INC) \
- -DDHCPARCH=0x1F -MMD -MP -MT $@ -MF $(@:%.o=%.d)
-
-%.o : $(SLOF_DIR)/lib/libnet/%.c
- $(call quiet-command,$(CC) $(LIBNETCFLAGS) -c -o $@ $<,Compiling)
-
-libnet.a: $(LIBNETOBJS)
- $(call quiet-command,$(AR) -rc $@ $^,Creating static library)
diff --git a/pc-bios/s390-ccw/Makefile b/pc-bios/s390-ccw/Makefile
index cf6859823a..27cbb354af 100644
--- a/pc-bios/s390-ccw/Makefile
+++ b/pc-bios/s390-ccw/Makefile
@@ -61,7 +61,52 @@ config-cc.mak: Makefile
$(call cc-option,-march=z900,-march=z10)) 3> config-cc.mak
-include config-cc.mak
-include $(SRC_PATH)/netboot.mak
+# libc files:
+
+LIBC_CFLAGS = $(EXTRA_CFLAGS) $(CFLAGS) $(LIBC_INC) $(LIBNET_INC) \
+ -MMD -MP -MT $@ -MF $(@:%.o=%.d)
+
+CTYPE_OBJS = isdigit.o isxdigit.o toupper.o
+%.o : $(SLOF_DIR)/lib/libc/ctype/%.c
+ $(call quiet-command,$(CC) $(LIBC_CFLAGS) -c -o $@ $<,Compiling)
+
+STRING_OBJS = strcat.o strchr.o strrchr.o strcpy.o strlen.o strncpy.o \
+ strcmp.o strncmp.o strcasecmp.o strncasecmp.o strstr.o \
+ memset.o memcpy.o memmove.o memcmp.o
+%.o : $(SLOF_DIR)/lib/libc/string/%.c
+ $(call quiet-command,$(CC) $(LIBC_CFLAGS) -c -o $@ $<,Compiling)
+
+STDLIB_OBJS = atoi.o atol.o strtoul.o strtol.o rand.o malloc.o free.o
+%.o : $(SLOF_DIR)/lib/libc/stdlib/%.c
+ $(call quiet-command,$(CC) $(LIBC_CFLAGS) -c -o $@ $<,Compiling)
+
+STDIO_OBJS = sprintf.o snprintf.o vfprintf.o vsnprintf.o vsprintf.o fprintf.o \
+ printf.o putc.o puts.o putchar.o stdchnls.o fileno.o
+%.o : $(SLOF_DIR)/lib/libc/stdio/%.c
+ $(call quiet-command,$(CC) $(LIBC_CFLAGS) -c -o $@ $<,Compiling)
+
+sbrk.o: $(SLOF_DIR)/slof/sbrk.c
+ $(call quiet-command,$(CC) $(LIBC_CFLAGS) -c -o $@ $<,Compiling)
+
+LIBCOBJS := $(STRING_OBJS) $(CTYPE_OBJS) $(STDLIB_OBJS) $(STDIO_OBJS) sbrk.o
+
+libc.a: $(LIBCOBJS)
+ $(call quiet-command,$(AR) -rc $@ $^,Creating static library)
+
+# libnet files:
+
+LIBNETOBJS := args.o dhcp.o dns.o icmpv6.o ipv6.o tcp.o udp.o bootp.o \
+ dhcpv6.o ethernet.o ipv4.o ndp.o tftp.o pxelinux.o
+LIBNETCFLAGS = $(EXTRA_CFLAGS) $(CFLAGS) $(LIBC_INC) $(LIBNET_INC) \
+ -DDHCPARCH=0x1F -MMD -MP -MT $@ -MF $(@:%.o=%.d)
+
+%.o : $(SLOF_DIR)/lib/libnet/%.c
+ $(call quiet-command,$(CC) $(LIBNETCFLAGS) -c -o $@ $<,Compiling)
+
+libnet.a: $(LIBNETOBJS)
+ $(call quiet-command,$(AR) -rc $@ $^,Creating static library)
+
+# Main targets:
build-all: s390-ccw.img
--
2.45.2
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 7/7] docs/system/s390x/bootdevices: Update the documentation about network booting
2024-06-21 8:24 [PATCH 0/7] pc-bios/s390-ccw: Merge the netboot loader into s390-ccw.img Thomas Huth
` (5 preceding siblings ...)
2024-06-21 8:24 ` [PATCH 6/7] pc-bios/s390-ccw: Merge netboot.mak into the main Makefile Thomas Huth
@ 2024-06-21 8:24 ` Thomas Huth
2024-06-21 9:39 ` [PATCH 0/7] pc-bios/s390-ccw: Merge the netboot loader into s390-ccw.img Christian Borntraeger
` (3 subsequent siblings)
10 siblings, 0 replies; 18+ messages in thread
From: Thomas Huth @ 2024-06-21 8:24 UTC (permalink / raw)
To: qemu-s390x, Christian Borntraeger, Jared Rossi
Cc: qemu-devel, Eric Farman, Claudio Imbrenda, Collin L . Walling,
Janosch Frank, Jason J . Herne, Marc Hartmayer
Remove the information about the separate s390-netboot.img from
the documentation.
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
docs/system/s390x/bootdevices.rst | 20 +++++++-------------
1 file changed, 7 insertions(+), 13 deletions(-)
diff --git a/docs/system/s390x/bootdevices.rst b/docs/system/s390x/bootdevices.rst
index 1a7a18b43b..c97efb8fc0 100644
--- a/docs/system/s390x/bootdevices.rst
+++ b/docs/system/s390x/bootdevices.rst
@@ -82,23 +82,17 @@ Note that ``0`` can be used to boot the default entry.
Booting from a network device
-----------------------------
-Beside the normal guest firmware (which is loaded from the file ``s390-ccw.img``
-in the data directory of QEMU, or via the ``-bios`` option), QEMU ships with
-a small TFTP network bootloader firmware for virtio-net-ccw devices, too. This
-firmware is loaded from a file called ``s390-netboot.img`` in the QEMU data
-directory. In case you want to load it from a different filename instead,
-you can specify it via the ``-global s390-ipl.netboot_fw=filename``
-command line option.
-
-The ``bootindex`` property is especially important for booting via the network.
-If you don't specify the ``bootindex`` property here, the network bootloader
-firmware code won't get loaded into the guest memory so that the network boot
-will fail. For a successful network boot, try something like this::
+The firmware that ships with QEMU includes a small TFTP network bootloader
+for virtio-net-ccw devices. The ``bootindex`` property is especially
+important for booting via the network. If you don't specify the ``bootindex``
+property here, the network bootloader won't be taken into consideration and
+the network boot will fail. For a successful network boot, try something
+like this::
qemu-system-s390x -netdev user,id=n1,tftp=...,bootfile=... \
-device virtio-net-ccw,netdev=n1,bootindex=1
-The network bootloader firmware also has basic support for pxelinux.cfg-style
+The network bootloader also has basic support for pxelinux.cfg-style
configuration files. See the `PXELINUX Configuration page
<https://wiki.syslinux.org/wiki/index.php?title=PXELINUX#Configuration>`__
for details how to set up the configuration file on your TFTP server.
--
2.45.2
^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH 0/7] pc-bios/s390-ccw: Merge the netboot loader into s390-ccw.img
2024-06-21 8:24 [PATCH 0/7] pc-bios/s390-ccw: Merge the netboot loader into s390-ccw.img Thomas Huth
` (6 preceding siblings ...)
2024-06-21 8:24 ` [PATCH 7/7] docs/system/s390x/bootdevices: Update the documentation about network booting Thomas Huth
@ 2024-06-21 9:39 ` Christian Borntraeger
2024-06-21 9:41 ` Thomas Huth
2024-06-21 20:51 ` Eric Farman
` (2 subsequent siblings)
10 siblings, 1 reply; 18+ messages in thread
From: Christian Borntraeger @ 2024-06-21 9:39 UTC (permalink / raw)
To: Thomas Huth, qemu-s390x, Jared Rossi
Cc: qemu-devel, Eric Farman, Claudio Imbrenda, Collin L . Walling,
Janosch Frank, Jason J . Herne, Marc Hartmayer
[...]
> docs/system/s390x/bootdevices.rst | 20 +++----
> pc-bios/s390-ccw/netboot.mak | 62 ---------------------
> hw/s390x/ipl.h | 12 ++--
> pc-bios/s390-ccw/cio.h | 2 +
> pc-bios/s390-ccw/iplb.h | 4 +-
> pc-bios/s390-ccw/libc.h | 89 ------------------------------
> pc-bios/s390-ccw/s390-ccw.h | 10 +++-
> pc-bios/s390-ccw/virtio.h | 1 -
> hw/s390x/ipl.c | 65 +++-------------------
> hw/s390x/s390-virtio-ccw.c | 10 +---
> pc-bios/s390-ccw/bootmap.c | 4 +-
> pc-bios/s390-ccw/cio.c | 2 +-
> pc-bios/s390-ccw/dasd-ipl.c | 2 +-
> pc-bios/s390-ccw/jump2ipl.c | 2 +-
> pc-bios/s390-ccw/libc.c | 88 -----------------------------
> pc-bios/s390-ccw/main.c | 15 +++--
> pc-bios/s390-ccw/menu.c | 25 ++++-----
> pc-bios/s390-ccw/netmain.c | 15 +----
> pc-bios/s390-ccw/sclp.c | 2 +-
> pc-bios/s390-ccw/virtio-blkdev.c | 1 -
> pc-bios/s390-ccw/virtio-scsi.c | 2 +-
> pc-bios/s390-ccw/virtio.c | 2 +-
> pc-bios/meson.build | 1 -
> pc-bios/s390-ccw/Makefile | 69 +++++++++++++++++++----
> pc-bios/s390-netboot.img | Bin 67232 -> 0 bytes
Shouldnt you also update the s390-ccw.img file?
> 25 files changed, 122 insertions(+), 383 deletions(-)
> delete mode 100644 pc-bios/s390-ccw/netboot.mak
> delete mode 100644 pc-bios/s390-ccw/libc.h
> delete mode 100644 pc-bios/s390-ccw/libc.c
> delete mode 100644 pc-bios/s390-netboot.img
>
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 0/7] pc-bios/s390-ccw: Merge the netboot loader into s390-ccw.img
2024-06-21 9:39 ` [PATCH 0/7] pc-bios/s390-ccw: Merge the netboot loader into s390-ccw.img Christian Borntraeger
@ 2024-06-21 9:41 ` Thomas Huth
0 siblings, 0 replies; 18+ messages in thread
From: Thomas Huth @ 2024-06-21 9:41 UTC (permalink / raw)
To: Christian Borntraeger, qemu-s390x, Jared Rossi
Cc: qemu-devel, Eric Farman, Claudio Imbrenda, Collin L . Walling,
Janosch Frank, Jason J . Herne, Marc Hartmayer
On 21/06/2024 11.39, Christian Borntraeger wrote:
> [...]
>> docs/system/s390x/bootdevices.rst | 20 +++----
>> pc-bios/s390-ccw/netboot.mak | 62 ---------------------
>> hw/s390x/ipl.h | 12 ++--
>> pc-bios/s390-ccw/cio.h | 2 +
>> pc-bios/s390-ccw/iplb.h | 4 +-
>> pc-bios/s390-ccw/libc.h | 89 ------------------------------
>> pc-bios/s390-ccw/s390-ccw.h | 10 +++-
>> pc-bios/s390-ccw/virtio.h | 1 -
>> hw/s390x/ipl.c | 65 +++-------------------
>> hw/s390x/s390-virtio-ccw.c | 10 +---
>> pc-bios/s390-ccw/bootmap.c | 4 +-
>> pc-bios/s390-ccw/cio.c | 2 +-
>> pc-bios/s390-ccw/dasd-ipl.c | 2 +-
>> pc-bios/s390-ccw/jump2ipl.c | 2 +-
>> pc-bios/s390-ccw/libc.c | 88 -----------------------------
>> pc-bios/s390-ccw/main.c | 15 +++--
>> pc-bios/s390-ccw/menu.c | 25 ++++-----
>> pc-bios/s390-ccw/netmain.c | 15 +----
>> pc-bios/s390-ccw/sclp.c | 2 +-
>> pc-bios/s390-ccw/virtio-blkdev.c | 1 -
>> pc-bios/s390-ccw/virtio-scsi.c | 2 +-
>> pc-bios/s390-ccw/virtio.c | 2 +-
>> pc-bios/meson.build | 1 -
>> pc-bios/s390-ccw/Makefile | 69 +++++++++++++++++++----
>> pc-bios/s390-netboot.img | Bin 67232 -> 0 bytes
>
> Shouldnt you also update the s390-ccw.img file?
Sure, but I didn't want to spam the mailing list with a binary blob as long
as this is not final yet (not sure whether we want to commit this separately
or wait 'til Jared finished his series, too). Sorry, I should have mentioned
it in the cover letter.
Thomas
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 0/7] pc-bios/s390-ccw: Merge the netboot loader into s390-ccw.img
2024-06-21 8:24 [PATCH 0/7] pc-bios/s390-ccw: Merge the netboot loader into s390-ccw.img Thomas Huth
` (7 preceding siblings ...)
2024-06-21 9:39 ` [PATCH 0/7] pc-bios/s390-ccw: Merge the netboot loader into s390-ccw.img Christian Borntraeger
@ 2024-06-21 20:51 ` Eric Farman
2024-06-24 5:55 ` Thomas Huth
2024-06-24 0:35 ` Jared Rossi
2024-08-26 17:07 ` Jared Rossi
10 siblings, 1 reply; 18+ messages in thread
From: Eric Farman @ 2024-06-21 20:51 UTC (permalink / raw)
To: Thomas Huth, qemu-s390x, Christian Borntraeger, Jared Rossi
Cc: qemu-devel, Claudio Imbrenda, Collin L . Walling, Janosch Frank,
Jason J . Herne, Marc Hartmayer
On Fri, 2024-06-21 at 10:24 +0200, Thomas Huth wrote:
> We originally built a separate binary for the netboot code since it
> was considered as experimental and we could not be sure that the
> necessary SLOF module had been checked out. Time passed, the netboot
> code proved its usefulness, and the build system nowadays makes sure
> that the SLOF module is checked out if you have a s390x compiler
> available
> for building the s390-ccw bios. In fact, the possibility to build the
> s390-ccw.img without s390-netboot.img has been removed in commit
> bf6903f6944f ("pc-bios/s390-ccw: always build network bootloader")
> already.
>
> So it does not make too much sense anymore to keep the netboot code
> in a separate binary. To make it easier to support a more flexible
> boot process soon that supports more than one boot device via the
> bootindex properties, let's finally merge the netboot code into the
> main s390-ccw.img binary now.
Hi Thomas,
I find myself wondering about the side effects of the
s/sclp_print/printf/ changes, but I haven't come up with anything I can
put my finger on. Maybe something will come to me over the weekend, but
all-in-all I like the looks of this. So, FWIW:
Reviewed-by: Eric Farman <farman@linux.ibm.com>
>
> Thomas Huth (7):
> pc-bios/s390-ccw: Remove duplicated LDFLAGS
> hw/s390x/ipl: Provide more memory to the s390-ccw.img firmware
> pc-bios/s390-ccw: Use the libc from SLOF for the main s390-ccw.img
> binary, too
> pc-bios/s390-ccw: Link the netboot code into the main s390-ccw.img
> binary
> hw/s390x: Remove the possibility to load the s390-netboot.img
> binary
> pc-bios/s390-ccw: Merge netboot.mak into the main Makefile
> docs/system/s390x/bootdevices: Update the documentation about
> network
> booting
>
> docs/system/s390x/bootdevices.rst | 20 +++----
> pc-bios/s390-ccw/netboot.mak | 62 ---------------------
> hw/s390x/ipl.h | 12 ++--
> pc-bios/s390-ccw/cio.h | 2 +
> pc-bios/s390-ccw/iplb.h | 4 +-
> pc-bios/s390-ccw/libc.h | 89 ----------------------------
> --
> pc-bios/s390-ccw/s390-ccw.h | 10 +++-
> pc-bios/s390-ccw/virtio.h | 1 -
> hw/s390x/ipl.c | 65 +++-------------------
> hw/s390x/s390-virtio-ccw.c | 10 +---
> pc-bios/s390-ccw/bootmap.c | 4 +-
> pc-bios/s390-ccw/cio.c | 2 +-
> pc-bios/s390-ccw/dasd-ipl.c | 2 +-
> pc-bios/s390-ccw/jump2ipl.c | 2 +-
> pc-bios/s390-ccw/libc.c | 88 ----------------------------
> -
> pc-bios/s390-ccw/main.c | 15 +++--
> pc-bios/s390-ccw/menu.c | 25 ++++-----
> pc-bios/s390-ccw/netmain.c | 15 +----
> pc-bios/s390-ccw/sclp.c | 2 +-
> pc-bios/s390-ccw/virtio-blkdev.c | 1 -
> pc-bios/s390-ccw/virtio-scsi.c | 2 +-
> pc-bios/s390-ccw/virtio.c | 2 +-
> pc-bios/meson.build | 1 -
> pc-bios/s390-ccw/Makefile | 69 +++++++++++++++++++----
> pc-bios/s390-netboot.img | Bin 67232 -> 0 bytes
> 25 files changed, 122 insertions(+), 383 deletions(-)
> delete mode 100644 pc-bios/s390-ccw/netboot.mak
> delete mode 100644 pc-bios/s390-ccw/libc.h
> delete mode 100644 pc-bios/s390-ccw/libc.c
> delete mode 100644 pc-bios/s390-netboot.img
>
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 0/7] pc-bios/s390-ccw: Merge the netboot loader into s390-ccw.img
2024-06-21 8:24 [PATCH 0/7] pc-bios/s390-ccw: Merge the netboot loader into s390-ccw.img Thomas Huth
` (8 preceding siblings ...)
2024-06-21 20:51 ` Eric Farman
@ 2024-06-24 0:35 ` Jared Rossi
2024-08-26 17:07 ` Jared Rossi
10 siblings, 0 replies; 18+ messages in thread
From: Jared Rossi @ 2024-06-24 0:35 UTC (permalink / raw)
To: Thomas Huth, qemu-s390x, Christian Borntraeger
Cc: qemu-devel, Eric Farman, Claudio Imbrenda, Collin L . Walling,
Janosch Frank, Jason J . Herne, Marc Hartmayer
On 6/21/24 4:24 AM, Thomas Huth wrote:
> We originally built a separate binary for the netboot code since it
> was considered as experimental and we could not be sure that the
> necessary SLOF module had been checked out. Time passed, the netboot
> code proved its usefulness, and the build system nowadays makes sure
> that the SLOF module is checked out if you have a s390x compiler available
> for building the s390-ccw bios. In fact, the possibility to build the
> s390-ccw.img without s390-netboot.img has been removed in commit
> bf6903f6944f ("pc-bios/s390-ccw: always build network bootloader")
> already.
>
> So it does not make too much sense anymore to keep the netboot code
> in a separate binary. To make it easier to support a more flexible
> boot process soon that supports more than one boot device via the
> bootindex properties, let's finally merge the netboot code into the
> main s390-ccw.img binary now.
Hi Thomas, One area that could possibly be cleaned up further are places
where net devices are treated as corner cases due to the separate
bootloader. Off the top of my head I know in pc-bios main.c, the
is_dev_possibly_bootable() function rejects net devices for this reason.
I'm not sure if that is the only place though. Otherwise it looks good
to me. I can work on a v2 of the boot order support that assumes the
network bootloader is integrated. Regards, Jared Rossi
>
> Thomas Huth (7):
> pc-bios/s390-ccw: Remove duplicated LDFLAGS
> hw/s390x/ipl: Provide more memory to the s390-ccw.img firmware
> pc-bios/s390-ccw: Use the libc from SLOF for the main s390-ccw.img
> binary, too
> pc-bios/s390-ccw: Link the netboot code into the main s390-ccw.img
> binary
> hw/s390x: Remove the possibility to load the s390-netboot.img binary
> pc-bios/s390-ccw: Merge netboot.mak into the main Makefile
> docs/system/s390x/bootdevices: Update the documentation about network
> booting
>
> docs/system/s390x/bootdevices.rst | 20 +++----
> pc-bios/s390-ccw/netboot.mak | 62 ---------------------
> hw/s390x/ipl.h | 12 ++--
> pc-bios/s390-ccw/cio.h | 2 +
> pc-bios/s390-ccw/iplb.h | 4 +-
> pc-bios/s390-ccw/libc.h | 89 ------------------------------
> pc-bios/s390-ccw/s390-ccw.h | 10 +++-
> pc-bios/s390-ccw/virtio.h | 1 -
> hw/s390x/ipl.c | 65 +++-------------------
> hw/s390x/s390-virtio-ccw.c | 10 +---
> pc-bios/s390-ccw/bootmap.c | 4 +-
> pc-bios/s390-ccw/cio.c | 2 +-
> pc-bios/s390-ccw/dasd-ipl.c | 2 +-
> pc-bios/s390-ccw/jump2ipl.c | 2 +-
> pc-bios/s390-ccw/libc.c | 88 -----------------------------
> pc-bios/s390-ccw/main.c | 15 +++--
> pc-bios/s390-ccw/menu.c | 25 ++++-----
> pc-bios/s390-ccw/netmain.c | 15 +----
> pc-bios/s390-ccw/sclp.c | 2 +-
> pc-bios/s390-ccw/virtio-blkdev.c | 1 -
> pc-bios/s390-ccw/virtio-scsi.c | 2 +-
> pc-bios/s390-ccw/virtio.c | 2 +-
> pc-bios/meson.build | 1 -
> pc-bios/s390-ccw/Makefile | 69 +++++++++++++++++++----
> pc-bios/s390-netboot.img | Bin 67232 -> 0 bytes
> 25 files changed, 122 insertions(+), 383 deletions(-)
> delete mode 100644 pc-bios/s390-ccw/netboot.mak
> delete mode 100644 pc-bios/s390-ccw/libc.h
> delete mode 100644 pc-bios/s390-ccw/libc.c
> delete mode 100644 pc-bios/s390-netboot.img
>
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 0/7] pc-bios/s390-ccw: Merge the netboot loader into s390-ccw.img
2024-06-21 20:51 ` Eric Farman
@ 2024-06-24 5:55 ` Thomas Huth
2024-06-28 18:01 ` Jared Rossi
0 siblings, 1 reply; 18+ messages in thread
From: Thomas Huth @ 2024-06-24 5:55 UTC (permalink / raw)
To: Eric Farman, qemu-s390x, Christian Borntraeger, Jared Rossi
Cc: qemu-devel, Claudio Imbrenda, Collin L . Walling, Janosch Frank,
Jason J . Herne, Marc Hartmayer
On 21/06/2024 22.51, Eric Farman wrote:
> On Fri, 2024-06-21 at 10:24 +0200, Thomas Huth wrote:
>> We originally built a separate binary for the netboot code since it
>> was considered as experimental and we could not be sure that the
>> necessary SLOF module had been checked out. Time passed, the netboot
>> code proved its usefulness, and the build system nowadays makes sure
>> that the SLOF module is checked out if you have a s390x compiler
>> available
>> for building the s390-ccw bios. In fact, the possibility to build the
>> s390-ccw.img without s390-netboot.img has been removed in commit
>> bf6903f6944f ("pc-bios/s390-ccw: always build network bootloader")
>> already.
>>
>> So it does not make too much sense anymore to keep the netboot code
>> in a separate binary. To make it easier to support a more flexible
>> boot process soon that supports more than one boot device via the
>> bootindex properties, let's finally merge the netboot code into the
>> main s390-ccw.img binary now.
>
> Hi Thomas,
>
> I find myself wondering about the side effects of the
> s/sclp_print/printf/ changes, but I haven't come up with anything I can
> put my finger on. Maybe something will come to me over the weekend, but
> all-in-all I like the looks of this.
I think it should be fine, both functions are basically just a wrapper
around the write() function in sclp.c, with sclp_print() being rather dumb
while printf() is doing the usual string formatting before writing it out. I
think in the long run, it would be nice to get rid of sclp_print() and
replace it by puts() or printf() in the whole code, but doing that right now
would likely cause quite some conflicts for Jared with his patch series, so
I'd rather postpone that to a later point in time.
> Reviewed-by: Eric Farman <farman@linux.ibm.com>
Thanks!
Thomas
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 0/7] pc-bios/s390-ccw: Merge the netboot loader into s390-ccw.img
2024-06-24 5:55 ` Thomas Huth
@ 2024-06-28 18:01 ` Jared Rossi
2024-07-01 8:01 ` Thomas Huth
0 siblings, 1 reply; 18+ messages in thread
From: Jared Rossi @ 2024-06-28 18:01 UTC (permalink / raw)
To: Thomas Huth, qemu-s390x
Cc: qemu-devel, Claudio Imbrenda, Collin L . Walling, Janosch Frank,
Jason J . Herne, Marc Hartmayer, Eric Farman,
Christian Borntraeger
On 6/24/24 1:55 AM, Thomas Huth wrote:
> [...]
>
> I think it should be fine, both functions are basically just a wrapper
> around the write() function in sclp.c, with sclp_print() being rather
> dumb while printf() is doing the usual string formatting before
> writing it out. I think in the long run, it would be nice to get rid
> of sclp_print() and replace it by puts() or printf() in the whole
> code, but doing that right now would likely cause quite some conflicts
> for Jared with his patch series, so I'd rather postpone that to a
> later point in time.
Hi Thomas,
Converting the panics to returns will require me to modify/move some of
the sclp_print() calls. Shall I go ahead and change them to printf()
and puts() while I'm at it, or would you rather preserve the
sclp_print() for now and then have a dedicated patch for the all
replacements later? I'm not sure if we want to try to maintain some
amount of consistency until we do a total conversion, or if you are OK
with a mix of sclp_print() and printf() throughout in the meantime.
Regards,
Jared Rossi
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 0/7] pc-bios/s390-ccw: Merge the netboot loader into s390-ccw.img
2024-06-28 18:01 ` Jared Rossi
@ 2024-07-01 8:01 ` Thomas Huth
0 siblings, 0 replies; 18+ messages in thread
From: Thomas Huth @ 2024-07-01 8:01 UTC (permalink / raw)
To: Jared Rossi, qemu-s390x
Cc: qemu-devel, Claudio Imbrenda, Collin L . Walling, Janosch Frank,
Jason J . Herne, Marc Hartmayer, Eric Farman,
Christian Borntraeger
On 28/06/2024 20.01, Jared Rossi wrote:
>
>
> On 6/24/24 1:55 AM, Thomas Huth wrote:
>> [...]
>>
>> I think it should be fine, both functions are basically just a wrapper
>> around the write() function in sclp.c, with sclp_print() being rather dumb
>> while printf() is doing the usual string formatting before writing it out.
>> I think in the long run, it would be nice to get rid of sclp_print() and
>> replace it by puts() or printf() in the whole code, but doing that right
>> now would likely cause quite some conflicts for Jared with his patch
>> series, so I'd rather postpone that to a later point in time.
>
> Hi Thomas,
>
> Converting the panics to returns will require me to modify/move some of the
> sclp_print() calls. Shall I go ahead and change them to printf() and puts()
> while I'm at it, or would you rather preserve the sclp_print() for now and
> then have a dedicated patch for the all replacements later? I'm not sure if
> we want to try to maintain some amount of consistency until we do a total
> conversion, or if you are OK with a mix of sclp_print() and printf()
> throughout in the meantime.
Hi,
I'm ok if we mix them for a while, so I'd say go ahead and use printf or
puts for the new code.
Thomas
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 0/7] pc-bios/s390-ccw: Merge the netboot loader into s390-ccw.img
2024-06-21 8:24 [PATCH 0/7] pc-bios/s390-ccw: Merge the netboot loader into s390-ccw.img Thomas Huth
` (9 preceding siblings ...)
2024-06-24 0:35 ` Jared Rossi
@ 2024-08-26 17:07 ` Jared Rossi
2024-08-27 12:43 ` Thomas Huth
10 siblings, 1 reply; 18+ messages in thread
From: Jared Rossi @ 2024-08-26 17:07 UTC (permalink / raw)
To: Thomas Huth, qemu-s390x; +Cc: qemu-devel
Hi Thomas,
I just wanted to get your thoughts on the status of the netboot loader merge.
I see that the first patch from this series was merged, but not the others. Is
there any issue with the rest of the changes?
I would like to put together a comprehensive rework for all device types that
replaces the IPL panics with returns, but as we discussed this is best applied
after the netboot loader has been unified with the main s390-ccw.img file.
I can base my patches on either current master (with a special case for netboot)
or the combined bootloader, depending on how you would like to proceed. Let me
know if there is anything I can do to help with test/review of the changes from
your side.
Thanks,
Jared Rossi
On 6/21/24 4:24 AM, Thomas Huth wrote:
> We originally built a separate binary for the netboot code since it
> was considered as experimental and we could not be sure that the
> necessary SLOF module had been checked out. Time passed, the netboot
> code proved its usefulness, and the build system nowadays makes sure
> that the SLOF module is checked out if you have a s390x compiler available
> for building the s390-ccw bios. In fact, the possibility to build the
> s390-ccw.img without s390-netboot.img has been removed in commit
> bf6903f6944f ("pc-bios/s390-ccw: always build network bootloader")
> already.
>
> So it does not make too much sense anymore to keep the netboot code
> in a separate binary. To make it easier to support a more flexible
> boot process soon that supports more than one boot device via the
> bootindex properties, let's finally merge the netboot code into the
> main s390-ccw.img binary now.
>
> Thomas Huth (7):
> pc-bios/s390-ccw: Remove duplicated LDFLAGS
> hw/s390x/ipl: Provide more memory to the s390-ccw.img firmware
> pc-bios/s390-ccw: Use the libc from SLOF for the main s390-ccw.img
> binary, too
> pc-bios/s390-ccw: Link the netboot code into the main s390-ccw.img
> binary
> hw/s390x: Remove the possibility to load the s390-netboot.img binary
> pc-bios/s390-ccw: Merge netboot.mak into the main Makefile
> docs/system/s390x/bootdevices: Update the documentation about network
> booting
>
> docs/system/s390x/bootdevices.rst | 20 +++----
> pc-bios/s390-ccw/netboot.mak | 62 ---------------------
> hw/s390x/ipl.h | 12 ++--
> pc-bios/s390-ccw/cio.h | 2 +
> pc-bios/s390-ccw/iplb.h | 4 +-
> pc-bios/s390-ccw/libc.h | 89 ------------------------------
> pc-bios/s390-ccw/s390-ccw.h | 10 +++-
> pc-bios/s390-ccw/virtio.h | 1 -
> hw/s390x/ipl.c | 65 +++-------------------
> hw/s390x/s390-virtio-ccw.c | 10 +---
> pc-bios/s390-ccw/bootmap.c | 4 +-
> pc-bios/s390-ccw/cio.c | 2 +-
> pc-bios/s390-ccw/dasd-ipl.c | 2 +-
> pc-bios/s390-ccw/jump2ipl.c | 2 +-
> pc-bios/s390-ccw/libc.c | 88 -----------------------------
> pc-bios/s390-ccw/main.c | 15 +++--
> pc-bios/s390-ccw/menu.c | 25 ++++-----
> pc-bios/s390-ccw/netmain.c | 15 +----
> pc-bios/s390-ccw/sclp.c | 2 +-
> pc-bios/s390-ccw/virtio-blkdev.c | 1 -
> pc-bios/s390-ccw/virtio-scsi.c | 2 +-
> pc-bios/s390-ccw/virtio.c | 2 +-
> pc-bios/meson.build | 1 -
> pc-bios/s390-ccw/Makefile | 69 +++++++++++++++++++----
> pc-bios/s390-netboot.img | Bin 67232 -> 0 bytes
> 25 files changed, 122 insertions(+), 383 deletions(-)
> delete mode 100644 pc-bios/s390-ccw/netboot.mak
> delete mode 100644 pc-bios/s390-ccw/libc.h
> delete mode 100644 pc-bios/s390-ccw/libc.c
> delete mode 100644 pc-bios/s390-netboot.img
>
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 0/7] pc-bios/s390-ccw: Merge the netboot loader into s390-ccw.img
2024-08-26 17:07 ` Jared Rossi
@ 2024-08-27 12:43 ` Thomas Huth
2024-08-27 13:13 ` Jared Rossi
0 siblings, 1 reply; 18+ messages in thread
From: Thomas Huth @ 2024-08-27 12:43 UTC (permalink / raw)
To: Jared Rossi, qemu-s390x; +Cc: qemu-devel
On 26/08/2024 19.07, Jared Rossi wrote:
> Hi Thomas,
>
> I just wanted to get your thoughts on the status of the netboot loader merge.
> I see that the first patch from this series was merged, but not the others. Is
> there any issue with the rest of the changes?
Hi Jared,
there's no issue with that patch series - it's just that QEMU is in freeze
now and only accepts bug fixes. See https://wiki.qemu.org/Planning/9.1
> I would like to put together a comprehensive rework for all device types that
> replaces the IPL panics with returns, but as we discussed this is best applied
> after the netboot loader has been unified with the main s390-ccw.img file.
>
> I can base my patches on either current master (with a special case for
> netboot)
> or the combined bootloader, depending on how you would like to proceed. Let me
> know if there is anything I can do to help with test/review of the changes from
> your side.
I think it's maybe best if you'd include my patches at the top of your patch
series, so you could also rework them in case you need something to be
changed there. That way, we also do not have to rebuild the binaries in the
git repo multiple times and just have to update them one time once your
series is ready to go.
Alternatively, if you don't want to juggle with my patches, I can also try
to get them merged as soon as QEMU 9.1 has been released. Just let me know
if you prefer that.
Thomas
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 0/7] pc-bios/s390-ccw: Merge the netboot loader into s390-ccw.img
2024-08-27 12:43 ` Thomas Huth
@ 2024-08-27 13:13 ` Jared Rossi
0 siblings, 0 replies; 18+ messages in thread
From: Jared Rossi @ 2024-08-27 13:13 UTC (permalink / raw)
To: Thomas Huth, qemu-s390x; +Cc: qemu-devel
On 8/27/24 8:43 AM, Thomas Huth wrote:
> I think it's maybe best if you'd include my patches at the top of your
> patch series, so you could also rework them in case you need something
> to be changed there. That way, we also do not have to rebuild the
> binaries in the git repo multiple times and just have to update them
> one time once your series is ready to go.
>
> Alternatively, if you don't want to juggle with my patches, I can also
> try to get them merged as soon as QEMU 9.1 has been released. Just let
> me know if you prefer that.
>
> Thomas
>
I am fine with including your patches in my series. I will get all that
put together and submit a V2 after QEMU 9.1 is squared away.
Thanks again,
Jared Rossi
^ permalink raw reply [flat|nested] 18+ messages in thread
end of thread, other threads:[~2024-08-27 13:14 UTC | newest]
Thread overview: 18+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-06-21 8:24 [PATCH 0/7] pc-bios/s390-ccw: Merge the netboot loader into s390-ccw.img Thomas Huth
2024-06-21 8:24 ` [PATCH 1/7] pc-bios/s390-ccw: Remove duplicated LDFLAGS Thomas Huth
2024-06-21 8:24 ` [PATCH 2/7] hw/s390x/ipl: Provide more memory to the s390-ccw.img firmware Thomas Huth
2024-06-21 8:24 ` [PATCH 3/7] pc-bios/s390-ccw: Use the libc from SLOF for the main s390-ccw.img binary, too Thomas Huth
2024-06-21 8:24 ` [PATCH 4/7] pc-bios/s390-ccw: Link the netboot code into the main s390-ccw.img binary Thomas Huth
2024-06-21 8:24 ` [PATCH 5/7] hw/s390x: Remove the possibility to load the s390-netboot.img binary Thomas Huth
2024-06-21 8:24 ` [PATCH 6/7] pc-bios/s390-ccw: Merge netboot.mak into the main Makefile Thomas Huth
2024-06-21 8:24 ` [PATCH 7/7] docs/system/s390x/bootdevices: Update the documentation about network booting Thomas Huth
2024-06-21 9:39 ` [PATCH 0/7] pc-bios/s390-ccw: Merge the netboot loader into s390-ccw.img Christian Borntraeger
2024-06-21 9:41 ` Thomas Huth
2024-06-21 20:51 ` Eric Farman
2024-06-24 5:55 ` Thomas Huth
2024-06-28 18:01 ` Jared Rossi
2024-07-01 8:01 ` Thomas Huth
2024-06-24 0:35 ` Jared Rossi
2024-08-26 17:07 ` Jared Rossi
2024-08-27 12:43 ` Thomas Huth
2024-08-27 13:13 ` Jared Rossi
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).