* [Qemu-devel] [PATCH 01/10] pc-bios/s390-ccw: make checkpatch happy
2014-06-26 14:29 [Qemu-devel] [PATCH 00/10] pc-bios/s390-ccw: Add DASD IPL support Jens Freimann
@ 2014-06-26 14:30 ` Jens Freimann
2014-06-26 14:30 ` [Qemu-devel] [PATCH 02/10] pc-bios/s390-ccw: cleanup and enhance bootmap defintions Jens Freimann
` (9 subsequent siblings)
10 siblings, 0 replies; 19+ messages in thread
From: Jens Freimann @ 2014-06-26 14:30 UTC (permalink / raw)
To: Christian Borntraeger, Alexander Graf, Cornelia Huck
Cc: Eugene (jno) Dvurechenski, qemu-devel
From: "Eugene (jno) Dvurechenski" <jno@linux.vnet.ibm.com>
Remove tabs, tweak whitespace and comments.
Signed-off-by: Eugene (jno) Dvurechenski <jno@linux.vnet.ibm.com>
---
pc-bios/s390-ccw/bootmap.c | 37 ++++++++++++++++++++-----------------
pc-bios/s390-ccw/s390-ccw.h | 20 ++++++++++----------
pc-bios/s390-ccw/sclp-ascii.c | 4 ++--
pc-bios/s390-ccw/virtio.c | 26 +++++++++++++-------------
pc-bios/s390-ccw/virtio.h | 2 +-
5 files changed, 46 insertions(+), 43 deletions(-)
diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c
index 5ee3fcb..753c288 100644
--- a/pc-bios/s390-ccw/bootmap.c
+++ b/pc-bios/s390-ccw/bootmap.c
@@ -10,7 +10,7 @@
#include "s390-ccw.h"
-// #define DEBUG_FALLBACK
+/* #define DEBUG_FALLBACK */
#ifdef DEBUG_FALLBACK
#define dputs(txt) \
@@ -47,13 +47,13 @@ struct mbr {
struct scsi_blockptr blockptr;
} __attribute__ ((packed));
-#define ZIPL_MAGIC "zIPL"
+#define ZIPL_MAGIC "zIPL"
-#define ZIPL_COMP_HEADER_IPL 0x00
-#define ZIPL_COMP_HEADER_DUMP 0x01
+#define ZIPL_COMP_HEADER_IPL 0x00
+#define ZIPL_COMP_HEADER_DUMP 0x01
-#define ZIPL_COMP_ENTRY_LOAD 0x02
-#define ZIPL_COMP_ENTRY_EXEC 0x01
+#define ZIPL_COMP_ENTRY_LOAD 0x02
+#define ZIPL_COMP_ENTRY_EXEC 0x01
/* Scratch space */
static uint8_t sec[SECTOR_SIZE] __attribute__((__aligned__(SECTOR_SIZE)));
@@ -107,8 +107,8 @@ static void jump_to_IPL_code(uint64_t address)
/* Check for ZIPL magic. Returns 0 if not matched. */
static int zipl_magic(uint8_t *ptr)
{
- uint32_t *p = (void*)ptr;
- uint32_t *z = (void*)ZIPL_MAGIC;
+ uint32_t *p = (void *)ptr;
+ uint32_t *z = (void *)ZIPL_MAGIC;
if (*p != *z) {
debug_print_int("invalid magic", *p);
@@ -136,7 +136,7 @@ static inline bool unused_space(const void *p, unsigned int size)
static int zipl_load_segment(struct component_entry *entry)
{
const int max_entries = (SECTOR_SIZE / sizeof(struct scsi_blockptr));
- struct scsi_blockptr *bprs = (void*)sec;
+ struct scsi_blockptr *bprs = (void *)sec;
const int bprs_size = sizeof(sec);
uint64_t blockno;
long address;
@@ -156,16 +156,18 @@ static int zipl_load_segment(struct component_entry *entry)
}
for (i = 0;; i++) {
- u64 *cur_desc = (void*)&bprs[i];
+ u64 *cur_desc = (void *)&bprs[i];
blockno = bprs[i].blockno;
- if (!blockno)
+ if (!blockno) {
break;
+ }
/* we need the updated blockno for the next indirect entry in the
chain, but don't want to advance address */
- if (i == (max_entries - 1))
+ if (i == (max_entries - 1)) {
break;
+ }
if (bprs[i].blockct == 0 && unused_space(&bprs[i + 1],
sizeof(struct scsi_blockptr))) {
@@ -178,9 +180,10 @@ static int zipl_load_segment(struct component_entry *entry)
break;
}
address = virtio_load_direct(cur_desc[0], cur_desc[1], 0,
- (void*)address);
- if (address == -1)
+ (void *)address);
+ if (address == -1) {
goto fail;
+ }
}
} while (blockno);
@@ -220,7 +223,7 @@ static int zipl_run(struct scsi_blockptr *pte)
entry++;
- if ((uint8_t*)(&entry[1]) > (tmp_sec + SECTOR_SIZE)) {
+ if ((uint8_t *)(&entry[1]) > (tmp_sec + SECTOR_SIZE)) {
goto fail;
}
}
@@ -241,7 +244,7 @@ fail:
int zipl_load(void)
{
- struct mbr *mbr = (void*)sec;
+ struct mbr *mbr = (void *)sec;
uint8_t *ns, *ns_end;
int program_table_entries = 0;
int pte_len = sizeof(struct scsi_blockptr);
@@ -249,7 +252,7 @@ int zipl_load(void)
const char *error = "";
/* Grab the MBR */
- virtio_read(0, (void*)mbr);
+ virtio_read(0, (void *)mbr);
dputs("checking magic\n");
diff --git a/pc-bios/s390-ccw/s390-ccw.h b/pc-bios/s390-ccw/s390-ccw.h
index 5e871ac..fe1dd22 100644
--- a/pc-bios/s390-ccw/s390-ccw.h
+++ b/pc-bios/s390-ccw/s390-ccw.h
@@ -34,10 +34,10 @@ typedef unsigned long long __u64;
#define PAGE_SIZE 4096
#ifndef EIO
-#define EIO 1
+#define EIO 1
#endif
#ifndef EBUSY
-#define EBUSY 2
+#define EBUSY 2
#endif
#ifndef NULL
#define NULL 0
@@ -57,7 +57,7 @@ void sclp_setup(void);
/* virtio.c */
unsigned long virtio_load_direct(ulong rec_list1, ulong rec_list2,
- ulong subchan_id, void *load_addr);
+ ulong subchan_id, void *load_addr);
bool virtio_is_blk(struct subchannel_id schid);
void virtio_setup_block(struct subchannel_id schid);
int virtio_read(ulong sector, void *load_addr);
@@ -88,7 +88,7 @@ static inline void fill_hex(char *out, unsigned char val)
static inline void print_int(const char *desc, u64 addr)
{
- unsigned char *addr_c = (unsigned char*)&addr;
+ unsigned char *addr_c = (unsigned char *)&addr;
char out[] = ": 0xffffffffffffffff\n";
unsigned int i;
@@ -118,16 +118,16 @@ static inline void debug_print_addr(const char *desc, void *p)
* Hypercall functions *
***********************************************/
-#define KVM_S390_VIRTIO_NOTIFY 0
-#define KVM_S390_VIRTIO_RESET 1
-#define KVM_S390_VIRTIO_SET_STATUS 2
+#define KVM_S390_VIRTIO_NOTIFY 0
+#define KVM_S390_VIRTIO_RESET 1
+#define KVM_S390_VIRTIO_SET_STATUS 2
#define KVM_S390_VIRTIO_CCW_NOTIFY 3
static inline void yield(void)
{
- asm volatile ("diag 0,0,0x44"
- : :
- : "memory", "cc");
+ asm volatile ("diag 0,0,0x44"
+ : :
+ : "memory", "cc");
}
#define SECTOR_SIZE 512
diff --git a/pc-bios/s390-ccw/sclp-ascii.c b/pc-bios/s390-ccw/sclp-ascii.c
index 1c93937..761fb44 100644
--- a/pc-bios/s390-ccw/sclp-ascii.c
+++ b/pc-bios/s390-ccw/sclp-ascii.c
@@ -33,7 +33,7 @@ static int sclp_service_call(unsigned int command, void *sccb)
static void sclp_set_write_mask(void)
{
- WriteEventMask *sccb = (void*)_sccb;
+ WriteEventMask *sccb = (void *)_sccb;
sccb->h.length = sizeof(WriteEventMask);
sccb->mask_length = sizeof(unsigned int);
@@ -68,7 +68,7 @@ static void _memcpy(char *dest, const char *src, int len)
void sclp_print(const char *str)
{
int len = _strlen(str);
- WriteEventData *sccb = (void*)_sccb;
+ WriteEventData *sccb = (void *)_sccb;
sccb->h.length = sizeof(WriteEventData) + len;
sccb->h.function_code = SCLP_FC_NORMAL_WRITE;
diff --git a/pc-bios/s390-ccw/virtio.c b/pc-bios/s390-ccw/virtio.c
index bbb3c4f..c845b14 100644
--- a/pc-bios/s390-ccw/virtio.c
+++ b/pc-bios/s390-ccw/virtio.c
@@ -18,22 +18,22 @@ static char chsc_page[PAGE_SIZE] __attribute__((__aligned__(PAGE_SIZE)));
static long kvm_hypercall(unsigned long nr, unsigned long param1,
unsigned long param2)
{
- register ulong r_nr asm("1") = nr;
- register ulong r_param1 asm("2") = param1;
- register ulong r_param2 asm("3") = param2;
- register long retval asm("2");
+ register ulong r_nr asm("1") = nr;
+ register ulong r_param1 asm("2") = param1;
+ register ulong r_param2 asm("3") = param2;
+ register long retval asm("2");
- asm volatile ("diag 2,4,0x500"
- : "=d" (retval)
- : "d" (r_nr), "0" (r_param1), "r"(r_param2)
- : "memory", "cc");
+ asm volatile ("diag 2,4,0x500"
+ : "=d" (retval)
+ : "d" (r_nr), "0" (r_param1), "r"(r_param2)
+ : "memory", "cc");
- return retval;
+ return retval;
}
static void virtio_notify(struct subchannel_id schid)
{
- kvm_hypercall(KVM_S390_VIRTIO_CCW_NOTIFY, *(u32*)&schid, 0);
+ kvm_hypercall(KVM_S390_VIRTIO_CCW_NOTIFY, *(u32 *)&schid, 0);
}
/***********************************************
@@ -236,7 +236,7 @@ static int virtio_read_many(ulong sector, void *load_addr, int sec_num)
}
unsigned long virtio_load_direct(ulong rec_list1, ulong rec_list2,
- ulong subchan_id, void *load_addr)
+ ulong subchan_id, void *load_addr)
{
u8 status;
int sec = rec_list1;
@@ -249,7 +249,7 @@ unsigned long virtio_load_direct(ulong rec_list1, ulong rec_list2,
}
sclp_print(".");
- status = virtio_read_many(sec, (void*)addr, sec_num);
+ status = virtio_read_many(sec, (void *)addr, sec_num);
if (status) {
virtio_panic("I/O Error");
}
@@ -274,7 +274,7 @@ void virtio_setup_block(struct subchannel_id schid)
if (run_ccw(schid, CCW_CMD_READ_VQ_CONF, &config, sizeof(config))) {
virtio_panic("Could not get block device configuration\n");
}
- vring_init(&block, config.num, (void*)(100 * 1024 * 1024),
+ vring_init(&block, config.num, (void *)(100 * 1024 * 1024),
KVM_S390_VIRTIO_RING_ALIGN);
info.queue = (100ULL * 1024ULL* 1024ULL);
diff --git a/pc-bios/s390-ccw/virtio.h b/pc-bios/s390-ccw/virtio.h
index 772a63f..c2990ea 100644
--- a/pc-bios/s390-ccw/virtio.h
+++ b/pc-bios/s390-ccw/virtio.h
@@ -66,7 +66,7 @@ struct virtio_dev {
char *config;
};
-#define KVM_S390_VIRTIO_RING_ALIGN 4096
+#define KVM_S390_VIRTIO_RING_ALIGN 4096
#define VRING_USED_F_NO_NOTIFY 1
--
1.8.5.5
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [Qemu-devel] [PATCH 02/10] pc-bios/s390-ccw: cleanup and enhance bootmap defintions
2014-06-26 14:29 [Qemu-devel] [PATCH 00/10] pc-bios/s390-ccw: Add DASD IPL support Jens Freimann
2014-06-26 14:30 ` [Qemu-devel] [PATCH 01/10] pc-bios/s390-ccw: make checkpatch happy Jens Freimann
@ 2014-06-26 14:30 ` Jens Freimann
2014-06-26 14:30 ` [Qemu-devel] [PATCH 03/10] pc-bios/s390-ccw: handle different sector sizes Jens Freimann
` (8 subsequent siblings)
10 siblings, 0 replies; 19+ messages in thread
From: Jens Freimann @ 2014-06-26 14:30 UTC (permalink / raw)
To: Christian Borntraeger, Alexander Graf, Cornelia Huck
Cc: Eugene (jno) Dvurechenski, Jens Freimann, qemu-devel
From: "Eugene (jno) Dvurechenski" <jno@linux.vnet.ibm.com>
Add declarations to describe structure of different dasd IPL sources
(eckd and fba). Move the structure definitions to a new header bootmap.h.
While we are at it, change structs to typedefs.
Signed-off-by: Eugene (jno) Dvurechenski <jno@linux.vnet.ibm.com>
Signed-off-by: Jens Freimann <jfrei@linux.vnet.ibm.com>
---
pc-bios/s390-ccw/bootmap.c | 66 +++---------
pc-bios/s390-ccw/bootmap.h | 254 +++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 269 insertions(+), 51 deletions(-)
create mode 100644 pc-bios/s390-ccw/bootmap.h
diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c
index 753c288..c216030 100644
--- a/pc-bios/s390-ccw/bootmap.c
+++ b/pc-bios/s390-ccw/bootmap.c
@@ -9,6 +9,7 @@
*/
#include "s390-ccw.h"
+#include "bootmap.h"
/* #define DEBUG_FALLBACK */
@@ -20,41 +21,6 @@
do { } while (0)
#endif
-struct scsi_blockptr {
- uint64_t blockno;
- uint16_t size;
- uint16_t blockct;
- uint8_t reserved[4];
-} __attribute__ ((packed));
-
-struct component_entry {
- struct scsi_blockptr data;
- uint8_t pad[7];
- uint8_t component_type;
- uint64_t load_address;
-} __attribute((packed));
-
-struct component_header {
- uint8_t magic[4];
- uint8_t type;
- uint8_t reserved[27];
-} __attribute((packed));
-
-struct mbr {
- uint8_t magic[4];
- uint32_t version_id;
- uint8_t reserved[8];
- struct scsi_blockptr blockptr;
-} __attribute__ ((packed));
-
-#define ZIPL_MAGIC "zIPL"
-
-#define ZIPL_COMP_HEADER_IPL 0x00
-#define ZIPL_COMP_HEADER_DUMP 0x01
-
-#define ZIPL_COMP_ENTRY_LOAD 0x02
-#define ZIPL_COMP_ENTRY_EXEC 0x01
-
/* Scratch space */
static uint8_t sec[SECTOR_SIZE] __attribute__((__aligned__(SECTOR_SIZE)));
@@ -118,8 +84,6 @@ static int zipl_magic(uint8_t *ptr)
return 1;
}
-#define FREE_SPACE_FILLER '\xAA'
-
static inline bool unused_space(const void *p, unsigned int size)
{
int i;
@@ -133,10 +97,10 @@ static inline bool unused_space(const void *p, unsigned int size)
return true;
}
-static int zipl_load_segment(struct component_entry *entry)
+static int zipl_load_segment(ComponentEntry *entry)
{
- const int max_entries = (SECTOR_SIZE / sizeof(struct scsi_blockptr));
- struct scsi_blockptr *bprs = (void *)sec;
+ const int max_entries = (SECTOR_SIZE / sizeof(ScsiBlockPtr));
+ ScsiBlockPtr *bprs = (void *)sec;
const int bprs_size = sizeof(sec);
uint64_t blockno;
long address;
@@ -170,7 +134,7 @@ static int zipl_load_segment(struct component_entry *entry)
}
if (bprs[i].blockct == 0 && unused_space(&bprs[i + 1],
- sizeof(struct scsi_blockptr))) {
+ sizeof(ScsiBlockPtr))) {
/* This is a "continue" pointer.
* This ptr is the last one in the current script section.
* I.e. the next ptr must point to the unused memory area.
@@ -195,14 +159,14 @@ fail:
}
/* Run a zipl program */
-static int zipl_run(struct scsi_blockptr *pte)
+static int zipl_run(ScsiBlockPtr *pte)
{
- struct component_header *header;
- struct component_entry *entry;
+ ComponentHeader *header;
+ ComponentEntry *entry;
uint8_t tmp_sec[SECTOR_SIZE];
virtio_read(pte->blockno, tmp_sec);
- header = (struct component_header *)tmp_sec;
+ header = (ComponentHeader *)tmp_sec;
if (!zipl_magic(tmp_sec)) {
goto fail;
@@ -215,7 +179,7 @@ static int zipl_run(struct scsi_blockptr *pte)
dputs("start loading images\n");
/* Load image(s) into RAM */
- entry = (struct component_entry *)(&header[1]);
+ entry = (ComponentEntry *)(&header[1]);
while (entry->component_type == ZIPL_COMP_ENTRY_LOAD) {
if (zipl_load_segment(entry) < 0) {
goto fail;
@@ -244,11 +208,11 @@ fail:
int zipl_load(void)
{
- struct mbr *mbr = (void *)sec;
+ ScsiMbr *mbr = (void *)sec;
uint8_t *ns, *ns_end;
int program_table_entries = 0;
- int pte_len = sizeof(struct scsi_blockptr);
- struct scsi_blockptr *prog_table_entry;
+ const int pte_len = sizeof(ScsiBlockPtr);
+ ScsiBlockPtr *prog_table_entry;
const char *error = "";
/* Grab the MBR */
@@ -276,7 +240,7 @@ int zipl_load(void)
ns_end = sec + SECTOR_SIZE;
for (ns = (sec + pte_len); (ns + pte_len) < ns_end; ns++) {
- prog_table_entry = (struct scsi_blockptr *)ns;
+ prog_table_entry = (ScsiBlockPtr *)ns;
if (!prog_table_entry->blockno) {
break;
}
@@ -292,7 +256,7 @@ int zipl_load(void)
/* Run the default entry */
- prog_table_entry = (struct scsi_blockptr *)(sec + pte_len);
+ prog_table_entry = (ScsiBlockPtr *)(sec + pte_len);
return zipl_run(prog_table_entry);
diff --git a/pc-bios/s390-ccw/bootmap.h b/pc-bios/s390-ccw/bootmap.h
new file mode 100644
index 0000000..59267b0
--- /dev/null
+++ b/pc-bios/s390-ccw/bootmap.h
@@ -0,0 +1,254 @@
+/*
+ * QEMU S390 bootmap interpreter -- declarations
+ *
+ * Copyright 2014 IBM Corp.
+ * Author(s): Eugene (jno) Dvurechenski <jno@linux.vnet.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or (at
+ * your option) any later version. See the COPYING file in the top-level
+ * directory.
+ */
+#ifndef _PC_BIOS_S390_CCW_BOOTMAP_H
+#define _PC_BIOS_S390_CCW_BOOTMAP_H
+
+#include "s390-ccw.h"
+
+#define FREE_SPACE_FILLER '\xAA'
+
+typedef struct ScsiBlockPtr {
+ uint64_t blockno;
+ uint16_t size;
+ uint16_t blockct;
+ uint8_t reserved[4];
+} __attribute__ ((packed)) ScsiBlockPtr;
+
+typedef struct FbaBlockPtr {
+ uint32_t blockno;
+ uint16_t size;
+ uint16_t blockct;
+} __attribute__ ((packed)) FbaBlockPtr;
+
+typedef struct EckdBlockPtr {
+ uint16_t cylinder; /* cylinder/head/sector is an address of the block */
+ uint16_t head;
+ uint8_t sector;
+ uint16_t size;
+ uint8_t count; /* (size_in_blocks-1);
+ * it's 0 for TablePtr, ScriptPtr, and SectionPtr */
+} __attribute__ ((packed)) EckdBlockPtr;
+
+typedef struct ExtEckdBlockPtr {
+ EckdBlockPtr bptr;
+ uint8_t reserved[8];
+} __attribute__ ((packed)) ExtEckdBlockPtr;
+
+typedef union BootMapPointer {
+ ScsiBlockPtr scsi;
+ FbaBlockPtr fba;
+ EckdBlockPtr eckd;
+ ExtEckdBlockPtr xeckd;
+} __attribute__ ((packed)) BootMapPointer;
+
+typedef struct ComponentEntry {
+ ScsiBlockPtr data;
+ uint8_t pad[7];
+ uint8_t component_type;
+ uint64_t load_address;
+} __attribute((packed)) ComponentEntry;
+
+typedef struct ComponentHeader {
+ uint8_t magic[4]; /* == "zIPL" */
+ uint8_t type; /* == ZIPL_COMP_HEADER_* */
+ uint8_t reserved[27];
+} __attribute((packed)) ComponentHeader;
+
+typedef struct ScsiMbr {
+ uint8_t magic[4];
+ uint32_t version_id;
+ uint8_t reserved[8];
+ ScsiBlockPtr blockptr;
+} __attribute__ ((packed)) ScsiMbr;
+
+#define ZIPL_MAGIC "zIPL"
+#define IPL1_MAGIC "\xc9\xd7\xd3\xf1" /* == "IPL1" in EBCDIC */
+#define IPL2_MAGIC "\xc9\xd7\xd3\xf2" /* == "IPL2" in EBCDIC */
+#define VOL1_MAGIC "\xe5\xd6\xd3\xf1" /* == "VOL1" in EBCDIC */
+#define LNX1_MAGIC "\xd3\xd5\xe7\xf1" /* == "LNX1" in EBCDIC */
+#define CMS1_MAGIC "\xc3\xd4\xe2\xf1" /* == "CMS1" in EBCDIC */
+
+#define LDL1_VERSION '\x40' /* == ' ' in EBCDIC */
+#define LDL2_VERSION '\xf2' /* == '2' in EBCDIC */
+
+#define ZIPL_COMP_HEADER_IPL 0x00
+#define ZIPL_COMP_HEADER_DUMP 0x01
+
+#define ZIPL_COMP_ENTRY_LOAD 0x02
+#define ZIPL_COMP_ENTRY_EXEC 0x01
+
+typedef struct XEckdMbr {
+ uint8_t magic[4]; /* == "xIPL" */
+ uint8_t version;
+ uint8_t bp_type;
+ uint8_t dev_type; /* == DEV_TYPE_* */
+#define DEV_TYPE_ECKD 0x00
+#define DEV_TYPE_FBA 0x01
+ uint8_t flags;
+ BootMapPointer blockptr;
+ uint8_t reserved[8];
+} __attribute__ ((packed)) XEckdMbr; /* see also BootInfo */
+
+typedef struct BootMapScriptEntry {
+ BootMapPointer blkptr;
+ uint8_t pad[7];
+ uint8_t type; /* == BOOT_SCRIPT_* */
+#define BOOT_SCRIPT_EXEC 0x01
+#define BOOT_SCRIPT_LOAD 0x02
+ union {
+ uint64_t load_address;
+ uint64_t load_psw;
+ } address;
+} __attribute__ ((packed)) BootMapScriptEntry;
+
+typedef struct BootMapScriptHeader {
+ uint32_t magic;
+ uint8_t type;
+#define BOOT_SCRIPT_HDR_IPL 0x00
+ uint8_t reserved[27];
+} __attribute__ ((packed)) BootMapScriptHeader;
+
+typedef struct BootMapScript {
+ BootMapScriptHeader header;
+ BootMapScriptEntry entry[0];
+} __attribute__ ((packed)) BootMapScript;
+
+/*
+ * These aren't real VTOCs, but referred to this way in some docs.
+ * They are "volume labels" actually.
+ *
+ * Some structures looks similar to described above, but left
+ * separate as there is no indication that they are the same.
+ * So, the value definitions are left separate too.
+ */
+typedef struct LDL_VTOC { /* @ rec.3 cyl.0 trk.0 for ECKD */
+ char magic[4]; /* "LNX1", EBCDIC */
+ char volser[6]; /* volser, EBCDIC */
+ uint8_t reserved[69]; /* reserved, 0x40 */
+ uint8_t LDL_version; /* 0x40 or 0xF2 */
+ uint64_t formatted_blocks; /* if LDL_version >= 0xF2 */
+} __attribute__ ((packed)) LDL_VTOC;
+
+typedef struct format_date {
+ uint8_t YY;
+ uint8_t MM;
+ uint8_t DD;
+ uint8_t hh;
+ uint8_t mm;
+ uint8_t ss;
+} __attribute__ ((packed)) format_date_t;
+
+typedef struct CMS_VTOC { /* @ rec.3 cyl.0 trk.0 for ECKD */
+ /* @ blk.1 (zero based) for FBA */
+ char magic[4]; /* 'CMS1', EBCDIC */
+ char volser[6]; /* volser, EBCDIC */
+ uint16_t version; /* = 0 */
+ uint32_t block_size; /* = 512, 1024, 2048, or 4096 */
+ uint32_t disk_origin; /* = 4 or 5 */
+ uint32_t blocks; /* Number of usable cyls/blocks */
+ uint32_t formatted; /* Max number of fmtd cyls/blks */
+ uint32_t CMS_blocks; /* disk size in CMS blocks */
+ uint32_t CMS_used; /* Number of CMS blocks in use */
+ uint32_t FST_size; /* = 64, bytes */
+ uint32_t FST_per_CMS_blk; /* */
+ format_date_t format_date; /* YYMMDDhhmmss as 6 bytes */
+ uint8_t reserved1[2]; /* = 0 */
+ uint32_t offset; /* disk offset when reserved */
+ uint32_t next_hole; /* block nr */
+ uint32_t HBLK_hole_offset; /* >> HBLK data of next hole */
+ uint32_t alloc_map_usr_off; /* >> user part of Alloc map */
+ uint8_t reserved2[4]; /* = 0 */
+ char shared_seg_name[8]; /* */
+} __attribute__ ((packed)) CMS_VTOC;
+
+/* from zipl/include/boot.h */
+typedef struct BootInfoBpIpl {
+ union {
+ ExtEckdBlockPtr eckd;
+ ScsiBlockPtr linr;
+ } bm_ptr;
+ uint8_t unused[16];
+} __attribute__ ((packed)) BootInfoBpIpl;
+
+typedef struct EckdDumpParam {
+ uint32_t start_blk;
+ uint32_t end_blk;
+ uint16_t blocksize;
+ uint8_t num_heads;
+ uint8_t bpt;
+ char reserved[4];
+} __attribute((packed, may_alias)) EckdDumpParam;
+
+typedef struct FbaDumpParam {
+ uint64_t start_blk;
+ uint64_t blockct;
+} __attribute((packed)) FbaDumpParam;
+
+typedef struct BootInfoBpDump {
+ union {
+ EckdDumpParam eckd;
+ FbaDumpParam fba;
+ } param;
+ uint8_t unused[16];
+} __attribute__ ((packed)) BootInfoBpDump;
+
+typedef struct BootInfo { /* @ 0x70, record #0 */
+ unsigned char magic[4]; /* = 'zIPL', ASCII */
+ uint8_t version; /* = 1 */
+#define BOOT_INFO_VERSION 1
+ uint8_t bp_type; /* = 0 */
+#define BOOT_INFO_BP_TYPE_IPL 0x00
+#define BOOT_INFO_BP_TYPE_DUMP 0x01
+ uint8_t dev_type; /* = 0 */
+#define BOOT_INFO_DEV_TYPE_ECKD 0x00
+#define BOOT_INFO_DEV_TYPE_FBA 0x01
+ uint8_t flags; /* = 1 */
+#ifdef __s390x__
+#define BOOT_INFO_FLAGS_ARCH 0x01
+#else
+#define BOOT_INFO_FLAGS_ARCH 0x00
+#endif
+ union {
+ BootInfoBpDump dump;
+ BootInfoBpIpl ipl;
+ } bp;
+} __attribute__ ((packed)) BootInfo; /* see also XEckdMbr */
+
+typedef struct Ipl1 {
+ unsigned char key[4]; /* == "IPL1" */
+ unsigned char data[24];
+} __attribute__((packed)) Ipl1;
+
+typedef struct Ipl2 {
+ unsigned char key[4]; /* == "IPL2" */
+ union {
+ unsigned char data[144];
+ struct {
+ unsigned char reserved1[92-4];
+ XEckdMbr mbr;
+ unsigned char reserved2[144-(92-4)-sizeof(XEckdMbr)];
+ } x;
+ } u;
+} __attribute__((packed)) Ipl2;
+
+typedef struct IplVolumeLabel {
+ unsigned char key[4]; /* == "VOL1" */
+ union {
+ unsigned char data[80];
+ struct {
+ unsigned char key[4]; /* == "VOL1" */
+ unsigned char volser[6];
+ unsigned char reserved[6];
+ } f;
+ };
+} __attribute__((packed)) IplVolumeLabel;
+
+#endif /* _PC_BIOS_S390_CCW_BOOTMAP_H */
--
1.8.5.5
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [Qemu-devel] [PATCH 03/10] pc-bios/s390-ccw: handle different sector sizes
2014-06-26 14:29 [Qemu-devel] [PATCH 00/10] pc-bios/s390-ccw: Add DASD IPL support Jens Freimann
2014-06-26 14:30 ` [Qemu-devel] [PATCH 01/10] pc-bios/s390-ccw: make checkpatch happy Jens Freimann
2014-06-26 14:30 ` [Qemu-devel] [PATCH 02/10] pc-bios/s390-ccw: cleanup and enhance bootmap defintions Jens Freimann
@ 2014-06-26 14:30 ` Jens Freimann
2014-06-26 14:35 ` Alexander Graf
2014-06-26 14:30 ` [Qemu-devel] [PATCH 04/10] pc-bios/s390-ccw: add some utility code Jens Freimann
` (7 subsequent siblings)
10 siblings, 1 reply; 19+ messages in thread
From: Jens Freimann @ 2014-06-26 14:30 UTC (permalink / raw)
To: Christian Borntraeger, Alexander Graf, Cornelia Huck
Cc: Eugene (jno) Dvurechenski, Jens Freimann, qemu-devel
From: "Eugene (jno) Dvurechenski" <jno@linux.vnet.ibm.com>
Use the virtio device's configuration to figure out the disk geometry
and use a sector size based upon the layout.
Signed-off-by: Eugene (jno) Dvurechenski <jno@linux.vnet.ibm.com>
Signed-off-by: Jens Freimann <jfrei@linux.vnet.ibm.com>
---
pc-bios/s390-ccw/bootmap.c | 3 +-
pc-bios/s390-ccw/s390-ccw.h | 2 +-
pc-bios/s390-ccw/virtio.c | 96 ++++++++++++++++++++++++++++++++++++++++++---
pc-bios/s390-ccw/virtio.h | 48 +++++++++++++++++++++++
4 files changed, 142 insertions(+), 7 deletions(-)
diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c
index c216030..79db3c3 100644
--- a/pc-bios/s390-ccw/bootmap.c
+++ b/pc-bios/s390-ccw/bootmap.c
@@ -10,6 +10,7 @@
#include "s390-ccw.h"
#include "bootmap.h"
+#include "virtio.h"
/* #define DEBUG_FALLBACK */
@@ -238,7 +239,7 @@ int zipl_load(void)
goto fail;
}
- ns_end = sec + SECTOR_SIZE;
+ ns_end = sec + virtio_get_block_size();
for (ns = (sec + pte_len); (ns + pte_len) < ns_end; ns++) {
prog_table_entry = (ScsiBlockPtr *)ns;
if (!prog_table_entry->blockno) {
diff --git a/pc-bios/s390-ccw/s390-ccw.h b/pc-bios/s390-ccw/s390-ccw.h
index fe1dd22..a2bd042 100644
--- a/pc-bios/s390-ccw/s390-ccw.h
+++ b/pc-bios/s390-ccw/s390-ccw.h
@@ -130,6 +130,6 @@ static inline void yield(void)
: "memory", "cc");
}
-#define SECTOR_SIZE 512
+#define SECTOR_SIZE 4096
#endif /* S390_CCW_H */
diff --git a/pc-bios/s390-ccw/virtio.c b/pc-bios/s390-ccw/virtio.c
index c845b14..31b23b0 100644
--- a/pc-bios/s390-ccw/virtio.c
+++ b/pc-bios/s390-ccw/virtio.c
@@ -202,7 +202,7 @@ static int vring_wait_reply(struct vring *vr, int timeout)
* Virtio block *
***********************************************/
-static int virtio_read_many(ulong sector, void *load_addr, int sec_num)
+int virtio_read_many(ulong sector, void *load_addr, int sec_num)
{
struct virtio_blk_outhdr out_hdr;
u8 status;
@@ -211,12 +211,12 @@ static int virtio_read_many(ulong sector, void *load_addr, int sec_num)
/* Tell the host we want to read */
out_hdr.type = VIRTIO_BLK_T_IN;
out_hdr.ioprio = 99;
- out_hdr.sector = sector;
+ out_hdr.sector = virtio_sector_adjust(sector);
vring_send_buf(&block, &out_hdr, sizeof(out_hdr), VRING_DESC_F_NEXT);
/* This is where we want to receive data */
- vring_send_buf(&block, load_addr, SECTOR_SIZE * sec_num,
+ vring_send_buf(&block, load_addr, virtio_get_block_size() * sec_num,
VRING_DESC_F_WRITE | VRING_HIDDEN_IS_CHAIN |
VRING_DESC_F_NEXT);
@@ -244,7 +244,7 @@ unsigned long virtio_load_direct(ulong rec_list1, ulong rec_list2,
int sec_len = rec_list2 >> 48;
ulong addr = (ulong)load_addr;
- if (sec_len != SECTOR_SIZE) {
+ if (sec_len != virtio_get_block_size()) {
return -1;
}
@@ -253,7 +253,7 @@ unsigned long virtio_load_direct(ulong rec_list1, ulong rec_list2,
if (status) {
virtio_panic("I/O Error");
}
- addr += sec_num * SECTOR_SIZE;
+ addr += sec_num * virtio_get_block_size();
return addr;
}
@@ -263,15 +263,95 @@ int virtio_read(ulong sector, void *load_addr)
return virtio_read_many(sector, load_addr, 1);
}
+static VirtioBlkConfig blk_cfg = {};
+static bool guessed_disk_nature;
+
+bool virtio_guessed_disk_nature(void)
+{
+ return guessed_disk_nature;
+}
+
+void virtio_assume_scsi(void)
+{
+ guessed_disk_nature = true;
+ blk_cfg.blk_size = 512;
+}
+
+void virtio_assume_eckd(void)
+{
+ guessed_disk_nature = true;
+ blk_cfg.blk_size = 4096;
+
+ /* this must be here to calculate code segment position */
+ blk_cfg.geometry.heads = 15;
+ blk_cfg.geometry.sectors = 12;
+}
+
+bool virtio_disk_is_scsi(void)
+{
+ if (guessed_disk_nature) {
+ return (blk_cfg.blk_size == 512);
+ }
+ return (blk_cfg.geometry.heads == 255)
+ && (blk_cfg.geometry.sectors == 63)
+ && (blk_cfg.blk_size == 512);
+}
+
+bool virtio_disk_is_eckd(void)
+{
+ if (guessed_disk_nature) {
+ return (blk_cfg.blk_size == 4096);
+ }
+ return (blk_cfg.geometry.heads == 15)
+ && (blk_cfg.geometry.sectors == 12)
+ && (blk_cfg.blk_size == 4096);
+}
+
+bool virtio_ipl_disk_is_valid(void)
+{
+ return blk_cfg.blk_size && (virtio_disk_is_scsi() || virtio_disk_is_eckd());
+}
+
+int virtio_get_block_size(void)
+{
+ return blk_cfg.blk_size;
+}
+
+uint16_t virtio_get_cylinders(void)
+{
+ return blk_cfg.geometry.cylinders;
+}
+
+uint8_t virtio_get_heads(void)
+{
+ return blk_cfg.geometry.heads;
+}
+
+uint8_t virtio_get_sectors(void)
+{
+ return blk_cfg.geometry.sectors;
+}
+
void virtio_setup_block(struct subchannel_id schid)
{
struct vq_info_block info;
struct vq_config_block config = {};
+ blk_cfg.blk_size = 0; /* mark "illegal" - setup started... */
+
virtio_reset(schid);
+ /*
+ * Skipping CCW_CMD_READ_FEAT. We're not doing anything fancy, and
+ * we'll just stop dead anyway if anything does not work like we
+ * expect it.
+ */
+
config.index = 0;
if (run_ccw(schid, CCW_CMD_READ_VQ_CONF, &config, sizeof(config))) {
+ virtio_panic("Could not get block device VQ configuration\n");
+ }
+ if (run_ccw(schid, CCW_CMD_READ_CONF, &blk_cfg, sizeof(blk_cfg))) {
virtio_panic("Could not get block device configuration\n");
}
vring_init(&block, config.num, (void *)(100 * 1024 * 1024),
@@ -286,6 +366,12 @@ void virtio_setup_block(struct subchannel_id schid)
if (!run_ccw(schid, CCW_CMD_SET_VQ, &info, sizeof(info))) {
virtio_set_status(schid, VIRTIO_CONFIG_S_DRIVER_OK);
}
+
+ if (!virtio_ipl_disk_is_valid()) {
+ /* make sure all getters but blocksize return 0 for invalid IPL disk */
+ memset(&blk_cfg, 0, sizeof(blk_cfg));
+ virtio_assume_scsi();
+ }
}
bool virtio_is_blk(struct subchannel_id schid)
diff --git a/pc-bios/s390-ccw/virtio.h b/pc-bios/s390-ccw/virtio.h
index c2990ea..f1fb1b0 100644
--- a/pc-bios/s390-ccw/virtio.h
+++ b/pc-bios/s390-ccw/virtio.h
@@ -161,4 +161,52 @@ struct virtio_blk_outhdr {
u64 sector;
};
+typedef struct VirtioBlkConfig {
+ u64 capacity; /* in 512-byte sectors */
+ u32 size_max; /* max segment size (if VIRTIO_BLK_F_SIZE_MAX) */
+ u32 seg_max; /* max number of segments (if VIRTIO_BLK_F_SEG_MAX) */
+
+ struct virtio_blk_geometry {
+ u16 cylinders;
+ u8 heads;
+ u8 sectors;
+ } geometry; /* (if VIRTIO_BLK_F_GEOMETRY) */
+
+ u32 blk_size; /* block size of device (if VIRTIO_BLK_F_BLK_SIZE) */
+
+ /* the next 4 entries are guarded by VIRTIO_BLK_F_TOPOLOGY */
+ u8 physical_block_exp; /* exponent for physical block per logical block */
+ u8 alignment_offset; /* alignment offset in logical blocks */
+ u16 min_io_size; /* min I/O size without performance penalty
+ in logical blocks */
+ u32 opt_io_size; /* optimal sustained I/O size in logical blocks */
+
+ u8 wce; /* writeback mode (if VIRTIO_BLK_F_CONFIG_WCE) */
+} __attribute__((packed)) VirtioBlkConfig;
+
+bool virtio_guessed_disk_nature(void);
+void virtio_assume_scsi(void);
+void virtio_assume_eckd(void);
+
+extern bool virtio_disk_is_scsi(void);
+extern bool virtio_disk_is_eckd(void);
+extern bool virtio_ipl_disk_is_valid(void);
+extern int virtio_get_block_size(void);
+extern uint16_t virtio_get_cylinders(void);
+extern uint8_t virtio_get_heads(void);
+extern uint8_t virtio_get_sectors(void);
+extern int virtio_read_many(ulong sector, void *load_addr, int sec_num);
+
+#define VIRTIO_SECTOR_SIZE 512
+
+static inline ulong virtio_eckd_sector_adjust(ulong sector)
+{
+ return sector * (virtio_get_block_size() / VIRTIO_SECTOR_SIZE);
+}
+
+static inline ulong virtio_sector_adjust(ulong sector)
+{
+ return virtio_disk_is_eckd() ? virtio_eckd_sector_adjust(sector) : sector;
+}
+
#endif /* VIRTIO_H */
--
1.8.5.5
^ permalink raw reply related [flat|nested] 19+ messages in thread
* Re: [Qemu-devel] [PATCH 03/10] pc-bios/s390-ccw: handle different sector sizes
2014-06-26 14:30 ` [Qemu-devel] [PATCH 03/10] pc-bios/s390-ccw: handle different sector sizes Jens Freimann
@ 2014-06-26 14:35 ` Alexander Graf
2014-06-26 15:08 ` Eugene "jno" Dvurechenski
0 siblings, 1 reply; 19+ messages in thread
From: Alexander Graf @ 2014-06-26 14:35 UTC (permalink / raw)
To: Jens Freimann, Christian Borntraeger, Cornelia Huck
Cc: Eugene (jno) Dvurechenski, qemu-devel
On 26.06.14 16:30, Jens Freimann wrote:
> From: "Eugene (jno) Dvurechenski" <jno@linux.vnet.ibm.com>
>
> Use the virtio device's configuration to figure out the disk geometry
> and use a sector size based upon the layout.
>
> Signed-off-by: Eugene (jno) Dvurechenski <jno@linux.vnet.ibm.com>
> Signed-off-by: Jens Freimann <jfrei@linux.vnet.ibm.com>
> ---
> pc-bios/s390-ccw/bootmap.c | 3 +-
> pc-bios/s390-ccw/s390-ccw.h | 2 +-
> pc-bios/s390-ccw/virtio.c | 96 ++++++++++++++++++++++++++++++++++++++++++---
> pc-bios/s390-ccw/virtio.h | 48 +++++++++++++++++++++++
> 4 files changed, 142 insertions(+), 7 deletions(-)
>
> diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c
> index c216030..79db3c3 100644
> --- a/pc-bios/s390-ccw/bootmap.c
> +++ b/pc-bios/s390-ccw/bootmap.c
> @@ -10,6 +10,7 @@
>
> #include "s390-ccw.h"
> #include "bootmap.h"
> +#include "virtio.h"
>
> /* #define DEBUG_FALLBACK */
>
> @@ -238,7 +239,7 @@ int zipl_load(void)
> goto fail;
> }
>
> - ns_end = sec + SECTOR_SIZE;
> + ns_end = sec + virtio_get_block_size();
> for (ns = (sec + pte_len); (ns + pte_len) < ns_end; ns++) {
> prog_table_entry = (ScsiBlockPtr *)ns;
> if (!prog_table_entry->blockno) {
> diff --git a/pc-bios/s390-ccw/s390-ccw.h b/pc-bios/s390-ccw/s390-ccw.h
> index fe1dd22..a2bd042 100644
> --- a/pc-bios/s390-ccw/s390-ccw.h
> +++ b/pc-bios/s390-ccw/s390-ccw.h
> @@ -130,6 +130,6 @@ static inline void yield(void)
> : "memory", "cc");
> }
>
> -#define SECTOR_SIZE 512
> +#define SECTOR_SIZE 4096
Why keep the define at all?
Alex
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [Qemu-devel] [PATCH 03/10] pc-bios/s390-ccw: handle different sector sizes
2014-06-26 14:35 ` Alexander Graf
@ 2014-06-26 15:08 ` Eugene "jno" Dvurechenski
2014-06-26 15:10 ` Alexander Graf
0 siblings, 1 reply; 19+ messages in thread
From: Eugene "jno" Dvurechenski @ 2014-06-26 15:08 UTC (permalink / raw)
To: Alexander Graf, Jens Freimann, Christian Borntraeger,
Cornelia Huck
Cc: qemu-devel
[-- Attachment #1.1: Type: text/plain, Size: 511 bytes --]
On 06/26/2014 06:35 PM, Alexander Graf wrote:
>> - ns_end = sec + SECTOR_SIZE;
>> + ns_end = sec + virtio_get_block_size();
...
>> -#define SECTOR_SIZE 512
>> +#define SECTOR_SIZE 4096
>
> Why keep the define at all?
Just to use as default value and in storage allocation (and similar
static calculations) now.
--
Best Regards,
Eugene "jno" Dvurechenski
zLinux (KVM) Development - Software Engineer
IBM Russia - Science & Technology Center
phone: +7 (495) 660 8940 ext. 1021
[-- Attachment #1.2: jno.vcf --]
[-- Type: text/x-vcard, Size: 385 bytes --]
begin:vcard
fn:Eugene Dvurechenski
n:Dvurechenski;Eugene
org:IBM Systems & Technology Group;IBM S&T Center, Russia
adr:;;Obrucheva st., bld.30/1, E2V, floor 4;Moscow;;117485;Russia
email;internet:jno@linux.vnet.ibm.com
title:Software Engineer
tel;work:+7 (495) 660 8940 ext. 1021
tel;cell:+7 (903) 790-07-49
x-mozilla-html:FALSE
url:http://fsw.su/
version:2.1
end:vcard
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 901 bytes --]
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [Qemu-devel] [PATCH 03/10] pc-bios/s390-ccw: handle different sector sizes
2014-06-26 15:08 ` Eugene "jno" Dvurechenski
@ 2014-06-26 15:10 ` Alexander Graf
0 siblings, 0 replies; 19+ messages in thread
From: Alexander Graf @ 2014-06-26 15:10 UTC (permalink / raw)
To: Eugene "jno" Dvurechenski, Jens Freimann,
Christian Borntraeger, Cornelia Huck
Cc: qemu-devel
On 26.06.14 17:08, Eugene "jno" Dvurechenski wrote:
>
> On 06/26/2014 06:35 PM, Alexander Graf wrote:
>>> - ns_end = sec + SECTOR_SIZE;
>>> + ns_end = sec + virtio_get_block_size();
> ...
>>> -#define SECTOR_SIZE 512
>>> +#define SECTOR_SIZE 4096
>> Why keep the define at all?
> Just to use as default value and in storage allocation (and similar
> static calculations) now.
Then either rename it MAX_SECTOR_SIZE and audit every single use of it
or try to convert everything to be dynamically sized - gcc should be
able to create arrays on the stack based on variables.
Alex
^ permalink raw reply [flat|nested] 19+ messages in thread
* [Qemu-devel] [PATCH 04/10] pc-bios/s390-ccw: add some utility code
2014-06-26 14:29 [Qemu-devel] [PATCH 00/10] pc-bios/s390-ccw: Add DASD IPL support Jens Freimann
` (2 preceding siblings ...)
2014-06-26 14:30 ` [Qemu-devel] [PATCH 03/10] pc-bios/s390-ccw: handle different sector sizes Jens Freimann
@ 2014-06-26 14:30 ` Jens Freimann
2014-06-26 14:30 ` [Qemu-devel] [PATCH 05/10] pc-bios/s390-ccw: Unify error handling Jens Freimann
` (6 subsequent siblings)
10 siblings, 0 replies; 19+ messages in thread
From: Jens Freimann @ 2014-06-26 14:30 UTC (permalink / raw)
To: Christian Borntraeger, Alexander Graf, Cornelia Huck
Cc: Eugene (jno) Dvurechenski, Jens Freimann, qemu-devel
From: "Eugene (jno) Dvurechenski" <jno@linux.vnet.ibm.com>
IPL_assert(term,message) is introduced to handle error conditions.
ebcdic_to_ascii() to convert chars (mostly to print VOLSERs).
read_block() provision for unified block-number handling.
Signed-off-by: Eugene (jno) Dvurechenski <jno@linux.vnet.ibm.com>
Reviewed-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Signed-off-by: Jens Freimann <jfrei@linux.vnet.ibm.com>
---
pc-bios/s390-ccw/bootmap.c | 15 +--------
pc-bios/s390-ccw/bootmap.h | 83 ++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 84 insertions(+), 14 deletions(-)
diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c
index 79db3c3..d2893e2 100644
--- a/pc-bios/s390-ccw/bootmap.c
+++ b/pc-bios/s390-ccw/bootmap.c
@@ -85,25 +85,12 @@ static int zipl_magic(uint8_t *ptr)
return 1;
}
-static inline bool unused_space(const void *p, unsigned int size)
-{
- int i;
- const unsigned char *m = p;
-
- for (i = 0; i < size; i++) {
- if (m[i] != FREE_SPACE_FILLER) {
- return false;
- }
- }
- return true;
-}
-
static int zipl_load_segment(ComponentEntry *entry)
{
const int max_entries = (SECTOR_SIZE / sizeof(ScsiBlockPtr));
ScsiBlockPtr *bprs = (void *)sec;
const int bprs_size = sizeof(sec);
- uint64_t blockno;
+ block_number_t blockno;
long address;
int i;
diff --git a/pc-bios/s390-ccw/bootmap.h b/pc-bios/s390-ccw/bootmap.h
index 59267b0..1846632 100644
--- a/pc-bios/s390-ccw/bootmap.h
+++ b/pc-bios/s390-ccw/bootmap.h
@@ -12,6 +12,10 @@
#define _PC_BIOS_S390_CCW_BOOTMAP_H
#include "s390-ccw.h"
+#include "virtio.h"
+
+typedef uint64_t block_number_t;
+#define NULL_BLOCK_NR 0xffffffffffffffff
#define FREE_SPACE_FILLER '\xAA'
@@ -251,4 +255,83 @@ typedef struct IplVolumeLabel {
};
} __attribute__((packed)) IplVolumeLabel;
+/* utility code below */
+
+static inline void IPL_assert(bool term, const char *message)
+{
+ if (!term) {
+ sclp_print("\n! ");
+ sclp_print(message);
+ virtio_panic(" !\n"); /* no return */
+ }
+}
+
+static const unsigned char ebc2asc[256] =
+ /* 0123456789abcdef0123456789abcdef */
+ "................................" /* 1F */
+ "................................" /* 3F */
+ " ...........<(+|&.........!$*);." /* 5F first.chr.here.is.real.space */
+ "-/.........,%_>?.........`:#@'=\""/* 7F */
+ ".abcdefghi.......jklmnopqr......" /* 9F */
+ "..stuvwxyz......................" /* BF */
+ ".ABCDEFGHI.......JKLMNOPQR......" /* DF */
+ "..STUVWXYZ......0123456789......";/* FF */
+
+static inline void ebcdic_to_ascii(const char *src,
+ char *dst,
+ unsigned int size)
+{
+ unsigned int i;
+ for (i = 0; i < size; i++) {
+ unsigned c = src[i];
+ dst[i] = ebc2asc[c];
+ }
+}
+
+static inline void print_volser(const void *volser)
+{
+ char ascii[8];
+
+ ebcdic_to_ascii((char *)volser, ascii, 6);
+ ascii[6] = '\0';
+ sclp_print("VOLSER=[");
+ sclp_print(ascii);
+ sclp_print("]\n");
+}
+
+static inline bool unused_space(const void *p, size_t size)
+{
+ size_t i;
+ const unsigned char *m = p;
+
+ for (i = 0; i < size; i++) {
+ if (m[i] != FREE_SPACE_FILLER) {
+ return false;
+ }
+ }
+ return true;
+}
+
+static inline bool is_null_block_number(block_number_t x)
+{
+ return x == NULL_BLOCK_NR;
+}
+
+static inline void read_block(block_number_t blockno,
+ void *buffer,
+ const char *errmsg)
+{
+ IPL_assert(virtio_read(blockno, buffer) == 0, errmsg);
+}
+
+static inline bool block_size_ok(uint32_t block_size)
+{
+ return block_size == virtio_get_block_size();
+}
+
+static inline bool magic_match(const void *data, const void *magic)
+{
+ return *((uint32_t *)data) == *((uint32_t *)magic);
+}
+
#endif /* _PC_BIOS_S390_CCW_BOOTMAP_H */
--
1.8.5.5
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [Qemu-devel] [PATCH 05/10] pc-bios/s390-ccw: Unify error handling
2014-06-26 14:29 [Qemu-devel] [PATCH 00/10] pc-bios/s390-ccw: Add DASD IPL support Jens Freimann
` (3 preceding siblings ...)
2014-06-26 14:30 ` [Qemu-devel] [PATCH 04/10] pc-bios/s390-ccw: add some utility code Jens Freimann
@ 2014-06-26 14:30 ` Jens Freimann
2014-06-26 14:30 ` [Qemu-devel] [PATCH 06/10] pc-bios/s390-ccw: Add fill_hex_val func to provide better msgs Jens Freimann
` (5 subsequent siblings)
10 siblings, 0 replies; 19+ messages in thread
From: Jens Freimann @ 2014-06-26 14:30 UTC (permalink / raw)
To: Christian Borntraeger, Alexander Graf, Cornelia Huck
Cc: Eugene (jno) Dvurechenski, Jens Freimann, qemu-devel
From: "Eugene (jno) Dvurechenski" <jno@linux.vnet.ibm.com>
Convert to IPL_assert and friends
Signed-off-by: Eugene (jno) Dvurechenski <jno@linux.vnet.ibm.com>
Signed-off-by: Jens Freimann <jfrei@linux.vnet.ibm.com>
---
pc-bios/s390-ccw/bootmap.c | 82 ++++++++++++---------------------------------
pc-bios/s390-ccw/main.c | 13 ++++---
pc-bios/s390-ccw/s390-ccw.h | 2 +-
3 files changed, 31 insertions(+), 66 deletions(-)
diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c
index d2893e2..9e342c9 100644
--- a/pc-bios/s390-ccw/bootmap.c
+++ b/pc-bios/s390-ccw/bootmap.c
@@ -85,7 +85,7 @@ static int zipl_magic(uint8_t *ptr)
return 1;
}
-static int zipl_load_segment(ComponentEntry *entry)
+static void zipl_load_segment(ComponentEntry *entry)
{
const int max_entries = (SECTOR_SIZE / sizeof(ScsiBlockPtr));
ScsiBlockPtr *bprs = (void *)sec;
@@ -102,10 +102,8 @@ static int zipl_load_segment(ComponentEntry *entry)
do {
memset(bprs, FREE_SPACE_FILLER, bprs_size);
- if (virtio_read(blockno, (uint8_t *)bprs)) {
- debug_print_int("failed reading bprs at", blockno);
- goto fail;
- }
+ debug_print_int("reading bprs at", blockno);
+ read_block(blockno, bprs, "zipl_load_segment: cannot read block");
for (i = 0;; i++) {
u64 *cur_desc = (void *)&bprs[i];
@@ -133,21 +131,13 @@ static int zipl_load_segment(ComponentEntry *entry)
}
address = virtio_load_direct(cur_desc[0], cur_desc[1], 0,
(void *)address);
- if (address == -1) {
- goto fail;
- }
+ IPL_assert(address != -1, "zipl_load_segment: wrong IPL address");
}
} while (blockno);
-
- return 0;
-
-fail:
- sclp_print("failed loading segment\n");
- return -1;
}
/* Run a zipl program */
-static int zipl_run(ScsiBlockPtr *pte)
+static void zipl_run(ScsiBlockPtr *pte)
{
ComponentHeader *header;
ComponentEntry *entry;
@@ -156,75 +146,53 @@ static int zipl_run(ScsiBlockPtr *pte)
virtio_read(pte->blockno, tmp_sec);
header = (ComponentHeader *)tmp_sec;
- if (!zipl_magic(tmp_sec)) {
- goto fail;
- }
+ IPL_assert(zipl_magic(tmp_sec), "zipl_run: zipl_magic");
- if (header->type != ZIPL_COMP_HEADER_IPL) {
- goto fail;
- }
+ IPL_assert(header->type == ZIPL_COMP_HEADER_IPL,
+ "zipl_run: wrong header type");
dputs("start loading images\n");
/* Load image(s) into RAM */
entry = (ComponentEntry *)(&header[1]);
while (entry->component_type == ZIPL_COMP_ENTRY_LOAD) {
- if (zipl_load_segment(entry) < 0) {
- goto fail;
- }
+ zipl_load_segment(entry);
entry++;
- if ((uint8_t *)(&entry[1]) > (tmp_sec + SECTOR_SIZE)) {
- goto fail;
- }
+ IPL_assert((uint8_t *)(&entry[1]) <= (tmp_sec + SECTOR_SIZE),
+ "zipl_run: wrong entry size");
}
- if (entry->component_type != ZIPL_COMP_ENTRY_EXEC) {
- goto fail;
- }
+ IPL_assert(entry->component_type == ZIPL_COMP_ENTRY_EXEC,
+ "zipl_run: no EXEC entry");
/* should not return */
jump_to_IPL_code(entry->load_address);
-
- return 0;
-
-fail:
- sclp_print("failed running zipl\n");
- return -1;
}
-int zipl_load(void)
+void zipl_load(void)
{
ScsiMbr *mbr = (void *)sec;
uint8_t *ns, *ns_end;
int program_table_entries = 0;
const int pte_len = sizeof(ScsiBlockPtr);
ScsiBlockPtr *prog_table_entry;
- const char *error = "";
/* Grab the MBR */
- virtio_read(0, (void *)mbr);
+ read_block(0, mbr, "zipl_load: cannot read block 0");
dputs("checking magic\n");
- if (!zipl_magic(mbr->magic)) {
- error = "zipl_magic 1";
- goto fail;
- }
+ IPL_assert(zipl_magic(mbr->magic), "zipl_load: zipl_magic 1");
debug_print_int("program table", mbr->blockptr.blockno);
/* Parse the program table */
- if (virtio_read(mbr->blockptr.blockno, sec)) {
- error = "virtio_read";
- goto fail;
- }
+ read_block(mbr->blockptr.blockno, sec,
+ "zipl_load: cannot read program table");
- if (!zipl_magic(sec)) {
- error = "zipl_magic 2";
- goto fail;
- }
+ IPL_assert(zipl_magic(sec), "zipl_load: zipl_magic 2");
ns_end = sec + virtio_get_block_size();
for (ns = (sec + pte_len); (ns + pte_len) < ns_end; ns++) {
@@ -238,19 +206,11 @@ int zipl_load(void)
debug_print_int("program table entries", program_table_entries);
- if (!program_table_entries) {
- goto fail;
- }
+ IPL_assert(program_table_entries, "zipl_load: no program table");
/* Run the default entry */
prog_table_entry = (ScsiBlockPtr *)(sec + pte_len);
- return zipl_run(prog_table_entry);
-
-fail:
- sclp_print("failed loading zipl: ");
- sclp_print(error);
- sclp_print("\n");
- return -1;
+ zipl_run(prog_table_entry); /* no return */
}
diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c
index 5c33766..dbfb40e 100644
--- a/pc-bios/s390-ccw/main.c
+++ b/pc-bios/s390-ccw/main.c
@@ -9,6 +9,7 @@
*/
#include "s390-ccw.h"
+#include "virtio.h"
char stack[PAGE_SIZE * 8] __attribute__((__aligned__(PAGE_SIZE)));
uint64_t boot_value;
@@ -64,6 +65,10 @@ static void virtio_setup(uint64_t dev_info)
}
virtio_setup_block(blk_schid);
+
+ if (!virtio_ipl_disk_is_valid()) {
+ virtio_panic("No valid hard disk detected.\n");
+ }
}
int main(void)
@@ -72,8 +77,8 @@ int main(void)
debug_print_int("boot reg[7] ", boot_value);
virtio_setup(boot_value);
- if (zipl_load() < 0)
- sclp_print("Failed to load OS from hard disk\n");
- disabled_wait();
- while (1) { }
+ zipl_load(); /* no return */
+
+ virtio_panic("Failed to load OS from hard disk\n");
+ return 0; /* make compiler happy */
}
diff --git a/pc-bios/s390-ccw/s390-ccw.h b/pc-bios/s390-ccw/s390-ccw.h
index a2bd042..d1c3c42 100644
--- a/pc-bios/s390-ccw/s390-ccw.h
+++ b/pc-bios/s390-ccw/s390-ccw.h
@@ -64,7 +64,7 @@ int virtio_read(ulong sector, void *load_addr);
int enable_mss_facility(void);
/* bootmap.c */
-int zipl_load(void);
+void zipl_load(void);
static inline void *memset(void *s, int c, size_t n)
{
--
1.8.5.5
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [Qemu-devel] [PATCH 06/10] pc-bios/s390-ccw: Add fill_hex_val func to provide better msgs
2014-06-26 14:29 [Qemu-devel] [PATCH 00/10] pc-bios/s390-ccw: Add DASD IPL support Jens Freimann
` (4 preceding siblings ...)
2014-06-26 14:30 ` [Qemu-devel] [PATCH 05/10] pc-bios/s390-ccw: Unify error handling Jens Freimann
@ 2014-06-26 14:30 ` Jens Freimann
2014-06-26 14:30 ` [Qemu-devel] [PATCH 07/10] pc-bios/s390-ccw: factor out ipl code Jens Freimann
` (4 subsequent siblings)
10 siblings, 0 replies; 19+ messages in thread
From: Jens Freimann @ 2014-06-26 14:30 UTC (permalink / raw)
To: Christian Borntraeger, Alexander Graf, Cornelia Huck
Cc: Eugene (jno) Dvurechenski, qemu-devel
From: "Eugene (jno) Dvurechenski" <jno@linux.vnet.ibm.com>
Factor out helper function for dumping a hex value into a buffer.
Signed-off-by: Eugene (jno) Dvurechenski <jno@linux.vnet.ibm.com>
---
pc-bios/s390-ccw/s390-ccw.h | 16 +++++++++++-----
1 file changed, 11 insertions(+), 5 deletions(-)
diff --git a/pc-bios/s390-ccw/s390-ccw.h b/pc-bios/s390-ccw/s390-ccw.h
index d1c3c42..1d650d8 100644
--- a/pc-bios/s390-ccw/s390-ccw.h
+++ b/pc-bios/s390-ccw/s390-ccw.h
@@ -86,15 +86,21 @@ static inline void fill_hex(char *out, unsigned char val)
out[1] = hex[val & 0xf];
}
-static inline void print_int(const char *desc, u64 addr)
+static inline void fill_hex_val(char *out, void *ptr, unsigned size)
{
- unsigned char *addr_c = (unsigned char *)&addr;
- char out[] = ": 0xffffffffffffffff\n";
+ unsigned char *value = ptr;
unsigned int i;
- for (i = 0; i < sizeof(addr); i++) {
- fill_hex(&out[4 + (i*2)], addr_c[i]);
+ for (i = 0; i < size; i++) {
+ fill_hex(&out[i*2], value[i]);
}
+}
+
+static inline void print_int(const char *desc, u64 addr)
+{
+ char out[] = ": 0xffffffffffffffff\n";
+
+ fill_hex_val(&out[4], &addr, sizeof(addr));
sclp_print(desc);
sclp_print(out);
--
1.8.5.5
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [Qemu-devel] [PATCH 07/10] pc-bios/s390-ccw: factor out ipl code
2014-06-26 14:29 [Qemu-devel] [PATCH 00/10] pc-bios/s390-ccw: Add DASD IPL support Jens Freimann
` (5 preceding siblings ...)
2014-06-26 14:30 ` [Qemu-devel] [PATCH 06/10] pc-bios/s390-ccw: Add fill_hex_val func to provide better msgs Jens Freimann
@ 2014-06-26 14:30 ` Jens Freimann
2014-06-26 14:30 ` [Qemu-devel] [PATCH 08/10] pc-bios/s390-ccw: IPL from CDL-formatted ECKD DASD Jens Freimann
` (3 subsequent siblings)
10 siblings, 0 replies; 19+ messages in thread
From: Jens Freimann @ 2014-06-26 14:30 UTC (permalink / raw)
To: Christian Borntraeger, Alexander Graf, Cornelia Huck
Cc: Eugene (jno) Dvurechenski, Jens Freimann, qemu-devel
From: "Eugene (jno) Dvurechenski" <jno@linux.vnet.ibm.com>
Move the scsi-disk specific ipl code from zipl_load() into a new
function ipl_scsi(). This makes it easier to add ipl routines for other
disk types.
Signed-off-by: Eugene (jno) Dvurechenski <jno@linux.vnet.ibm.com>
Signed-off-by: Jens Freimann <jfrei@linux.vnet.ibm.com>
---
pc-bios/s390-ccw/bootmap.c | 82 +++++++++++++++++++++++++---------------------
1 file changed, 45 insertions(+), 37 deletions(-)
diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c
index 9e342c9..992c9aa 100644
--- a/pc-bios/s390-ccw/bootmap.c
+++ b/pc-bios/s390-ccw/bootmap.c
@@ -12,7 +12,9 @@
#include "bootmap.h"
#include "virtio.h"
+#ifdef DEBUG
/* #define DEBUG_FALLBACK */
+#endif
#ifdef DEBUG_FALLBACK
#define dputs(txt) \
@@ -23,7 +25,7 @@
#endif
/* Scratch space */
-static uint8_t sec[SECTOR_SIZE] __attribute__((__aligned__(SECTOR_SIZE)));
+static uint8_t sec[SECTOR_SIZE*4] __attribute__((__aligned__(PAGE_SIZE)));
typedef struct ResetInfo {
uint32_t ipl_mask;
@@ -71,19 +73,9 @@ static void jump_to_IPL_code(uint64_t address)
virtio_panic("\n! IPL returns !\n");
}
-/* Check for ZIPL magic. Returns 0 if not matched. */
-static int zipl_magic(uint8_t *ptr)
-{
- uint32_t *p = (void *)ptr;
- uint32_t *z = (void *)ZIPL_MAGIC;
-
- if (*p != *z) {
- debug_print_int("invalid magic", *p);
- virtio_panic("invalid magic");
- }
-
- return 1;
-}
+/***********************************************************************
+ * IPL a SCSI disk
+ */
static void zipl_load_segment(ComponentEntry *entry)
{
@@ -91,8 +83,10 @@ static void zipl_load_segment(ComponentEntry *entry)
ScsiBlockPtr *bprs = (void *)sec;
const int bprs_size = sizeof(sec);
block_number_t blockno;
- long address;
+ uint64_t address;
int i;
+ char err_msg[] = "zIPL failed to read BPRS at 0xZZZZZZZZZZZZZZZZ";
+ char *blk_no = &err_msg[30]; /* where to print blockno in (those ZZs) */
blockno = entry->data.blockno;
address = entry->load_address;
@@ -102,11 +96,11 @@ static void zipl_load_segment(ComponentEntry *entry)
do {
memset(bprs, FREE_SPACE_FILLER, bprs_size);
- debug_print_int("reading bprs at", blockno);
- read_block(blockno, bprs, "zipl_load_segment: cannot read block");
+ fill_hex_val(blk_no, &blockno, sizeof(blockno));
+ read_block(blockno, bprs, err_msg);
for (i = 0;; i++) {
- u64 *cur_desc = (void *)&bprs[i];
+ uint64_t *cur_desc = (void *)&bprs[i];
blockno = bprs[i].blockno;
if (!blockno) {
@@ -131,7 +125,7 @@ static void zipl_load_segment(ComponentEntry *entry)
}
address = virtio_load_direct(cur_desc[0], cur_desc[1], 0,
(void *)address);
- IPL_assert(address != -1, "zipl_load_segment: wrong IPL address");
+ IPL_assert(address != -1, "zIPL load segment failed");
}
} while (blockno);
}
@@ -143,13 +137,11 @@ static void zipl_run(ScsiBlockPtr *pte)
ComponentEntry *entry;
uint8_t tmp_sec[SECTOR_SIZE];
- virtio_read(pte->blockno, tmp_sec);
+ read_block(pte->blockno, tmp_sec, "Cannot read header");
header = (ComponentHeader *)tmp_sec;
- IPL_assert(zipl_magic(tmp_sec), "zipl_run: zipl_magic");
-
- IPL_assert(header->type == ZIPL_COMP_HEADER_IPL,
- "zipl_run: wrong header type");
+ IPL_assert(magic_match(tmp_sec, ZIPL_MAGIC), "No zIPL magic");
+ IPL_assert(header->type == ZIPL_COMP_HEADER_IPL, "Bad header type");
dputs("start loading images\n");
@@ -161,17 +153,16 @@ static void zipl_run(ScsiBlockPtr *pte)
entry++;
IPL_assert((uint8_t *)(&entry[1]) <= (tmp_sec + SECTOR_SIZE),
- "zipl_run: wrong entry size");
+ "Wrong entry value");
}
- IPL_assert(entry->component_type == ZIPL_COMP_ENTRY_EXEC,
- "zipl_run: no EXEC entry");
+ IPL_assert(entry->component_type == ZIPL_COMP_ENTRY_EXEC, "No EXEC entry");
/* should not return */
jump_to_IPL_code(entry->load_address);
}
-void zipl_load(void)
+static void ipl_scsi(void)
{
ScsiMbr *mbr = (void *)sec;
uint8_t *ns, *ns_end;
@@ -179,20 +170,16 @@ void zipl_load(void)
const int pte_len = sizeof(ScsiBlockPtr);
ScsiBlockPtr *prog_table_entry;
- /* Grab the MBR */
- read_block(0, mbr, "zipl_load: cannot read block 0");
-
- dputs("checking magic\n");
-
- IPL_assert(zipl_magic(mbr->magic), "zipl_load: zipl_magic 1");
+ /* The 0-th block (MBR) was already read into sec[] */
+ sclp_print("Using SCSI scheme.\n");
debug_print_int("program table", mbr->blockptr.blockno);
/* Parse the program table */
read_block(mbr->blockptr.blockno, sec,
- "zipl_load: cannot read program table");
+ "Error reading Program Table");
- IPL_assert(zipl_magic(sec), "zipl_load: zipl_magic 2");
+ IPL_assert(magic_match(sec, ZIPL_MAGIC), "No zIPL magic");
ns_end = sec + virtio_get_block_size();
for (ns = (sec + pte_len); (ns + pte_len) < ns_end; ns++) {
@@ -206,7 +193,7 @@ void zipl_load(void)
debug_print_int("program table entries", program_table_entries);
- IPL_assert(program_table_entries, "zipl_load: no program table");
+ IPL_assert(program_table_entries != 0, "Empty Program Table");
/* Run the default entry */
@@ -214,3 +201,24 @@ void zipl_load(void)
zipl_run(prog_table_entry); /* no return */
}
+
+/***********************************************************************
+ * IPL starts here
+ */
+
+void zipl_load(void)
+{
+ ScsiMbr *mbr = (void *)sec;
+
+ /* Grab the MBR */
+ memset(sec, FREE_SPACE_FILLER, sizeof(sec));
+ read_block(0, mbr, "Cannot read block 0");
+
+ dputs("checking magic\n");
+
+ if (magic_match(mbr->magic, ZIPL_MAGIC)) {
+ ipl_scsi(); /* no return */
+ }
+
+ virtio_panic("\n* invalid MBR magic *\n");
+}
--
1.8.5.5
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [Qemu-devel] [PATCH 08/10] pc-bios/s390-ccw: IPL from CDL-formatted ECKD DASD
2014-06-26 14:29 [Qemu-devel] [PATCH 00/10] pc-bios/s390-ccw: Add DASD IPL support Jens Freimann
` (6 preceding siblings ...)
2014-06-26 14:30 ` [Qemu-devel] [PATCH 07/10] pc-bios/s390-ccw: factor out ipl code Jens Freimann
@ 2014-06-26 14:30 ` Jens Freimann
2014-06-26 14:30 ` [Qemu-devel] [PATCH 09/10] pc-bios/s390-ccw: IPL from LDL/CMS-formatted " Jens Freimann
` (2 subsequent siblings)
10 siblings, 0 replies; 19+ messages in thread
From: Jens Freimann @ 2014-06-26 14:30 UTC (permalink / raw)
To: Christian Borntraeger, Alexander Graf, Cornelia Huck
Cc: Eugene (jno) Dvurechenski, Jens Freimann, qemu-devel
From: "Eugene (jno) Dvurechenski" <jno@linux.vnet.ibm.com>
Add code that allows us to start from ECKD DASD using the z/OS
compatible disk layout (CDL), which is the most common format for ECKD
DASD.
Signed-off-by: Eugene (jno) Dvurechenski <jno@linux.vnet.ibm.com>
Signed-off-by: Jens Freimann <jfrei@linux.vnet.ibm.com>
---
pc-bios/s390-ccw/bootmap.c | 168 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 168 insertions(+)
diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c
index 992c9aa..6f73ffc 100644
--- a/pc-bios/s390-ccw/bootmap.c
+++ b/pc-bios/s390-ccw/bootmap.c
@@ -74,6 +74,171 @@ static void jump_to_IPL_code(uint64_t address)
}
/***********************************************************************
+ * IPL an ECKD DASD (CDL or LDL/CMS format)
+ */
+
+static unsigned char _bprs[8*1024]; /* guessed "max" ECKD sector size */
+const int max_bprs_entries = sizeof(_bprs) / sizeof(ExtEckdBlockPtr);
+
+static bool eckd_valid_address(BootMapPointer *p)
+{
+ const uint64_t cylinder = p->eckd.cylinder
+ + ((p->eckd.head & 0xfff0) << 12);
+ const uint64_t head = p->eckd.head & 0x000f;
+
+ if (head >= virtio_get_heads()
+ || p->eckd.sector > virtio_get_sectors()
+ || p->eckd.sector <= 0) {
+ return false;
+ }
+
+ if (!virtio_guessed_disk_nature() && cylinder >= virtio_get_cylinders()) {
+ return false;
+ }
+
+ return true;
+}
+
+static block_number_t eckd_block_num(BootMapPointer *p)
+{
+ const uint64_t sectors = virtio_get_sectors();
+ const uint64_t heads = virtio_get_heads();
+ const uint64_t cylinder = p->eckd.cylinder
+ + ((p->eckd.head & 0xfff0) << 12);
+ const uint64_t head = p->eckd.head & 0x000f;
+ const block_number_t block = sectors * heads * cylinder
+ + sectors * head
+ + p->eckd.sector
+ - 1; /* block nr starts with zero */
+ return block;
+}
+
+static block_number_t load_eckd_segments(block_number_t blk, uint64_t *address)
+{
+ block_number_t block_nr;
+ int j, rc;
+ BootMapPointer *bprs = (void *)_bprs;
+ bool more_data;
+
+ memset(_bprs, FREE_SPACE_FILLER, sizeof(_bprs));
+ read_block(blk, bprs, "BPRS read failed");
+
+ do {
+ more_data = false;
+ for (j = 0;; j++) {
+ block_nr = eckd_block_num((void *)&(bprs[j].xeckd));
+ if (is_null_block_number(block_nr)) { /* end of chunk */
+ break;
+ }
+
+ /* we need the updated blockno for the next indirect entry
+ * in the chain, but don't want to advance address
+ */
+ if (j == (max_bprs_entries - 1)) {
+ break;
+ }
+
+ IPL_assert(block_size_ok(bprs[j].xeckd.bptr.size),
+ "bad chunk block size");
+ IPL_assert(eckd_valid_address(&bprs[j]), "bad chunk ECKD addr");
+
+ if ((bprs[j].xeckd.bptr.count == 0) && unused_space(&(bprs[j+1]),
+ sizeof(EckdBlockPtr))) {
+ /* This is a "continue" pointer.
+ * This ptr should be the last one in the current
+ * script section.
+ * I.e. the next ptr must point to the unused memory area
+ */
+ memset(_bprs, FREE_SPACE_FILLER, sizeof(_bprs));
+ read_block(block_nr, bprs, "BPRS continuation read failed");
+ more_data = true;
+ break;
+ }
+
+ /* Load (count+1) blocks of code at (block_nr)
+ * to memory (address).
+ */
+ rc = virtio_read_many(block_nr, (void *)(*address),
+ bprs[j].xeckd.bptr.count+1);
+ IPL_assert(rc == 0, "code chunk read failed");
+
+ *address += (bprs[j].xeckd.bptr.count+1) * virtio_get_block_size();
+ }
+ } while (more_data);
+ return block_nr;
+}
+
+static void run_eckd_boot_script(block_number_t mbr_block_nr)
+{
+ int i;
+ block_number_t block_nr;
+ uint64_t address;
+ ScsiMbr *scsi_mbr = (void *)sec;
+ BootMapScript *bms = (void *)sec;
+
+ memset(sec, FREE_SPACE_FILLER, sizeof(sec));
+ read_block(mbr_block_nr, sec, "Cannot read MBR");
+
+ block_nr = eckd_block_num((void *)&(scsi_mbr->blockptr));
+
+ memset(sec, FREE_SPACE_FILLER, sizeof(sec));
+ read_block(block_nr, sec, "Cannot read Boot Map Script");
+
+ for (i = 0; bms->entry[i].type == BOOT_SCRIPT_LOAD; i++) {
+ address = bms->entry[i].address.load_address;
+ block_nr = eckd_block_num(&(bms->entry[i].blkptr));
+
+ do {
+ block_nr = load_eckd_segments(block_nr, &address);
+ } while (block_nr != -1);
+ }
+
+ IPL_assert(bms->entry[i].type == BOOT_SCRIPT_EXEC,
+ "Unknown script entry type");
+ jump_to_IPL_code(bms->entry[i].address.load_address); /* no return */
+}
+
+static void ipl_eckd(void)
+{
+ XEckdMbr *mbr;
+ Ipl2 *ipl2 = (void *)sec;
+ IplVolumeLabel *vlbl = (void *)sec;
+ block_number_t block_nr;
+
+ sclp_print("Using ECKD scheme.\n");
+ if (virtio_guessed_disk_nature()) {
+ sclp_print("Using guessed DASD geometry.\n");
+ virtio_assume_eckd();
+ }
+ /* we have just read the block #0 and recognized it as "IPL1" */
+
+ memset(sec, FREE_SPACE_FILLER, sizeof(sec));
+ read_block(1, ipl2, "Cannot read IPL2 record at block 1");
+ IPL_assert(magic_match(ipl2, IPL2_MAGIC), "No IPL2 record");
+
+ mbr = &ipl2->u.x.mbr;
+ IPL_assert(magic_match(mbr, ZIPL_MAGIC), "No zIPL section in IPL2 record.");
+ IPL_assert(block_size_ok(mbr->blockptr.xeckd.bptr.size),
+ "Bad block size in zIPL section of IPL2 record.");
+ IPL_assert(mbr->dev_type == DEV_TYPE_ECKD,
+ "Non-ECKD device type in zIPL section of IPL2 record.");
+
+ /* save pointer to Boot Script */
+ block_nr = eckd_block_num((void *)&(mbr->blockptr));
+
+ memset(sec, FREE_SPACE_FILLER, sizeof(sec));
+ read_block(2, vlbl, "Cannot read Volume Label at block 2");
+ IPL_assert(magic_match(vlbl->key, VOL1_MAGIC),
+ "Invalid magic of volume label block");
+ IPL_assert(magic_match(vlbl->f.key, VOL1_MAGIC),
+ "Invalid magic of volser block");
+ print_volser(vlbl->f.volser);
+
+ run_eckd_boot_script(block_nr);
+ /* no return */
+}
+
+/***********************************************************************
* IPL a SCSI disk
*/
@@ -219,6 +384,9 @@ void zipl_load(void)
if (magic_match(mbr->magic, ZIPL_MAGIC)) {
ipl_scsi(); /* no return */
}
+ if (magic_match(mbr->magic, IPL1_MAGIC)) {
+ ipl_eckd(); /* CDL ECKD; no return */
+ }
virtio_panic("\n* invalid MBR magic *\n");
}
--
1.8.5.5
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [Qemu-devel] [PATCH 09/10] pc-bios/s390-ccw: IPL from LDL/CMS-formatted ECKD DASD
2014-06-26 14:29 [Qemu-devel] [PATCH 00/10] pc-bios/s390-ccw: Add DASD IPL support Jens Freimann
` (7 preceding siblings ...)
2014-06-26 14:30 ` [Qemu-devel] [PATCH 08/10] pc-bios/s390-ccw: IPL from CDL-formatted ECKD DASD Jens Freimann
@ 2014-06-26 14:30 ` Jens Freimann
2014-06-26 14:30 ` [Qemu-devel] [PATCH 10/10] pc-bios/s390-ccw: update binary Jens Freimann
2014-06-26 14:42 ` [Qemu-devel] [PATCH 00/10] pc-bios/s390-ccw: Add DASD IPL support Alexander Graf
10 siblings, 0 replies; 19+ messages in thread
From: Jens Freimann @ 2014-06-26 14:30 UTC (permalink / raw)
To: Christian Borntraeger, Alexander Graf, Cornelia Huck
Cc: Eugene (jno) Dvurechenski, Jens Freimann, qemu-devel
From: "Eugene (jno) Dvurechenski" <jno@linux.vnet.ibm.com>
Add code that allows us to start from two further ECKD DASD disk
layouts: LDL (Linux disk layout) and CMS (cms-formatted disk).
Signed-off-by: Eugene (jno) Dvurechenski <jno@linux.vnet.ibm.com>
Signed-off-by: Jens Freimann <jfrei@linux.vnet.ibm.com>
---
pc-bios/s390-ccw/bootmap.c | 92 ++++++++++++++++++++++++++++++++++++++++++----
pc-bios/s390-ccw/bootmap.h | 7 ++++
2 files changed, 92 insertions(+), 7 deletions(-)
diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c
index 6f73ffc..30088f2 100644
--- a/pc-bios/s390-ccw/bootmap.c
+++ b/pc-bios/s390-ccw/bootmap.c
@@ -80,6 +80,17 @@ static void jump_to_IPL_code(uint64_t address)
static unsigned char _bprs[8*1024]; /* guessed "max" ECKD sector size */
const int max_bprs_entries = sizeof(_bprs) / sizeof(ExtEckdBlockPtr);
+static inline void verify_boot_info(BootInfo *bip)
+{
+ IPL_assert(magic_match(bip->magic, ZIPL_MAGIC), "No zIPL magic");
+ IPL_assert(bip->version == BOOT_INFO_VERSION, "Wrong zIPL version");
+ IPL_assert(bip->bp_type == BOOT_INFO_BP_TYPE_IPL, "DASD is not for IPL");
+ IPL_assert(bip->dev_type == BOOT_INFO_DEV_TYPE_ECKD, "DASD is not ECKD");
+ IPL_assert(bip->flags == BOOT_INFO_FLAGS_ARCH, "Not for this arch");
+ IPL_assert(block_size_ok(bip->bp.ipl.bm_ptr.eckd.bptr.size),
+ "Bad block size in zIPL section of the 1st record.");
+}
+
static bool eckd_valid_address(BootMapPointer *p)
{
const uint64_t cylinder = p->eckd.cylinder
@@ -198,19 +209,15 @@ static void run_eckd_boot_script(block_number_t mbr_block_nr)
jump_to_IPL_code(bms->entry[i].address.load_address); /* no return */
}
-static void ipl_eckd(void)
+static void ipl_eckd_cdl(void)
{
XEckdMbr *mbr;
Ipl2 *ipl2 = (void *)sec;
IplVolumeLabel *vlbl = (void *)sec;
block_number_t block_nr;
- sclp_print("Using ECKD scheme.\n");
- if (virtio_guessed_disk_nature()) {
- sclp_print("Using guessed DASD geometry.\n");
- virtio_assume_eckd();
- }
/* we have just read the block #0 and recognized it as "IPL1" */
+ sclp_print("CDL\n");
memset(sec, FREE_SPACE_FILLER, sizeof(sec));
read_block(1, ipl2, "Cannot read IPL2 record at block 1");
@@ -238,6 +245,57 @@ static void ipl_eckd(void)
/* no return */
}
+static void ipl_eckd_ldl(ECKD_IPL_mode_t mode)
+{
+ LDL_VTOC *vlbl = (void *)sec; /* already read, 3rd block */
+ char msg[4] = { '?', '.', '\n', '\0' };
+ block_number_t block_nr;
+ BootInfo *bip;
+
+ sclp_print((mode == ECKD_CMS) ? "CMS" : "LDL");
+ sclp_print(" version ");
+ switch (vlbl->LDL_version) {
+ case LDL1_VERSION:
+ msg[0] = '1';
+ break;
+ case LDL2_VERSION:
+ msg[0] = '2';
+ break;
+ default:
+ msg[0] = vlbl->LDL_version;
+ msg[0] &= 0x0f; /* convert EBCDIC */
+ msg[0] |= 0x30; /* to ASCII (digit) */
+ msg[1] = '?';
+ break;
+ }
+ sclp_print(msg);
+ print_volser(vlbl->volser);
+
+ /* DO NOT read BootMap pointer (only one, xECKD) at block #2 */
+
+ memset(sec, FREE_SPACE_FILLER, sizeof(sec));
+ read_block(0, sec, "Cannot read block 0");
+ bip = (void *)(sec + 0x70); /* "boot info" is "eckd mbr" for LDL */
+ verify_boot_info(bip);
+
+ block_nr = eckd_block_num((void *)&(bip->bp.ipl.bm_ptr.eckd.bptr));
+ run_eckd_boot_script(block_nr);
+ /* no return */
+}
+
+static void ipl_eckd(ECKD_IPL_mode_t mode)
+{
+ switch (mode) {
+ case ECKD_CDL:
+ ipl_eckd_cdl(); /* no return */
+ case ECKD_CMS:
+ case ECKD_LDL:
+ ipl_eckd_ldl(mode); /* no return */
+ default:
+ virtio_panic("\n! Unknown ECKD IPL mode !\n");
+ }
+}
+
/***********************************************************************
* IPL a SCSI disk
*/
@@ -374,6 +432,7 @@ static void ipl_scsi(void)
void zipl_load(void)
{
ScsiMbr *mbr = (void *)sec;
+ LDL_VTOC *vlbl = (void *)sec;
/* Grab the MBR */
memset(sec, FREE_SPACE_FILLER, sizeof(sec));
@@ -384,8 +443,27 @@ void zipl_load(void)
if (magic_match(mbr->magic, ZIPL_MAGIC)) {
ipl_scsi(); /* no return */
}
+
+ /* We have failed to follow the SCSI scheme, so */
+ sclp_print("Using ECKD scheme.\n");
+ if (virtio_guessed_disk_nature()) {
+ sclp_print("Using guessed DASD geometry.\n");
+ virtio_assume_eckd();
+ }
+
if (magic_match(mbr->magic, IPL1_MAGIC)) {
- ipl_eckd(); /* CDL ECKD; no return */
+ ipl_eckd(ECKD_CDL); /* no return */
+ }
+
+ /* LDL/CMS? */
+ memset(sec, FREE_SPACE_FILLER, sizeof(sec));
+ read_block(2, vlbl, "Cannot read block 2");
+
+ if (magic_match(vlbl->magic, CMS1_MAGIC)) {
+ ipl_eckd(ECKD_CMS); /* no return */
+ }
+ if (magic_match(vlbl->magic, LNX1_MAGIC)) {
+ ipl_eckd(ECKD_LDL); /* no return */
}
virtio_panic("\n* invalid MBR magic *\n");
diff --git a/pc-bios/s390-ccw/bootmap.h b/pc-bios/s390-ccw/bootmap.h
index 1846632..30ef22f 100644
--- a/pc-bios/s390-ccw/bootmap.h
+++ b/pc-bios/s390-ccw/bootmap.h
@@ -255,6 +255,13 @@ typedef struct IplVolumeLabel {
};
} __attribute__((packed)) IplVolumeLabel;
+typedef enum {
+ ECKD_NO_IPL,
+ ECKD_CDL,
+ ECKD_CMS,
+ ECKD_LDL,
+} ECKD_IPL_mode_t;
+
/* utility code below */
static inline void IPL_assert(bool term, const char *message)
--
1.8.5.5
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [Qemu-devel] [PATCH 10/10] pc-bios/s390-ccw: update binary
2014-06-26 14:29 [Qemu-devel] [PATCH 00/10] pc-bios/s390-ccw: Add DASD IPL support Jens Freimann
` (8 preceding siblings ...)
2014-06-26 14:30 ` [Qemu-devel] [PATCH 09/10] pc-bios/s390-ccw: IPL from LDL/CMS-formatted " Jens Freimann
@ 2014-06-26 14:30 ` Jens Freimann
2014-06-26 14:42 ` [Qemu-devel] [PATCH 00/10] pc-bios/s390-ccw: Add DASD IPL support Alexander Graf
10 siblings, 0 replies; 19+ messages in thread
From: Jens Freimann @ 2014-06-26 14:30 UTC (permalink / raw)
To: Christian Borntraeger, Alexander Graf, Cornelia Huck
Cc: Jens Freimann, qemu-devel
Signed-off-by: Jens Freimann <jfrei@linux.vnet.ibm.com>
---
pc-bios/s390-ccw.img | Bin 9432 -> 17624 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
diff --git a/pc-bios/s390-ccw.img b/pc-bios/s390-ccw.img
index 1c7f7640fc0c5f2505c4f1114a21b3b712852dbc..603e19e003d574b24bb3b97bacda2bf38077e8fd 100644
GIT binary patch
literal 17624
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
Li@}&D!B77Q%@485
delta 2868
zcmY*b4@_0p8UOBk_wg<dq!-HIDT4PQrl?e(_y<Lr-iHj-O8aJQDsx#Oh3Yd1h_BXk
z$sSqA3L9;KtNjy`mSlaN*4fm8osw*NH%+x$)3RkQW?S2rzPNRzCKvazDpc-%=iG;p
zlbrjV^ZoyR=R4=UYyHx-ZG$DbS$*UT-65qztE+r!(AlWLp{@ccIP^lvBARemq;e`@
z$_^tibfHSZ=K-TcQcH_<&h;i1%%foSV)D^D7M9NE#9T4+I+5oxOF`Q^*=Yr-%tQ#!
z44bjF_$MTBxof+rlJfBNq=u+6TW#B{mj);EkVH1SLT>-T_;cjWzw96FHz_y%N0OLH
z87xX2tPktgpiz|nYP^6btXgmN4^l3Bn<&(56`qQpC&^#qU$iSYL0q9=4J)^8<D^;~
zdmllv^ZM{zkyNcw8ft<uc1zhwIQ@<NcT+>6KQXV{wmrc7<c@!6-_9@eSM;ltTM*!h
z%eDL~ZOJQTb(Akkt>>lsFLK?2kNg#!=l%%tUi)t>Wq&SwHgj%F`WF~q35EX%g+U=)
z%WD!rcS7FBju3%E>>N-@**!q<Q>z&$^5i;!V)Jg36z)YjKVCqK!B-mA|0Rn^qsdRF
zkfV2M9`c9S%$??>ro|u%nbyd-Of@2jgE$28lwWmQBPsz0MTA%?Qdw|}Oc{W`9O^PP
zvze5wa#HOoq(N3fF7S^g!(H%~?CJ88YzC1+iY;`}@W~*t%|Nrz{tj`L3CX`jwCYyW
z9Ho|IxEY4yE_wnXkC~{Y;R|yR-@l4V{%q=4f5J8afpIu`hn8HpU-!W>e{wB)a{*gO
zY7&P_$}t`+N=iE5G|>8;@#A8DOfKdvh4?>1h$YFenGOif4sd<|TEvc%%8C$xp#f9&
ztKe;Be<Bt1eaz+H{g&e)zb>FAv3{GcX_|LbQva`tGV-Z(vh(HyKu-Y~iAC)jW-fZW
zzBQ>i(4d(X8IP8f#N;SPcJ>igj?z;0)lgTL7E*7HjB9idb`ODfaq@z-+qp3E3;d|r
zaw36Y&^!%T9^~;|Jphg5s;lnPWZpeDxl(vvj5Adl77CjJTrcD(Y@W%Bar9f$Mp1f_
zD{l29)d@cZ*d?kIhMue53D^Ln6~I`5v4&cv1>OO+P)e{eY6xi>4w$lp>>H$f3wkM(
zc7|JPI1}3vvd{04orv+Q-IoQ9K7r#Sz**cEs^?ty4Z+ou`V_Ke%Wc~+_ojsOBCqex
zyFe)}Jbj7PKhO*k=(yKwhT&nB7twee2rt$(lu=GHs1H;R8=nOpbh$q>vP-q>#(k`s
za$uq~?l(4;?sPS78XGA6T8gom*#vGrA+uj$USdt~zl~HpLzzi!N};k)a0-vk6z>OR
zR|RyR#ts<cnA>1cjgHtMWF@RgatnTw*cZTZ34BT5y9B>+)H9{>cHgBWRb3-_cP{DW
zNmX_6r%6|EUX6yntU3=;AQIMeUQIUdA7fzIb}baPMo|36+$qQ3ZpFR-!rJFFkSo*B
z%NMz34;VixugQ@Tye0M=<f-iGFiw>3X?fGy>S#*8MyqXQ3fgiLt%Wy2+2kJ$lQqT@
zo%L`?{3~_U8iPh<NC$1=jfDgGR@~~oq-K3UL-98<bi7G_Fh@vvTs8WZpN!o(%AY!*
zr%&NDCf^hfRBBkZ&iYrv*%~-I%TX52ekz{DZ;&KO4{*-(@%eT_;t`UUP<j*vzh{N1
zZ1R2z;-`b(m=YI1y;00K;>NP>X{Yxri*Qk)tWmabmEr$={6kzZg!=AlhTj<+-^#nk
z$ZIcT0kUxt_lXt|tqJ*xaX(ccwD8A0(U&5rIwW<&D~4&2QeC6+x3hXvva6Y>jHRYS
z#w#m#8`%}5G5a>GFrMEQ-a!=UINZ`6Y1Iz2?2SB4&$L9^+gi2u&X(3l$6oDF+uj3h
z9Z?_o0vfcn?zZT&-5rOtfNxH-``L~TuK9eVtKCO*IMN-BbUxMH*3vqsG3SeGRBJ>V
zMR2b*jNbtKR9i>q_5ra-e<0WB2zkWzu%Jdm<vQb?$~Cc7v~Bfc+V{J=JG)6La&LwX
z|1)r(ZQnFOM?n7xdd0R=2qqC|J1E}H|Dj;1*|xuhzSIYL1r++XqM)X2-_}9D!s)}#
zrP%fi>|7f`kAQ|juYrE=2+phyi$QeZX;2=NjES{RN<TET^@UQ8p|2}k0~0YS>tFV~
zl<}f>K-r#Sx*Xm*khl2Kn~+X%im(Z88#6PUE&rBb@<Pa)a1U?_tqpg*{W5dTUq1LU
zmwFTOB~CGFF&Bf6$@w1KF)>cnzvxXbxqqpKZy-P8Fpcx;{XVJHVP^CgiS-3LrCw+2
zO;;qXyC;WV`08>@w`0t|JQv~1n^4k~5&A;J`j{(#f6mxgRkBw~IonJ>rx^P&D*$IU
z-*^+5A}rkPpBJt_YkSVMG>ndZx&)ua?J$Pt>5pBg>W~65_(+Z14UaxSwTFIwqT!)c
z2W~wTo{TU3AX4`D;o7k?A)n;RI%k-*8#0634aS6F*W$0JQMIKiFYBDcD@s$T&*<5*
oD$n^_O62@ag-WksayA-^kK#0S?HjJ!z&+JHjPG;ed$um{f5+^#kN^Mx
--
1.8.5.5
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [Qemu-devel] [PATCH 00/10] pc-bios/s390-ccw: Add DASD IPL support
2014-06-26 14:29 [Qemu-devel] [PATCH 00/10] pc-bios/s390-ccw: Add DASD IPL support Jens Freimann
` (9 preceding siblings ...)
2014-06-26 14:30 ` [Qemu-devel] [PATCH 10/10] pc-bios/s390-ccw: update binary Jens Freimann
@ 2014-06-26 14:42 ` Alexander Graf
2014-06-27 7:53 ` Christian Borntraeger
10 siblings, 1 reply; 19+ messages in thread
From: Alexander Graf @ 2014-06-26 14:42 UTC (permalink / raw)
To: Jens Freimann, Christian Borntraeger, Cornelia Huck; +Cc: qemu-devel
On 26.06.14 16:29, Jens Freimann wrote:
> Conny, Alex, Christian,
>
> here are some fixes for the s390-ccw bios. It's a mixture of
> additional features (DASD IPL support for different formats)
> and cleanups.
From a quick glimpse it looks quite clean and straight forward, but I'd
like to make sure we get rid completely of the static sector size
assumption.
Also, are we guaranteed that virtio always uses 512 byte block size? Or
was that just an internal API thing?
Alex
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [Qemu-devel] [PATCH 00/10] pc-bios/s390-ccw: Add DASD IPL support
2014-06-26 14:42 ` [Qemu-devel] [PATCH 00/10] pc-bios/s390-ccw: Add DASD IPL support Alexander Graf
@ 2014-06-27 7:53 ` Christian Borntraeger
2014-06-27 9:05 ` Alexander Graf
0 siblings, 1 reply; 19+ messages in thread
From: Christian Borntraeger @ 2014-06-27 7:53 UTC (permalink / raw)
To: Alexander Graf, Jens Freimann, Cornelia Huck; +Cc: qemu-devel
On 26/06/14 16:42, Alexander Graf wrote:
>
> On 26.06.14 16:29, Jens Freimann wrote:
>> Conny, Alex, Christian,
>>
>> here are some fixes for the s390-ccw bios. It's a mixture of
>> additional features (DASD IPL support for different formats)
>> and cleanups.
>
> From a quick glimpse it looks quite clean and straight forward, but I'd like to make sure we get rid completely of the static sector size assumption.
Should be. I guess s/SECTOR_SIZE/MAX_SECTOR_SIZE/g would be ok for you then?
>
> Also, are we guaranteed that virtio always uses 512 byte block size? Or was that just an internal API thing?
The virtio-blk API always talks in 512 byte sectors, no matter the block size.
Overall this is a nice improvement of the boot code - if possible I would like to see that in 2.1.
Conny, can you carry that in your tree (with s/SECTOR_SIZE/MAX_SECTOR_SIZE/g)?
Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
for the series.
Christian
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [Qemu-devel] [PATCH 00/10] pc-bios/s390-ccw: Add DASD IPL support
2014-06-27 7:53 ` Christian Borntraeger
@ 2014-06-27 9:05 ` Alexander Graf
2014-06-27 9:27 ` Christian Borntraeger
0 siblings, 1 reply; 19+ messages in thread
From: Alexander Graf @ 2014-06-27 9:05 UTC (permalink / raw)
To: Christian Borntraeger; +Cc: Cornelia Huck, Jens Freimann, qemu-devel@nongnu.org
> Am 27.06.2014 um 09:53 schrieb Christian Borntraeger <borntraeger@de.ibm.com>:
>
>> On 26/06/14 16:42, Alexander Graf wrote:
>>
>>> On 26.06.14 16:29, Jens Freimann wrote:
>>> Conny, Alex, Christian,
>>>
>>> here are some fixes for the s390-ccw bios. It's a mixture of
>>> additional features (DASD IPL support for different formats)
>>> and cleanups.
>>
>> From a quick glimpse it looks quite clean and straight forward, but I'd like to make sure we get rid completely of the static sector size assumption.
>
> Should be. I guess s/SECTOR_SIZE/MAX_SECTOR_SIZE/g would be ok for you then?
I'm not 100% convinced that we're safe on all users of SECTOR_SIZE. So please make sure to replace the occasions manually and audit every single one.
Alex
>>
>> Also, are we guaranteed that virtio always uses 512 byte block size? Or was that just an internal API thing?
>
> The virtio-blk API always talks in 512 byte sectors, no matter the block size.
>
> Overall this is a nice improvement of the boot code - if possible I would like to see that in 2.1.
>
> Conny, can you carry that in your tree (with s/SECTOR_SIZE/MAX_SECTOR_SIZE/g)?
>
> Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
>
> for the series.
>
>
> Christian
>
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [Qemu-devel] [PATCH 00/10] pc-bios/s390-ccw: Add DASD IPL support
2014-06-27 9:05 ` Alexander Graf
@ 2014-06-27 9:27 ` Christian Borntraeger
2014-06-27 9:47 ` Cornelia Huck
0 siblings, 1 reply; 19+ messages in thread
From: Christian Borntraeger @ 2014-06-27 9:27 UTC (permalink / raw)
To: Alexander Graf; +Cc: Cornelia Huck, Jens Freimann, qemu-devel@nongnu.org
On 27/06/14 11:05, Alexander Graf wrote:
>
>
>> Am 27.06.2014 um 09:53 schrieb Christian Borntraeger <borntraeger@de.ibm.com>:
>>
>>> On 26/06/14 16:42, Alexander Graf wrote:
>>>
>>>> On 26.06.14 16:29, Jens Freimann wrote:
>>>> Conny, Alex, Christian,
>>>>
>>>> here are some fixes for the s390-ccw bios. It's a mixture of
>>>> additional features (DASD IPL support for different formats)
>>>> and cleanups.
>>>
>>> From a quick glimpse it looks quite clean and straight forward, but I'd like to make sure we get rid completely of the static sector size assumption.
>>
>> Should be. I guess s/SECTOR_SIZE/MAX_SECTOR_SIZE/g would be ok for you then?
>
> I'm not 100% convinced that we're safe on all users of SECTOR_SIZE. So please make sure to replace the occasions manually and audit every single one.
Yes, a mindless sed, would also replace VIRTIO_SECTOR_SIZE with VIRTIO_MAX_SECTOR_SIZE.
Fortunately there are only 3 place in bootmap.c. Should be simple enough to review.
>
> Alex
>
>>>
>>> Also, are we guaranteed that virtio always uses 512 byte block size? Or was that just an internal API thing?
>>
>> The virtio-blk API always talks in 512 byte sectors, no matter the block size.
>>
>> Overall this is a nice improvement of the boot code - if possible I would like to see that in 2.1.
>>
>> Conny, can you carry that in your tree (with s/SECTOR_SIZE/MAX_SECTOR_SIZE/g)?
>>
>> Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
>>
>> for the series.
>>
>>
>> Christian
>>
>
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [Qemu-devel] [PATCH 00/10] pc-bios/s390-ccw: Add DASD IPL support
2014-06-27 9:27 ` Christian Borntraeger
@ 2014-06-27 9:47 ` Cornelia Huck
0 siblings, 0 replies; 19+ messages in thread
From: Cornelia Huck @ 2014-06-27 9:47 UTC (permalink / raw)
To: Christian Borntraeger
Cc: Jens Freimann, Alexander Graf, qemu-devel@nongnu.org
On Fri, 27 Jun 2014 11:27:12 +0200
Christian Borntraeger <borntraeger@de.ibm.com> wrote:
> On 27/06/14 11:05, Alexander Graf wrote:
> >
> >
> >> Am 27.06.2014 um 09:53 schrieb Christian Borntraeger <borntraeger@de.ibm.com>:
> >>
> >>> On 26/06/14 16:42, Alexander Graf wrote:
> >>>
> >>>> On 26.06.14 16:29, Jens Freimann wrote:
> >>>> Conny, Alex, Christian,
> >>>>
> >>>> here are some fixes for the s390-ccw bios. It's a mixture of
> >>>> additional features (DASD IPL support for different formats)
> >>>> and cleanups.
> >>>
> >>> From a quick glimpse it looks quite clean and straight forward, but I'd like to make sure we get rid completely of the static sector size assumption.
> >>
> >> Should be. I guess s/SECTOR_SIZE/MAX_SECTOR_SIZE/g would be ok for you then?
> >
> > I'm not 100% convinced that we're safe on all users of SECTOR_SIZE. So please make sure to replace the occasions manually and audit every single one.
>
> Yes, a mindless sed, would also replace VIRTIO_SECTOR_SIZE with VIRTIO_MAX_SECTOR_SIZE.
> Fortunately there are only 3 place in bootmap.c. Should be simple enough to review.
Yes, all places that use it want a MAX_SECTOR_SIZE. All places using
the actual sector size are now using the helper function.
> >>>
> >>> Also, are we guaranteed that virtio always uses 512 byte block size? Or was that just an internal API thing?
> >>
> >> The virtio-blk API always talks in 512 byte sectors, no matter the block size.
> >>
> >> Overall this is a nice improvement of the boot code - if possible I would like to see that in 2.1.
> >>
> >> Conny, can you carry that in your tree (with s/SECTOR_SIZE/MAX_SECTOR_SIZE/g)?
> >>
> >> Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
> >>
> >> for the series.
Will push out shortly.
Unless there are objections, I'll send a pull request for this.
^ permalink raw reply [flat|nested] 19+ messages in thread