These changes are the raw update to qemu-2.6.
[kvmfornfv.git] / qemu / roms / SLOF / lib / libvirtio / virtio.code
1 /******************************************************************************
2  * Copyright (c) 2004, 2011 IBM Corporation
3  * All rights reserved.
4  * This program and the accompanying materials
5  * are made available under the terms of the BSD License
6  * which accompanies this distribution, and is available at
7  * http://www.opensource.org/licenses/bsd-license.php
8  *
9  * Contributors:
10  *     IBM Corporation - initial implementation
11  *****************************************************************************/
12
13 #include <virtio.h>
14 #include <virtio-blk.h>
15 #include <virtio-9p.h>
16 #include <virtio-scsi.h>
17 #include <virtio-net.h>
18
19 /******** core virtio ********/
20
21 // : virtio-setup-vd  ( -- dev )
22 PRIM(virtio_X2d_setup_X2d_vd)
23         PUSH; TOS.a = virtio_setup_vd();
24 MIRP
25
26 // : virtio-vring-size  ( queuesize -- ringsize )
27 PRIM(virtio_X2d_vring_X2d_size)
28         TOS.u = virtio_vring_size(TOS.u);
29 MIRP
30
31 // : virtio-get-qsize  ( dev queue -- queuesize )
32 PRIM(virtio_X2d_get_X2d_qsize)
33         int queue = TOS.u; POP;
34         TOS.u = virtio_get_qsize(TOS.a, queue);
35 MIRP
36
37 // : virtio-get-config  ( dev offset size -- val )
38 PRIM(virtio_X2d_get_X2d_config)
39         int size = TOS.u; POP;
40         int offset = TOS.u; POP;
41         TOS.u = virtio_get_config(TOS.a, offset, size);
42 MIRP
43
44 // : virtio-set-qaddr  ( dev queue qaddr --  )
45 PRIM(virtio_X2d_set_X2d_qaddr)
46         unsigned int qaddr = TOS.u; POP;
47         int queue = TOS.u; POP;
48         void *dev = TOS.a; POP;
49         virtio_set_qaddr(dev, queue, qaddr);
50 MIRP
51
52 /******** virtio-blk ********/
53
54 // : virtio-blk-init ( dev -- blk-size)
55 PRIM(virtio_X2d_blk_X2d_init)
56         void *dev = TOS.a;
57         TOS.u = virtioblk_init(dev);
58 MIRP
59
60 // : virtio-blk-shutdown ( dev -- )
61 PRIM(virtio_X2d_blk_X2d_shutdown)
62         void *dev = TOS.a; POP;
63         virtioblk_shutdown(dev);
64 MIRP
65
66 // : virtio-blk-read ( dev blkno cnt reg -- #read )
67 PRIM(virtio_X2d_blk_X2d_read)
68         void *dev = TOS.a; POP;
69         long cnt = TOS.n; POP;
70         long blkno = TOS.n; POP;
71         void *buf = TOS.a;
72         TOS.n = virtioblk_read(dev, buf, blkno, cnt);
73 MIRP
74
75 /******** virtio-fs ********/
76
77 // : virtio-fs-init ( dev tx rx size -- success )
78 PRIM(virtio_X2d_fs_X2d_init)
79         int size = TOS.n; POP;
80         void *rx = TOS.a; POP;
81         void *tx = TOS.a; POP;
82         void *dev = TOS.a;
83
84         TOS.n = virtio_9p_init(dev, tx, rx, size) == 0 ? -1 : 0;
85 MIRP
86
87 // : virtio-fs-shutdown ( dev -- )
88 PRIM(virtio_X2d_fs_X2d_shutdown)
89         void *dev = TOS.a; POP;
90
91         virtio_9p_shutdown(dev);
92 MIRP
93
94 // : virtio-fs-load ( dev buf str -- #read )
95 PRIM(virtio_X2d_fs_X2d_load)
96         char *str = TOS.a; POP;
97         void *buf = TOS.a; POP;
98         void *dev = TOS.a;
99
100         TOS.n = virtio_9p_load(dev, str, buf);
101 MIRP
102
103 /******** virtio-scsi ********/
104
105 // : virtio-scsi-init ( dev -- success )
106 PRIM(virtio_X2d_scsi_X2d_init)
107         void *dev = TOS.a;
108         TOS.u = virtioscsi_init(dev);
109 MIRP
110
111 // : virtio-scsi-shutdown ( dev -- )
112 PRIM(virtio_X2d_scsi_X2d_shutdown)
113         void *dev = TOS.a; POP;
114         virtioscsi_shutdown(dev);
115 MIRP
116
117 // : virtio-scsi-send ( buf_addr buf_len is_read req_ptr rsp_ptr dev -- success)
118 PRIM(virtio_X2d_scsi_X2d_send)
119         void *dev       = TOS.a; POP;
120         void *resp      = TOS.a; POP;
121         void *req       = TOS.a; POP;
122         int is_read     = !!TOS.n; POP;
123         uint64_t blen   = TOS.n; POP;
124         void *buf       = TOS.a;
125         TOS.n = virtioscsi_send(dev, req, resp, is_read, buf, blen);
126 MIRP
127
128 /******** virtio-net ********/
129
130 // : virtio-net-open ( dev -- false | [ driver true ] )
131 PRIM(virtio_X2d_net_X2d_open)
132 {
133         void *dev = TOS.a;
134
135         net_driver_t *net_driver = virtionet_open(dev);
136
137         if (net_driver) {
138                 TOS.u = (unsigned long)net_driver; PUSH;
139                 TOS.n = -1;
140         } else
141                 TOS.n = 0;
142 }
143 MIRP
144
145 // : virtio-net-close ( driver -- )
146 PRIM(virtio_X2d_net_X2d_close)
147 {
148         net_driver_t *driver = TOS.a; POP;
149         virtionet_close(driver);
150 }
151 MIRP
152
153 // : virtio-net-read ( addr len -- actual )
154 PRIM(virtio_X2d_net_X2d_read)
155 {
156         int len = TOS.u; POP;
157         TOS.n = virtionet_read(TOS.a, len);
158 }
159 MIRP
160
161 // : virtio-net-write ( addr len -- actual )
162 PRIM(virtio_X2d_net_X2d_write)
163 {
164         int len = TOS.u; POP;
165         TOS.n = virtionet_write(TOS.a, len);
166 }
167 MIRP