xref: /qemu/pc-bios/s390-ccw/main.c (revision 22d67ab5)
192f2ca38SAlexander Graf /*
292f2ca38SAlexander Graf  * S390 virtio-ccw loading program
392f2ca38SAlexander Graf  *
492f2ca38SAlexander Graf  * Copyright (c) 2013 Alexander Graf <agraf@suse.de>
592f2ca38SAlexander Graf  *
692f2ca38SAlexander Graf  * This work is licensed under the terms of the GNU GPL, version 2 or (at
792f2ca38SAlexander Graf  * your option) any later version. See the COPYING file in the top-level
892f2ca38SAlexander Graf  * directory.
992f2ca38SAlexander Graf  */
1092f2ca38SAlexander Graf 
1192f2ca38SAlexander Graf #include "s390-ccw.h"
1292f2ca38SAlexander Graf 
1392f2ca38SAlexander Graf struct subchannel_id blk_schid;
1492f2ca38SAlexander Graf char stack[PAGE_SIZE * 8] __attribute__((__aligned__(PAGE_SIZE)));
1592f2ca38SAlexander Graf 
1692f2ca38SAlexander Graf void virtio_panic(const char *string)
1792f2ca38SAlexander Graf {
1892f2ca38SAlexander Graf     sclp_print(string);
197f61cbc1SChristian Borntraeger     disabled_wait();
2092f2ca38SAlexander Graf     while (1) { }
2192f2ca38SAlexander Graf }
2292f2ca38SAlexander Graf 
2392f2ca38SAlexander Graf static void virtio_setup(void)
2492f2ca38SAlexander Graf {
25*22d67ab5SCornelia Huck     struct schib schib;
2692f2ca38SAlexander Graf     int i;
2792f2ca38SAlexander Graf     int r;
2892f2ca38SAlexander Graf     bool found = false;
2992f2ca38SAlexander Graf 
3092f2ca38SAlexander Graf     blk_schid.one = 1;
3192f2ca38SAlexander Graf 
3292f2ca38SAlexander Graf     for (i = 0; i < 0x10000; i++) {
3392f2ca38SAlexander Graf         blk_schid.sch_no = i;
34*22d67ab5SCornelia Huck         r = stsch_err(blk_schid, &schib);
35*22d67ab5SCornelia Huck         if (r == 3) {
36*22d67ab5SCornelia Huck             break;
37*22d67ab5SCornelia Huck         }
38*22d67ab5SCornelia Huck         if (schib.pmcw.dnv) {
3992f2ca38SAlexander Graf             if (virtio_is_blk(blk_schid)) {
4092f2ca38SAlexander Graf                 found = true;
4192f2ca38SAlexander Graf                 break;
4292f2ca38SAlexander Graf             }
4392f2ca38SAlexander Graf         }
4492f2ca38SAlexander Graf     }
4592f2ca38SAlexander Graf 
4692f2ca38SAlexander Graf     if (!found) {
4792f2ca38SAlexander Graf         virtio_panic("No virtio-blk device found!\n");
4892f2ca38SAlexander Graf     }
4992f2ca38SAlexander Graf 
5092f2ca38SAlexander Graf     virtio_setup_block(blk_schid);
5192f2ca38SAlexander Graf }
5292f2ca38SAlexander Graf 
5392f2ca38SAlexander Graf int main(void)
5492f2ca38SAlexander Graf {
5592f2ca38SAlexander Graf     sclp_setup();
5692f2ca38SAlexander Graf     virtio_setup();
5792f2ca38SAlexander Graf     if (zipl_load() < 0)
5892f2ca38SAlexander Graf         sclp_print("Failed to load OS from hard disk\n");
597f61cbc1SChristian Borntraeger     disabled_wait();
6092f2ca38SAlexander Graf     while (1) { }
6192f2ca38SAlexander Graf }
62