xref: /qemu/pc-bios/s390-ccw/main.c (revision 92f2ca38)
1*92f2ca38SAlexander Graf /*
2*92f2ca38SAlexander Graf  * S390 virtio-ccw loading program
3*92f2ca38SAlexander Graf  *
4*92f2ca38SAlexander Graf  * Copyright (c) 2013 Alexander Graf <agraf@suse.de>
5*92f2ca38SAlexander Graf  *
6*92f2ca38SAlexander Graf  * This work is licensed under the terms of the GNU GPL, version 2 or (at
7*92f2ca38SAlexander Graf  * your option) any later version. See the COPYING file in the top-level
8*92f2ca38SAlexander Graf  * directory.
9*92f2ca38SAlexander Graf  */
10*92f2ca38SAlexander Graf 
11*92f2ca38SAlexander Graf #include "s390-ccw.h"
12*92f2ca38SAlexander Graf 
13*92f2ca38SAlexander Graf struct subchannel_id blk_schid;
14*92f2ca38SAlexander Graf char stack[PAGE_SIZE * 8] __attribute__((__aligned__(PAGE_SIZE)));
15*92f2ca38SAlexander Graf 
16*92f2ca38SAlexander Graf void virtio_panic(const char *string)
17*92f2ca38SAlexander Graf {
18*92f2ca38SAlexander Graf     sclp_print(string);
19*92f2ca38SAlexander Graf     while (1) { }
20*92f2ca38SAlexander Graf }
21*92f2ca38SAlexander Graf 
22*92f2ca38SAlexander Graf static void virtio_setup(void)
23*92f2ca38SAlexander Graf {
24*92f2ca38SAlexander Graf     struct irb irb;
25*92f2ca38SAlexander Graf     int i;
26*92f2ca38SAlexander Graf     int r;
27*92f2ca38SAlexander Graf     bool found = false;
28*92f2ca38SAlexander Graf 
29*92f2ca38SAlexander Graf     blk_schid.one = 1;
30*92f2ca38SAlexander Graf 
31*92f2ca38SAlexander Graf     for (i = 0; i < 0x10000; i++) {
32*92f2ca38SAlexander Graf         blk_schid.sch_no = i;
33*92f2ca38SAlexander Graf         r = tsch(blk_schid, &irb);
34*92f2ca38SAlexander Graf         if (r != 3) {
35*92f2ca38SAlexander Graf             if (virtio_is_blk(blk_schid)) {
36*92f2ca38SAlexander Graf                 found = true;
37*92f2ca38SAlexander Graf                 break;
38*92f2ca38SAlexander Graf             }
39*92f2ca38SAlexander Graf         }
40*92f2ca38SAlexander Graf     }
41*92f2ca38SAlexander Graf 
42*92f2ca38SAlexander Graf     if (!found) {
43*92f2ca38SAlexander Graf         virtio_panic("No virtio-blk device found!\n");
44*92f2ca38SAlexander Graf     }
45*92f2ca38SAlexander Graf 
46*92f2ca38SAlexander Graf     virtio_setup_block(blk_schid);
47*92f2ca38SAlexander Graf }
48*92f2ca38SAlexander Graf 
49*92f2ca38SAlexander Graf int main(void)
50*92f2ca38SAlexander Graf {
51*92f2ca38SAlexander Graf     sclp_setup();
52*92f2ca38SAlexander Graf     virtio_setup();
53*92f2ca38SAlexander Graf     if (zipl_load() < 0)
54*92f2ca38SAlexander Graf         sclp_print("Failed to load OS from hard disk\n");
55*92f2ca38SAlexander Graf     while (1) { }
56*92f2ca38SAlexander Graf }
57