1 /******************************************************************************
2 * Copyright (c) 2004, 2008 IBM Corporation
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
10 * IBM Corporation - initial implementation
11 *****************************************************************************/
14 #define STRING_INIT(str) \
16 char * str##_address; \
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);
26 unsigned int offset = TOS.u;
27 TOS.u=nvram_read_byte(offset);
31 unsigned int offset = TOS.u;
32 TOS.u=nvram_read_word(offset);
36 unsigned int offset = TOS.u;
37 TOS.u=nvram_read_dword(offset);
41 unsigned int offset = TOS.u;
42 TOS.u=nvram_read_qword(offset);
46 nvram_write_byte(TOS.u, NOS.u);
51 nvram_write_word(TOS.u, NOS.u);
56 nvram_write_dword(TOS.u, NOS.u);
61 nvram_write_qword(TOS.u, NOS.u);
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;
73 TOS.u = partition.len;
81 /* get-named-nvram-partition ( name.addr name.len -- addr len FAILED? ) */
82 PRIM(get_X2d_named_X2d_nvram_X2d_partition)
84 partition_t partition;
86 STRING_FROM_STACK(name)
87 partition = get_partition(-1, name);
89 if(partition.len && partition.len != -1) {
91 TOS.u = partition.addr;
93 TOS.u = partition.len;
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;
112 addr = (char *)TOS.u; POP;
115 for (i=0; i<12; i++) {
122 partition=new_nvram_partition(type, name, len);
125 PUSH; TOS.u = -1; // TRUE
127 PUSH; TOS.u = partition.addr;
128 PUSH; TOS.u = partition.len;
129 PUSH; TOS.u = 0; // FALSE
133 /* inrease-nvram-partition ( part.offs part.len new-len -- FALSE | TRUE ) */
134 PRIM(increase_X2d_nvram_X2d_partition)
136 partition_t partition;
139 partition.addr = TOS.u; POP;
140 partition.len = TOS.u; POP;
143 ret=increase_nvram_partition_size(partition, len);
154 PRIM(internal_X2d_reset_X2d_nvram)
162 PRIM(nvram_X2d_debug)
166 // ( part.start part.len name.addr name.len -- var.addr var.len TRUE | false )
167 PRIM(internal_X2d_get_X2d_env)
172 STRING_FROM_STACK(name)
173 part.len = TOS.u; POP;
174 part.addr = TOS.u; POP;
176 val=get_env(part, name);
179 PUSH; TOS.u = strlen(val);
180 PUSH; TOS.u = -1; // TRUE
182 PUSH; TOS.u = 0; // FALSE
186 // ( part.start part.len name.addr name.len val.addr val.len -- FALSE|TRUE)
187 PRIM(internal_X2d_add_X2d_env)
193 STRING_FROM_STACK(value)
194 STRING_FROM_STACK(name)
195 part.len = TOS.u; POP;
196 part.addr = TOS.u; POP;
198 ret=add_env(part, name, value);
200 PUSH; TOS.u = -1; // TRUE
202 PUSH; TOS.u = 0; // FALSE
206 // ( part.addr part.len name.addr name.len -- FALSE|TRUE)
207 PRIM(internal_X2d_del_X2d_env)
212 STRING_FROM_STACK(name);
213 part.len = TOS.u; POP;
214 part.addr = TOS.u; POP;
216 ret=del_env(part, name);
218 PUSH; TOS.u = -1; // TRUE
220 PUSH; TOS.u = 0; // FALSE
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)
232 STRING_FROM_STACK(value)
233 STRING_FROM_STACK(name)
234 part.len = TOS.u; POP;
235 part.addr = TOS.u; POP;
237 ret=set_env(part, name, value);
239 PUSH; TOS.u = -1; // TRUE
241 PUSH; TOS.u = 0; // FALSE
245 // ( part.addr part.len -- FALSE|TRUE)
246 PRIM(erase_X2d_nvram_X2d_partition)
250 part.len = TOS.u; POP;
251 part.addr = TOS.u; POP;
253 ret=clear_nvram_partition(part);
255 PUSH; TOS.u = -1; // TRUE
257 PUSH; TOS.u = 0; // FALSE
262 // ( part.addr part.len -- FALSE|TRUE)
263 PRIM(delete_X2d_nvram_X2d_partition)
267 part.len = TOS.u; POP;
268 part.addr = TOS.u; POP;
270 ret=delete_nvram_partition(part);
272 PUSH; TOS.u = -1; // TRUE
274 PUSH; TOS.u = 0; // FALSE
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;
286 nvram_init(fetch_token, store_token, nvram_size, nvram_addr);