qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

s390-ccw.h (4387B)


      1 /*
      2  * S390 CCW boot loader
      3  *
      4  * Copyright (c) 2013 Alexander Graf <agraf@suse.de>
      5  *
      6  * This work is licensed under the terms of the GNU GPL, version 2 or (at
      7  * your option) any later version. See the COPYING file in the top-level
      8  * directory.
      9  */
     10 
     11 #ifndef S390_CCW_H
     12 #define S390_CCW_H
     13 
     14 /* #define DEBUG */
     15 
     16 typedef unsigned char      u8;
     17 typedef unsigned short     u16;
     18 typedef unsigned int       u32;
     19 typedef unsigned long long u64;
     20 typedef unsigned long      ulong;
     21 typedef unsigned char      __u8;
     22 typedef unsigned short     __u16;
     23 typedef unsigned int       __u32;
     24 typedef unsigned long long __u64;
     25 
     26 #define true 1
     27 #define false 0
     28 #define PAGE_SIZE 4096
     29 
     30 #define EIO     1
     31 #define EBUSY   2
     32 #define ENODEV  3
     33 
     34 #ifndef NULL
     35 #define NULL    0
     36 #endif
     37 #ifndef MIN
     38 #define MIN(a, b) (((a) < (b)) ? (a) : (b))
     39 #endif
     40 #ifndef MIN_NON_ZERO
     41 #define MIN_NON_ZERO(a, b) ((a) == 0 ? (b) : \
     42                             ((b) == 0 ? (a) : (MIN(a, b))))
     43 #endif
     44 
     45 #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
     46 
     47 #include "cio.h"
     48 #include "iplb.h"
     49 
     50 /* start.s */
     51 void disabled_wait(void) __attribute__ ((__noreturn__));
     52 void consume_sclp_int(void);
     53 void consume_io_int(void);
     54 
     55 /* main.c */
     56 void write_subsystem_identification(void);
     57 void write_iplb_location(void);
     58 extern char stack[PAGE_SIZE * 8] __attribute__((__aligned__(PAGE_SIZE)));
     59 unsigned int get_loadparm_index(void);
     60 void main(void);
     61 
     62 /* sclp.c */
     63 void sclp_print(const char *string);
     64 void sclp_set_write_mask(uint32_t receive_mask, uint32_t send_mask);
     65 void sclp_setup(void);
     66 void sclp_get_loadparm_ascii(char *loadparm);
     67 int sclp_read(char *str, size_t count);
     68 
     69 /* virtio.c */
     70 unsigned long virtio_load_direct(ulong rec_list1, ulong rec_list2,
     71                                  ulong subchan_id, void *load_addr);
     72 bool virtio_is_supported(SubChannelId schid);
     73 int virtio_blk_setup_device(SubChannelId schid);
     74 int virtio_read(ulong sector, void *load_addr);
     75 
     76 /* bootmap.c */
     77 void zipl_load(void);
     78 
     79 /* jump2ipl.c */
     80 void write_reset_psw(uint64_t psw);
     81 void jump_to_IPL_code(uint64_t address);
     82 void jump_to_low_kernel(void);
     83 
     84 /* menu.c */
     85 void menu_set_parms(uint8_t boot_menu_flag, uint32_t boot_menu_timeout);
     86 int menu_get_zipl_boot_index(const char *menu_data);
     87 bool menu_is_enabled_zipl(void);
     88 int menu_get_enum_boot_index(bool *valid_entries);
     89 bool menu_is_enabled_enum(void);
     90 
     91 #define MAX_BOOT_ENTRIES  31
     92 
     93 __attribute__ ((__noreturn__))
     94 static inline void panic(const char *string)
     95 {
     96     sclp_print(string);
     97     disabled_wait();
     98 }
     99 
    100 static inline void fill_hex(char *out, unsigned char val)
    101 {
    102     const char hex[] = "0123456789abcdef";
    103 
    104     out[0] = hex[(val >> 4) & 0xf];
    105     out[1] = hex[val & 0xf];
    106 }
    107 
    108 static inline void fill_hex_val(char *out, void *ptr, unsigned size)
    109 {
    110     unsigned char *value = ptr;
    111     unsigned int i;
    112 
    113     for (i = 0; i < size; i++) {
    114         fill_hex(&out[i*2], value[i]);
    115     }
    116 }
    117 
    118 static inline void print_int(const char *desc, u64 addr)
    119 {
    120     char out[] = ": 0xffffffffffffffff\n";
    121 
    122     fill_hex_val(&out[4], &addr, sizeof(addr));
    123 
    124     sclp_print(desc);
    125     sclp_print(out);
    126 }
    127 
    128 static inline void debug_print_int(const char *desc, u64 addr)
    129 {
    130 #ifdef DEBUG
    131     print_int(desc, addr);
    132 #endif
    133 }
    134 
    135 static inline void debug_print_addr(const char *desc, void *p)
    136 {
    137 #ifdef DEBUG
    138     debug_print_int(desc, (unsigned int)(unsigned long)p);
    139 #endif
    140 }
    141 
    142 /***********************************************
    143  *           Hypercall functions               *
    144  ***********************************************/
    145 
    146 #define KVM_S390_VIRTIO_NOTIFY          0
    147 #define KVM_S390_VIRTIO_RESET           1
    148 #define KVM_S390_VIRTIO_SET_STATUS      2
    149 #define KVM_S390_VIRTIO_CCW_NOTIFY      3
    150 
    151 #define MAX_SECTOR_SIZE 4096
    152 
    153 static inline void IPL_assert(bool term, const char *message)
    154 {
    155     if (!term) {
    156         sclp_print("\n! ");
    157         sclp_print(message);
    158         panic(" !\n"); /* no return */
    159     }
    160 }
    161 
    162 static inline void IPL_check(bool term, const char *message)
    163 {
    164     if (!term) {
    165         sclp_print("\n! WARNING: ");
    166         sclp_print(message);
    167         sclp_print(" !\n");
    168     }
    169 }
    170 
    171 extern const unsigned char ebc2asc[256];
    172 static inline void ebcdic_to_ascii(const char *src,
    173                                    char *dst,
    174                                    unsigned int size)
    175 {
    176     unsigned int i;
    177 
    178     for (i = 0; i < size; i++) {
    179         unsigned c = src[i];
    180         dst[i] = ebc2asc[c];
    181     }
    182 }
    183 
    184 #endif /* S390_CCW_H */