blob: 723941d3e0c97dba9a0d90b5352047b508645986 [file] [log] [blame]
/******************************************************************************
* 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 <nvram.h>
#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