[...] > > +struct IPLBlockPVComp { > + uint64_t tweak_pref; > + uint64_t addr; > + uint64_t size; > +} QEMU_PACKED;
QEMU_PACKED should not be needed. > +typedef struct IPLBlockPVComp IPLBlockPVComp; > + > +struct IPLBlockPV { > + uint8_t reserved[84]; "reserved0" > + uint8_t reserved67[3]; Where does that magic 67 come from? (84 dec is 54 hex) > + uint8_t version; So, to this point we spent 88 bytes == 11 * uint64_t. > + uint32_t num_comp; ... so after this, all uint64_t (and components) are mis-aligned by 32bit - is that correct? > + uint64_t pv_header_addr; > + uint64_t pv_header_len; > + struct IPLBlockPVComp components[]; > +} QEMU_PACKED; > +typedef struct IPLBlockPV IPLBlockPV; > + > struct IplBlockCcw { > uint8_t reserved0[85]; > uint8_t ssid; > @@ -71,6 +89,7 @@ union IplParameterBlock { > union { > IplBlockCcw ccw; > IplBlockFcp fcp; > + IPLBlockPV pv; > IplBlockQemuScsi scsi; > }; > } QEMU_PACKED; > @@ -84,9 +103,11 @@ union IplParameterBlock { > typedef union IplParameterBlock IplParameterBlock; > > int s390_ipl_set_loadparm(uint8_t *loadparm); > +int s390_ipl_pv_check_comp(IplParameterBlock *iplb); > void s390_ipl_update_diag308(IplParameterBlock *iplb); > void s390_ipl_prepare_cpu(S390CPU *cpu); > IplParameterBlock *s390_ipl_get_iplb(void); > +IplParameterBlock *s390_ipl_get_iplb_secure(void); > > enum s390_reset { > /* default is a reset not triggered by a CPU e.g. issued by QMP */ > @@ -94,6 +115,7 @@ enum s390_reset { > S390_RESET_REIPL, > S390_RESET_MODIFIED_CLEAR, > S390_RESET_LOAD_NORMAL, > + S390_RESET_PV, I do wonder if that should be called S390_RESET_PV_START > }; > void s390_ipl_reset_request(CPUState *cs, enum s390_reset reset_type); > void s390_ipl_get_reset_request(CPUState **cs, enum s390_reset *reset_type); > @@ -133,6 +155,7 @@ struct S390IPLState { > /*< private >*/ > DeviceState parent_obj; > IplParameterBlock iplb; > + IplParameterBlock iplb_pbt5; > QemuIplParameters qipl; > uint64_t start_addr; > uint64_t compat_start_addr; > @@ -140,6 +163,7 @@ struct S390IPLState { > uint64_t compat_bios_start_addr; > bool enforce_bios; > bool iplb_valid; > + bool iplb_valid_pbt5; > bool netboot; > /* reset related properties don't have to be migrated or reset */ > enum s390_reset reset_type; > @@ -161,9 +185,11 @@ QEMU_BUILD_BUG_MSG(offsetof(S390IPLState, iplb) & 3, > "alignment of iplb wrong"); > > #define S390_IPL_TYPE_FCP 0x00 > #define S390_IPL_TYPE_CCW 0x02 > +#define S390_IPL_TYPE_PV 0x05 > #define S390_IPL_TYPE_QEMU_SCSI 0xff > > #define S390_IPLB_HEADER_LEN 8 > +#define S390_IPLB_MIN_PV_LEN 148 > #define S390_IPLB_MIN_CCW_LEN 200 > #define S390_IPLB_MIN_FCP_LEN 384 > #define S390_IPLB_MIN_QEMU_SCSI_LEN 200 > @@ -185,4 +211,11 @@ static inline bool iplb_valid_fcp(IplParameterBlock > *iplb) > iplb->pbt == S390_IPL_TYPE_FCP; > } > > +static inline bool iplb_valid_se(IplParameterBlock *iplb) s/_se/_pv/ ? Or was that intended? > +{ > + return be32_to_cpu(iplb->len) >= S390_IPLB_MIN_PV_LEN && > + iplb->pbt == S390_IPL_TYPE_PV; > +} > + > + Maybe drop one empty line > #endif > diff --git a/target/s390x/diag.c b/target/s390x/diag.c > index b5aec06d6b..112a6c92e0 100644 > --- a/target/s390x/diag.c > +++ b/target/s390x/diag.c [...] -- Thanks, David / dhildenb