From: Thomas Huth <thuth@redhat.com>
To: Christian Borntraeger <borntraeger@de.ibm.com>,
qemu-s390x@nongnu.org,
Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Cc: Cornelia Huck <cohuck@redhat.com>,
qemu-devel@nongnu.org, Farhan Ali <alifm@linux.ibm.com>,
Alexey Kardashevskiy <aik@ozlabs.ru>
Subject: [Qemu-devel] [PATCH v3 3/3] pc-bios/s390-ccw/net: Add support for .INS config files
Date: Wed, 25 Apr 2018 11:08:43 +0200 [thread overview]
Message-ID: <1524647323-6449-4-git-send-email-thuth@redhat.com> (raw)
In-Reply-To: <1524647323-6449-1-git-send-email-thuth@redhat.com>
The .INS config files can normally be found on CD-ROM ISO images,
so by supporting these files, it is now possible to boot directly
when the TFTP server is set up with the contents of such an CD-ROM
image.
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
pc-bios/s390-ccw/netmain.c | 100 ++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 95 insertions(+), 5 deletions(-)
diff --git a/pc-bios/s390-ccw/netmain.c b/pc-bios/s390-ccw/netmain.c
index 5f28ea0..c10b0ac 100644
--- a/pc-bios/s390-ccw/netmain.c
+++ b/pc-bios/s390-ccw/netmain.c
@@ -39,8 +39,12 @@
extern char _start[];
+#define KERNEL_ADDR ((void *)0L)
+#define KERNEL_MAX_SIZE ((long)_start)
+
char stack[PAGE_SIZE * 8] __attribute__((aligned(PAGE_SIZE)));
IplParameterBlock iplb __attribute__((aligned(PAGE_SIZE)));
+static char cfgbuf[2048];
static SubChannelId net_schid = { .one = 1 };
static int ip_version = 4;
@@ -136,9 +140,15 @@ static int tftp_load(filename_ip_t *fnip, void *buffer, int len)
rc = tftp(fnip, buffer, len, DEFAULT_TFTP_RETRIES, &tftp_err, 1, 1428,
ip_version);
- if (rc > 0) {
- printf(" TFTP: Received %s (%d KBytes)\n", fnip->filename,
- rc / 1024);
+ if (rc < 0) {
+ /* Make sure that error messages are put into a new line */
+ printf("\n ");
+ }
+
+ if (rc > 1024) {
+ printf(" TFTP: Received %s (%d KBytes)\n", fnip->filename, rc / 1024);
+ } else if (rc > 0) {
+ printf(" TFTP: Received %s (%d Bytes)\n", fnip->filename, rc);
} else if (rc == -1) {
puts("unknown TFTP error");
} else if (rc == -2) {
@@ -275,6 +285,83 @@ static void net_release(filename_ip_t *fn_ip)
}
}
+/**
+ * Load via information from a .INS file (which can be found on CD-ROMs
+ * for example)
+ */
+static int handle_ins_cfg(filename_ip_t *fn_ip, char *cfg, int cfgsize)
+{
+ char *ptr;
+ int rc = -1, llen;
+ void *destaddr;
+ char *insbuf = cfg;
+
+ ptr = strchr(insbuf, '\n');
+ if (!ptr) {
+ puts("Does not seem to be a valid .INS file");
+ return -1;
+ }
+
+ *ptr = 0;
+ printf("\nParsing .INS file:\n %s\n", &insbuf[2]);
+
+ insbuf = ptr + 1;
+ while (*insbuf && insbuf < cfg + cfgsize) {
+ ptr = strchr(insbuf, '\n');
+ if (ptr) {
+ *ptr = 0;
+ }
+ llen = strlen(insbuf);
+ if (!llen) {
+ insbuf = ptr + 1;
+ continue;
+ }
+ ptr = strchr(insbuf, ' ');
+ if (!ptr) {
+ puts("Missing space separator in .INS file");
+ return -1;
+ }
+ *ptr = 0;
+ strncpy((char *)fn_ip->filename, insbuf, sizeof(fn_ip->filename));
+ destaddr = (char *)atol(ptr + 1);
+ rc = tftp_load(fn_ip, destaddr, (long)_start - (long)destaddr);
+ if (rc <= 0) {
+ break;
+ }
+ insbuf += llen + 1;
+ }
+
+ return rc;
+}
+
+static int net_try_bootfile_load(filename_ip_t *fn_ip)
+{
+ int rc;
+ void *loadaddr = (void *)0x2000; /* Load right after the low-core */
+
+ rc = tftp_load(fn_ip, loadaddr, KERNEL_MAX_SIZE - (long)loadaddr);
+ if (rc < 0) {
+ return rc;
+ } else if (rc < 8) {
+ printf("'%s' is too small (%i bytes only).\n", fn_ip->filename, rc);
+ return -1;
+ }
+
+ /* Check whether it is a configuration file instead of a kernel */
+ if (rc < sizeof(cfgbuf) - 1) {
+ memcpy(cfgbuf, loadaddr, rc);
+ cfgbuf[rc] = 0; /* Make sure that it is NUL-terminated */
+ if (!strncmp("* ", cfgbuf, 2)) {
+ return handle_ins_cfg(fn_ip, cfgbuf, rc);
+ }
+ }
+
+ /* Move kernel to right location */
+ memmove(KERNEL_ADDR, loadaddr, rc);
+
+ return rc;
+}
+
void panic(const char *string)
{
sclp_print(string);
@@ -356,7 +443,7 @@ static void virtio_setup(void)
void main(void)
{
filename_ip_t fn_ip;
- int rc;
+ int rc, fnlen;
sclp_setup();
sclp_print("Network boot starting...\n");
@@ -368,7 +455,10 @@ void main(void)
panic("Network initialization failed. Halting.\n");
}
- rc = tftp_load(&fn_ip, NULL, (long)_start);
+ fnlen = strlen((char *)fn_ip.filename);
+ if (fnlen > 0 && fn_ip.filename[fnlen - 1] != '/') {
+ rc = net_try_bootfile_load(&fn_ip);
+ }
net_release(&fn_ip);
--
1.8.3.1
next prev parent reply other threads:[~2018-04-25 9:09 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-04-25 9:08 [Qemu-devel] [PATCH v3 0/3] pc-bios/s390-ccw: Some few network boot improvements Thomas Huth
2018-04-25 9:08 ` [Qemu-devel] [PATCH v3 1/3] pc-bios/s390-ccw/net: Split up net_load() into init, load and uninit parts Thomas Huth
2018-04-25 15:51 ` Farhan Ali
2018-04-25 9:08 ` [Qemu-devel] [PATCH v3 2/3] pc-bios/s390-ccw/net: Use diag308 to reset machine before jumping to the OS Thomas Huth
2018-04-25 12:18 ` Christian Borntraeger
2018-04-25 12:34 ` Thomas Huth
2018-04-25 12:41 ` Christian Borntraeger
2018-04-25 12:44 ` Christian Borntraeger
2018-04-25 15:36 ` Thomas Huth
2018-04-25 15:45 ` Christian Borntraeger
2018-04-25 16:03 ` Christian Borntraeger
2018-04-26 3:43 ` Thomas Huth
2018-04-26 6:00 ` Christian Borntraeger
2018-04-25 9:08 ` Thomas Huth [this message]
2018-04-25 12:44 ` [Qemu-devel] [PATCH v3 0/3] pc-bios/s390-ccw: Some few network boot improvements Viktor VM Mihajlovski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1524647323-6449-4-git-send-email-thuth@redhat.com \
--to=thuth@redhat.com \
--cc=aik@ozlabs.ru \
--cc=alifm@linux.ibm.com \
--cc=borntraeger@de.ibm.com \
--cc=cohuck@redhat.com \
--cc=mihajlov@linux.vnet.ibm.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-s390x@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.