Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / SLOF / lib / libnvram / libnvram.code
1 /******************************************************************************
2  * Copyright (c) 2004, 2008 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 #include <nvram.h>
13
14 #define STRING_INIT(str)        \
15         char str[255];          \
16         char * str##_address;   \
17         int  str##_length;
18
19 #define STRING_FROM_STACK(str)                          \
20         str##_length = TOS.u; POP;                              \
21         str##_address = TOS.a; POP;                     \
22         memcpy(str, str##_address, str##_length);       \
23         memset(str + str##_length, 0, 255 - str##_length);
24
25 PRIM(nvram_X2d_c_X40)
26         unsigned int offset = TOS.u;
27         TOS.u=nvram_read_byte(offset);
28 MIRP
29
30 PRIM(nvram_X2d_w_X40)
31         unsigned int offset = TOS.u;
32         TOS.u=nvram_read_word(offset);
33 MIRP
34
35 PRIM(nvram_X2d_l_X40)
36         unsigned int offset = TOS.u;
37         TOS.u=nvram_read_dword(offset);
38 MIRP
39
40 PRIM(nvram_X2d_x_X40)
41         unsigned int offset = TOS.u;
42         TOS.u=nvram_read_qword(offset);
43 MIRP
44
45 PRIM(nvram_X2d_c_X21)
46         nvram_write_byte(TOS.u, NOS.u);
47         POP; POP;
48 MIRP
49
50 PRIM(nvram_X2d_w_X21)
51         nvram_write_word(TOS.u, NOS.u);
52         POP; POP;
53 MIRP
54
55 PRIM(nvram_X2d_l_X21)
56         nvram_write_dword(TOS.u, NOS.u);
57         POP; POP;
58 MIRP
59
60 PRIM(nvram_X2d_x_X21)
61         nvram_write_qword(TOS.u, NOS.u);
62         POP; POP;
63 MIRP
64
65 /* get-nvram-partition ( type -- addr len FAILED? ) */
66 PRIM(get_X2d_nvram_X2d_partition)
67         partition_t partition;
68         unsigned int ptype = TOS.u;
69         partition = get_partition(ptype, NULL);
70         if(partition.len && partition.len != -1) {
71                 TOS.u = partition.addr;
72                 PUSH;
73                 TOS.u = partition.len;
74                 PUSH;
75                 TOS.u = 0; // FALSE
76         } else {
77                 TOS.u = -1; // TRUE
78         }
79 MIRP
80
81 /* get-named-nvram-partition ( name.addr name.len -- addr len FAILED? ) */
82 PRIM(get_X2d_named_X2d_nvram_X2d_partition)
83         STRING_INIT(name)
84         partition_t partition;
85
86         STRING_FROM_STACK(name)
87         partition = get_partition(-1, name);
88
89         if(partition.len && partition.len != -1) {
90                 PUSH;
91                 TOS.u = partition.addr;
92                 PUSH;
93                 TOS.u = partition.len;
94                 PUSH;
95                 TOS.u = 0; // FALSE
96         } else {
97                 PUSH;
98                 TOS.u = -1; // TRUE
99         }
100 MIRP
101
102
103
104 /* new-nvram-partition ( type name.addr name.len len -- part.offs part.len FALSE | TRUE) */
105 PRIM(new_X2d_nvram_X2d_partition)
106         int type, len, i, slen;
107         char name[12], *addr;
108         partition_t partition;
109
110         len = TOS.u; POP;
111         slen = TOS.u; POP;
112         addr = (char *)TOS.u; POP;
113         type = TOS.u; POP;
114
115         for (i=0; i<12; i++) {
116                 if(slen>i)
117                         name[i]=addr[i];
118                 else
119                         name[i]=0;
120         }
121
122         partition=new_nvram_partition(type, name, len);
123
124         if(!partition.len) {
125                 PUSH; TOS.u = -1; // TRUE
126         } else {
127                 PUSH; TOS.u = partition.addr;
128                 PUSH; TOS.u = partition.len;
129                 PUSH; TOS.u = 0; // FALSE
130         }
131 MIRP
132
133 /* inrease-nvram-partition ( part.offs part.len new-len -- FALSE | TRUE ) */
134 PRIM(increase_X2d_nvram_X2d_partition)
135         int len, ret;
136         partition_t partition;
137
138         // FIXME
139         partition.addr = TOS.u; POP;
140         partition.len  = TOS.u; POP;
141         len = TOS.u; POP;
142
143         ret=increase_nvram_partition_size(partition, len);
144
145         PUSH;
146
147         if(!ret) 
148                 TOS.u=-1; // TRUE
149         else
150                 TOS.u=0; // FALSE
151
152 MIRP
153
154 PRIM(internal_X2d_reset_X2d_nvram)
155         reset_nvram();
156 MIRP
157
158 PRIM(wipe_X2d_nvram)
159         wipe_nvram();
160 MIRP
161
162 PRIM(nvram_X2d_debug)
163         nvram_debug();
164 MIRP
165
166 // ( part.start part.len name.addr name.len -- var.addr var.len TRUE | false )
167 PRIM(internal_X2d_get_X2d_env)
168         STRING_INIT(name)
169         partition_t part;
170         char *val;
171
172         STRING_FROM_STACK(name)
173         part.len = TOS.u; POP;
174         part.addr = TOS.u; POP;
175
176         val=get_env(part, name);
177         if(val) {
178                 PUSH; TOS.a = val;
179                 PUSH; TOS.u = strlen(val);
180                 PUSH; TOS.u = -1; // TRUE
181         } else {
182                 PUSH; TOS.u = 0; // FALSE
183         }
184 MIRP
185
186 // ( part.start part.len name.addr name.len val.addr val.len -- FALSE|TRUE)
187 PRIM(internal_X2d_add_X2d_env)
188         STRING_INIT(name)
189         STRING_INIT(value)
190         partition_t part;
191         int ret;
192
193         STRING_FROM_STACK(value)
194         STRING_FROM_STACK(name)
195         part.len = TOS.u; POP;
196         part.addr = TOS.u; POP;
197
198         ret=add_env(part, name, value);
199         if(ret) {
200                 PUSH; TOS.u = -1; // TRUE
201         } else {
202                 PUSH; TOS.u = 0; // FALSE
203         }
204 MIRP
205
206 // ( part.addr part.len name.addr name.len -- FALSE|TRUE)
207 PRIM(internal_X2d_del_X2d_env)
208         STRING_INIT(name)
209         partition_t part;
210         int ret;
211
212         STRING_FROM_STACK(name);
213         part.len = TOS.u; POP;
214         part.addr = TOS.u; POP;
215
216         ret=del_env(part, name);
217         if(ret) {
218                 PUSH; TOS.u = -1; // TRUE
219         } else {
220                 PUSH; TOS.u = 0; // FALSE
221         }
222
223 MIRP
224
225 // internal-set-env ( part.addr part.len name.addr name.len val.addr val.len -- FALSE|TRUE)
226 PRIM(internal_X2d_set_X2d_env)
227         STRING_INIT(name)
228         STRING_INIT(value)
229         partition_t part;
230         int ret;
231
232         STRING_FROM_STACK(value)
233         STRING_FROM_STACK(name)
234         part.len = TOS.u; POP;
235         part.addr = TOS.u; POP;
236
237         ret=set_env(part, name, value);
238         if(ret) {
239                 PUSH; TOS.u = -1; // TRUE
240         } else {
241                 PUSH; TOS.u = 0; // FALSE
242         }
243 MIRP
244
245 // ( part.addr part.len -- FALSE|TRUE)
246 PRIM(erase_X2d_nvram_X2d_partition)
247         partition_t part;
248         int ret;
249
250         part.len = TOS.u; POP;
251         part.addr = TOS.u; POP;
252
253         ret=clear_nvram_partition(part);
254         if(ret) {
255                 PUSH; TOS.u = -1; // TRUE
256         } else {
257                 PUSH; TOS.u = 0; // FALSE
258         }
259
260 MIRP
261
262 // ( part.addr part.len -- FALSE|TRUE)
263 PRIM(delete_X2d_nvram_X2d_partition)
264         partition_t part;
265         int ret;
266
267         part.len = TOS.u; POP;
268         part.addr = TOS.u; POP;
269
270         ret=delete_nvram_partition(part);
271         if(ret) {
272                 PUSH; TOS.u = -1; // TRUE
273         } else {
274                 PUSH; TOS.u = 0; // FALSE
275         }
276
277 MIRP
278
279 // ( fetch_token store_token size nvram-addr -- )
280 PRIM(internal_X2d_nvram_X2d_init)
281         void *nvram_addr = TOS.a; POP;
282         uint32_t nvram_size = TOS.u; POP;
283         uint32_t store_token = TOS.u; POP;
284         long fetch_token = TOS.u; POP;
285
286         nvram_init(fetch_token, store_token, nvram_size, nvram_addr);
287 MIRP