/****************************************************************************** * Copyright (c) 2004, 2008 IBM Corporation * All rights reserved. * This program and the accompanying materials * are made available under the terms of the BSD License * which accompanies this distribution, and is available at * http://www.opensource.org/licenses/bsd-license.php * * Contributors: * IBM Corporation - initial implementation *****************************************************************************/ #include #define STRING_INIT(str) \ char str[255]; \ char * str##_address; \ int str##_length; #define STRING_FROM_STACK(str) \ str##_length = TOS.u; POP; \ str##_address = TOS.a; POP; \ memcpy(str, str##_address, str##_length); \ memset(str + str##_length, 0, 255 - str##_length); PRIM(nvram_X2d_c_X40) unsigned int offset = TOS.u; TOS.u=nvram_read_byte(offset); MIRP PRIM(nvram_X2d_w_X40) unsigned int offset = TOS.u; TOS.u=nvram_read_word(offset); MIRP PRIM(nvram_X2d_l_X40) unsigned int offset = TOS.u; TOS.u=nvram_read_dword(offset); MIRP PRIM(nvram_X2d_x_X40) unsigned int offset = TOS.u; TOS.u=nvram_read_qword(offset); MIRP PRIM(nvram_X2d_c_X21) nvram_write_byte(TOS.u, NOS.u); POP; POP; MIRP PRIM(nvram_X2d_w_X21) nvram_write_word(TOS.u, NOS.u); POP; POP; MIRP PRIM(nvram_X2d_l_X21) nvram_write_dword(TOS.u, NOS.u); POP; POP; MIRP PRIM(nvram_X2d_x_X21) nvram_write_qword(TOS.u, NOS.u); POP; POP; MIRP /* get-nvram-partition ( type -- addr len FAILED? ) */ PRIM(get_X2d_nvram_X2d_partition) partition_t partition; unsigned int ptype = TOS.u; partition = get_partition(ptype, NULL); if(partition.len && partition.len != -1) { TOS.u = partition.addr; PUSH; TOS.u = partition.len; PUSH; TOS.u = 0; // FALSE } else { TOS.u = -1; // TRUE } MIRP /* get-named-nvram-partition ( name.addr name.len -- addr len FAILED? ) */ PRIM(get_X2d_named_X2d_nvram_X2d_partition) STRING_INIT(name) partition_t partition; STRING_FROM_STACK(name) partition = get_partition(-1, name); if(partition.len && partition.len != -1) { PUSH; TOS.u = partition.addr; PUSH; TOS.u = partition.len; PUSH; TOS.u = 0; // FALSE } else { PUSH; TOS.u = -1; // TRUE } MIRP /* new-nvram-partition ( type name.addr name.len len -- part.offs part.len FALSE | TRUE) */ PRIM(new_X2d_nvram_X2d_partition) int type, len, i, slen; char name[12], *addr; partition_t partition; len = TOS.u; POP; slen = TOS.u; POP; addr = (char *)TOS.u; POP; type = TOS.u; POP; for (i=0; i<12; i++) { if(slen>i) name[i]=addr[i]; else name[i]=0; } partition=new_nvram_partition(type, name, len); if(!partition.len) { PUSH; TOS.u = -1; // TRUE } else { PUSH; TOS.u = partition.addr; PUSH; TOS.u = partition.len; PUSH; TOS.u = 0; // FALSE } MIRP /* inrease-nvram-partition ( part.offs part.len new-len -- FALSE | TRUE ) */ PRIM(increase_X2d_nvram_X2d_partition) int len, ret; partition_t partition; // FIXME partition.addr = TOS.u; POP; partition.len = TOS.u; POP; len = TOS.u; POP; ret=increase_nvram_partition_size(partition, len); PUSH; if(!ret) TOS.u=-1; // TRUE else TOS.u=0; // FALSE MIRP PRIM(internal_X2d_reset_X2d_nvram) reset_nvram(); MIRP PRIM(wipe_X2d_nvram) wipe_nvram(); MIRP PRIM(nvram_X2d_debug) nvram_debug(); MIRP // ( part.start part.len name.addr name.len -- var.addr var.len TRUE | false ) PRIM(internal_X2d_get_X2d_env) STRING_INIT(name) partition_t part; char *val; STRING_FROM_STACK(name) part.len = TOS.u; POP; part.addr = TOS.u; POP; val=get_env(part, name); if(val) { PUSH; TOS.a = val; PUSH; TOS.u = strlen(val); PUSH; TOS.u = -1; // TRUE } else { PUSH; TOS.u = 0; // FALSE } MIRP // ( part.start part.len name.addr name.len val.addr val.len -- FALSE|TRUE) PRIM(internal_X2d_add_X2d_env) STRING_INIT(name) STRING_INIT(value) partition_t part; int ret; STRING_FROM_STACK(value) STRING_FROM_STACK(name) part.len = TOS.u; POP; part.addr = TOS.u; POP; ret=add_env(part, name, value); if(ret) { PUSH; TOS.u = -1; // TRUE } else { PUSH; TOS.u = 0; // FALSE } MIRP // ( part.addr part.len name.addr name.len -- FALSE|TRUE) PRIM(internal_X2d_del_X2d_env) STRING_INIT(name) partition_t part; int ret; STRING_FROM_STACK(name); part.len = TOS.u; POP; part.addr = TOS.u; POP; ret=del_env(part, name); if(ret) { PUSH; TOS.u = -1; // TRUE } else { PUSH; TOS.u = 0; // FALSE } MIRP // internal-set-env ( part.addr part.len name.addr name.len val.addr val.len -- FALSE|TRUE) PRIM(internal_X2d_set_X2d_env) STRING_INIT(name) STRING_INIT(value) partition_t part; int ret; STRING_FROM_STACK(value) STRING_FROM_STACK(name) part.len = TOS.u; POP; part.addr = TOS.u; POP; ret=set_env(part, name, value); if(ret) { PUSH; TOS.u = -1; // TRUE } else { PUSH; TOS.u = 0; // FALSE } MIRP // ( part.addr part.len -- FALSE|TRUE) PRIM(erase_X2d_nvram_X2d_partition) partition_t part; int ret; part.len = TOS.u; POP; part.addr = TOS.u; POP; ret=clear_nvram_partition(part); if(ret) { PUSH; TOS.u = -1; // TRUE } else { PUSH; TOS.u = 0; // FALSE } MIRP // ( part.addr part.len -- FALSE|TRUE) PRIM(delete_X2d_nvram_X2d_partition) partition_t part; int ret; part.len = TOS.u; POP; part.addr = TOS.u; POP; ret=delete_nvram_partition(part); if(ret) { PUSH; TOS.u = -1; // TRUE } else { PUSH; TOS.u = 0; // FALSE } MIRP // ( fetch_token store_token size nvram-addr -- ) PRIM(internal_X2d_nvram_X2d_init) void *nvram_addr = TOS.a; POP; uint32_t nvram_size = TOS.u; POP; uint32_t store_token = TOS.u; POP; long fetch_token = TOS.u; POP; nvram_init(fetch_token, store_token, nvram_size, nvram_addr); MIRP