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