| /* |
| * QEMU S390 IPL Block |
| * |
| * Copyright 2015 IBM Corp. |
| * Author(s): Alexander Yarygin <yarygin@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 IPLB_H |
| #define IPLB_H |
| |
| struct IplBlockCcw { |
| uint64_t netboot_start_addr; |
| uint8_t reserved0[77]; |
| uint8_t ssid; |
| uint16_t devno; |
| uint8_t vm_flags; |
| uint8_t reserved3[3]; |
| uint32_t vm_parm_len; |
| uint8_t nss_name[8]; |
| uint8_t vm_parm[64]; |
| uint8_t reserved4[8]; |
| } __attribute__ ((packed)); |
| typedef struct IplBlockCcw IplBlockCcw; |
| |
| struct IplBlockFcp { |
| uint8_t reserved1[305 - 1]; |
| uint8_t opt; |
| uint8_t reserved2[3]; |
| uint16_t reserved3; |
| uint16_t devno; |
| uint8_t reserved4[4]; |
| uint64_t wwpn; |
| uint64_t lun; |
| uint32_t bootprog; |
| uint8_t reserved5[12]; |
| uint64_t br_lba; |
| uint32_t scp_data_len; |
| uint8_t reserved6[260]; |
| uint8_t scp_data[]; |
| } __attribute__ ((packed)); |
| typedef struct IplBlockFcp IplBlockFcp; |
| |
| struct IplBlockQemuScsi { |
| uint32_t lun; |
| uint16_t target; |
| uint16_t channel; |
| uint8_t reserved0[77]; |
| uint8_t ssid; |
| uint16_t devno; |
| } __attribute__ ((packed)); |
| typedef struct IplBlockQemuScsi IplBlockQemuScsi; |
| |
| struct IplParameterBlock { |
| uint32_t len; |
| uint8_t reserved0[3]; |
| uint8_t version; |
| uint32_t blk0_len; |
| uint8_t pbt; |
| uint8_t flags; |
| uint16_t reserved01; |
| uint8_t loadparm[8]; |
| union { |
| IplBlockCcw ccw; |
| IplBlockFcp fcp; |
| IplBlockQemuScsi scsi; |
| }; |
| } __attribute__ ((packed)); |
| typedef struct IplParameterBlock IplParameterBlock; |
| |
| extern IplParameterBlock iplb __attribute__((__aligned__(PAGE_SIZE))); |
| |
| #define S390_IPL_TYPE_FCP 0x00 |
| #define S390_IPL_TYPE_CCW 0x02 |
| #define S390_IPL_TYPE_QEMU_SCSI 0xff |
| |
| static inline bool store_iplb(IplParameterBlock *iplb) |
| { |
| register unsigned long addr asm("0") = (unsigned long) iplb; |
| register unsigned long rc asm("1") = 0; |
| |
| asm volatile ("diag %0,%2,0x308\n" |
| : "+d" (addr), "+d" (rc) |
| : "d" (6) |
| : "memory", "cc"); |
| return rc == 0x01; |
| } |
| |
| #endif /* IPLB_H */ |