/******************************************************************************
 * 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
