Add qemu 2.4.0
[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-vring-size  ( queuesize -- ringsize )
22 PRIM(virtio_X2d_vring_X2d_size)
23         TOS.u = virtio_vring_size(TOS.u);
24 MIRP
25
26 // : virtio-get-qsize  ( dev queue -- queuesize )
27 PRIM(virtio_X2d_get_X2d_qsize)
28         int queue = TOS.u; POP;
29         TOS.u = virtio_get_qsize(TOS.a, queue);
30 MIRP
31
32 // : virtio-get-config  ( dev offset size -- val )
33 PRIM(virtio_X2d_get_X2d_config)
34         int size = TOS.u; POP;
35         int offset = TOS.u; POP;
36         TOS.u = virtio_get_config(TOS.a, offset, size);
37 MIRP
38
39 // : virtio-set-qaddr  ( dev queue qaddr --  )
40 PRIM(virtio_X2d_set_X2d_qaddr)
41         unsigned int qaddr = TOS.u; POP;
42         int queue = TOS.u; POP;
43         void *dev = TOS.a; POP;
44         virtio_set_qaddr(dev, queue, qaddr);
45 MIRP
46
47 /******** virtio-blk ********/
48
49 // : virtio-blk-init ( dev -- blk-size)
50 PRIM(virtio_X2d_blk_X2d_init)
51         void *dev = TOS.a;
52         TOS.u = virtioblk_init(dev);
53 MIRP
54
55 // : virtio-blk-shutdown ( dev -- )
56 PRIM(virtio_X2d_blk_X2d_shutdown)
57         void *dev = TOS.a; POP;
58         virtioblk_shutdown(dev);
59 MIRP
60
61 // : virtio-blk-read ( dev blkno cnt reg -- #read )
62 PRIM(virtio_X2d_blk_X2d_read)
63         void *dev = TOS.a; POP;
64         long cnt = TOS.n; POP;
65         long blkno = TOS.n; POP;
66         void *buf = TOS.a;
67         TOS.n = virtioblk_read(dev, buf, blkno, cnt);
68 MIRP
69
70 /******** virtio-fs ********/
71
72 // : virtio-fs-init ( dev tx rx size -- success )
73 PRIM(virtio_X2d_fs_X2d_init)
74         int size = TOS.n; POP;
75         void *rx = TOS.a; POP;
76         void *tx = TOS.a; POP;
77         void *dev = TOS.a;
78
79         TOS.n = virtio_9p_init(dev, tx, rx, size) == 0 ? -1 : 0;
80 MIRP
81
82 // : virtio-fs-shutdown ( dev -- )
83 PRIM(virtio_X2d_fs_X2d_shutdown)
84         void *dev = TOS.a; POP;
85
86         virtio_9p_shutdown(dev);
87 MIRP
88
89 // : virtio-fs-load ( dev buf str -- #read )
90 PRIM(virtio_X2d_fs_X2d_load)
91         char *str = TOS.a; POP;
92         void *buf = TOS.a; POP;
93         void *dev = TOS.a;
94
95         TOS.n = virtio_9p_load(dev, str, buf);
96 MIRP
97
98 /******** virtio-scsi ********/
99
100 // : virtio-scsi-init ( dev -- success )
101 PRIM(virtio_X2d_scsi_X2d_init)
102         void *dev = TOS.a;
103         TOS.u = virtioscsi_init(dev);
104 MIRP
105
106 // : virtio-scsi-shutdown ( dev -- )
107 PRIM(virtio_X2d_scsi_X2d_shutdown)
108         void *dev = TOS.a; POP;
109         virtioscsi_shutdown(dev);
110 MIRP
111
112 // : virtio-scsi-send ( buf_addr buf_len is_read req_ptr rsp_ptr dev -- success)
113 PRIM(virtio_X2d_scsi_X2d_send)
114         void *dev       = TOS.a; POP;
115         void *resp      = TOS.a; POP;
116         void *req       = TOS.a; POP;
117         int is_read     = !!TOS.n; POP;
118         uint64_t blen   = TOS.n; POP;
119         void *buf       = TOS.a;
120         TOS.n = virtioscsi_send(dev, req, resp, is_read, buf, blen);
121 MIRP
122
123 /******** virtio-net ********/
124
125 // : virtio-net-open ( mac-addr-str len dev -- false | [ driver true ] )
126 PRIM(virtio_X2d_net_X2d_open)
127 {
128         void *dev = TOS.a; POP;
129         int len = TOS.u; POP;
130         char *mac_addr = TOS.a;
131
132         net_driver_t *net_driver = virtionet_open(mac_addr, len, dev);
133
134         if (net_driver) {
135                 TOS.u = (unsigned long)net_driver; PUSH;
136                 TOS.n = -1;
137         } else
138                 TOS.n = 0;
139 }
140 MIRP
141
142 // : virtio-net-close ( driver -- )
143 PRIM(virtio_X2d_net_X2d_close)
144 {
145         net_driver_t *driver = TOS.a; POP;
146         virtionet_close(driver);
147 }
148 MIRP
149
150 // : virtio-net-read ( addr len -- actual )
151 PRIM(virtio_X2d_net_X2d_read)
152 {
153         int len = TOS.u; POP;
154         TOS.n = virtionet_read(TOS.a, len);
155 }
156 MIRP
157
158 // : virtio-net-write ( addr len -- actual )
159 PRIM(virtio_X2d_net_X2d_write)
160 {
161         int len = TOS.u; POP;
162         TOS.n = virtionet_write(TOS.a, len);
163 }
164 MIRP