qemu/pc-bios/s390-ccw/s390-ccw.h
<<
>>
Prefs
   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
  16typedef unsigned char      u8;
  17typedef unsigned short     u16;
  18typedef unsigned int       u32;
  19typedef unsigned long long u64;
  20typedef unsigned long      ulong;
  21typedef long               size_t;
  22typedef int                bool;
  23typedef unsigned char      uint8_t;
  24typedef unsigned short     uint16_t;
  25typedef unsigned int       uint32_t;
  26typedef unsigned long long uint64_t;
  27typedef unsigned char      __u8;
  28typedef unsigned short     __u16;
  29typedef unsigned int       __u32;
  30typedef unsigned long long __u64;
  31
  32#define true 1
  33#define false 0
  34#define PAGE_SIZE 4096
  35
  36#ifndef EIO
  37#define EIO     1
  38#endif
  39#ifndef EBUSY
  40#define EBUSY   2
  41#endif
  42#ifndef NULL
  43#define NULL    0
  44#endif
  45
  46#include "cio.h"
  47
  48typedef struct irb Irb;
  49typedef struct ccw1 Ccw1;
  50typedef struct cmd_orb CmdOrb;
  51typedef struct schib Schib;
  52typedef struct chsc_area_sda ChscAreaSda;
  53typedef struct senseid SenseId;
  54typedef struct subchannel_id SubChannelId;
  55
  56/* start.s */
  57void disabled_wait(void);
  58void consume_sclp_int(void);
  59
  60/* main.c */
  61void panic(const char *string);
  62void write_subsystem_identification(void);
  63extern char stack[PAGE_SIZE * 8] __attribute__((__aligned__(PAGE_SIZE)));
  64extern uint64_t boot_value;
  65
  66/* sclp-ascii.c */
  67void sclp_print(const char *string);
  68void sclp_setup(void);
  69
  70/* virtio.c */
  71unsigned long virtio_load_direct(ulong rec_list1, ulong rec_list2,
  72                                 ulong subchan_id, void *load_addr);
  73bool virtio_is_supported(SubChannelId schid);
  74void virtio_setup_device(SubChannelId schid);
  75int virtio_read(ulong sector, void *load_addr);
  76int enable_mss_facility(void);
  77ulong get_second(void);
  78
  79/* bootmap.c */
  80void zipl_load(void);
  81
  82static inline void *memset(void *s, int c, size_t n)
  83{
  84    int i;
  85    unsigned char *p = s;
  86
  87    for (i = 0; i < n; i++) {
  88        p[i] = c;
  89    }
  90
  91    return s;
  92}
  93
  94static inline void fill_hex(char *out, unsigned char val)
  95{
  96    const char hex[] = "0123456789abcdef";
  97
  98    out[0] = hex[(val >> 4) & 0xf];
  99    out[1] = hex[val & 0xf];
 100}
 101
 102static inline void fill_hex_val(char *out, void *ptr, unsigned size)
 103{
 104    unsigned char *value = ptr;
 105    unsigned int i;
 106
 107    for (i = 0; i < size; i++) {
 108        fill_hex(&out[i*2], value[i]);
 109    }
 110}
 111
 112static inline void print_int(const char *desc, u64 addr)
 113{
 114    char out[] = ": 0xffffffffffffffff\n";
 115
 116    fill_hex_val(&out[4], &addr, sizeof(addr));
 117
 118    sclp_print(desc);
 119    sclp_print(out);
 120}
 121
 122static inline void debug_print_int(const char *desc, u64 addr)
 123{
 124#ifdef DEBUG
 125    print_int(desc, addr);
 126#endif
 127}
 128
 129static inline void debug_print_addr(const char *desc, void *p)
 130{
 131#ifdef DEBUG
 132    debug_print_int(desc, (unsigned int)(unsigned long)p);
 133#endif
 134}
 135
 136/***********************************************
 137 *           Hypercall functions               *
 138 ***********************************************/
 139
 140#define KVM_S390_VIRTIO_NOTIFY          0
 141#define KVM_S390_VIRTIO_RESET           1
 142#define KVM_S390_VIRTIO_SET_STATUS      2
 143#define KVM_S390_VIRTIO_CCW_NOTIFY      3
 144
 145static inline void yield(void)
 146{
 147    asm volatile ("diag 0,0,0x44"
 148                  : :
 149                  : "memory", "cc");
 150}
 151
 152#define MAX_SECTOR_SIZE 4096
 153
 154static inline void sleep(unsigned int seconds)
 155{
 156    ulong target = get_second() + seconds;
 157
 158    while (get_second() < target) {
 159        yield();
 160    }
 161}
 162
 163static inline void *memcpy(void *s1, const void *s2, size_t n)
 164{
 165    uint8_t *p1 = s1;
 166    const uint8_t *p2 = s2;
 167
 168    while (n--) {
 169        p1[n] = p2[n];
 170    }
 171    return s1;
 172}
 173
 174static inline void IPL_assert(bool term, const char *message)
 175{
 176    if (!term) {
 177        sclp_print("\n! ");
 178        sclp_print(message);
 179        panic(" !\n"); /* no return */
 180    }
 181}
 182
 183static inline void IPL_check(bool term, const char *message)
 184{
 185    if (!term) {
 186        sclp_print("\n! WARNING: ");
 187        sclp_print(message);
 188        sclp_print(" !\n");
 189    }
 190}
 191
 192#endif /* S390_CCW_H */
 193