URL
https://opencores.org/ocsvn/or1k/or1k/trunk
Subversion Repositories or1k
Compare Revisions
- This comparison shows the changes necessary to convert path
/
- from Rev 1357 to Rev 1358
- ↔ Reverse comparison
Rev 1357 → Rev 1358
/trunk/or1ksim/sim-config.h
378,4 → 378,67
|
/* Handle the sim commandline */ |
void handle_sim_command(void); |
|
union param_val { |
char *str_val; |
int int_val; |
oraddr_t addr_val; |
}; |
|
enum param_t { |
paramt_none = 0, /* No parameter */ |
paramt_str, /* String parameter enclosed in double quotes (") */ |
paramt_word, /* String parameter NOT enclosed in double quotes */ |
paramt_int, /* Integer parameter */ |
paramt_addr /* Address parameter */ |
}; |
|
struct config_section { |
char *name; |
void *(*sec_start)(void); |
void (*sec_end)(void *); |
void *dat; |
struct config_param *params; |
struct config_section *next; |
}; |
|
/* Register a parameter in a section of the config file */ |
void reg_config_param(struct config_section *sec, const char *param, |
enum param_t type, |
void (*param_cb)(union param_val, void*)); |
|
/* Register a section in the config file */ |
struct config_section *reg_config_sec(const char *section, |
void *(*sec_start)(void), |
void (*sec_end)(void *)); |
|
extern struct config_section *cur_section; |
#define CONFIG_ERROR(s) {fprintf (stderr, "ERROR: config.%s:%s\n", cur_section->name, s); if (runtime.sim.init) exit (1);} |
|
/* FIXME: These will disapeer... */ |
void change_device (); |
void end_device (); |
extern int current_device; |
|
/* FIXME: These will disapeer with the above... */ |
void reg_mc_sec(void); |
void reg_uart_sec(void); |
void reg_dma_sec(void); |
void reg_memory_sec(void); |
void reg_debug_sec(void); |
void reg_vapi_sec(void); |
void reg_ethernet_sec(void); |
void reg_immu_sec(void); |
void reg_dmmu_sec(void); |
void reg_ic_sec(void); |
void reg_dc_sec(void); |
void reg_gpio_sec(void); |
void reg_bpb_sec(void); |
void reg_pm_sec(void); |
void reg_vga_sec(void); |
void reg_fb_sec(void); |
void reg_kbd_sec(void); |
void reg_ata_sec(void); |
void reg_cuc_sec(void); |
void reg_test_sec(void); |
#endif |
/trunk/or1ksim/debug/debug_unit.c
455,3 → 455,34
set_stall_state (result != 0); |
return (result != 0); |
} |
|
/*--------------------------------------------------[ Debug configuration ]---*/ |
void debug_enabled(union param_val val, void *dat) |
{ |
config.debug.enabled = val.int_val; |
} |
|
void debug_gdb_enabled(union param_val val, void *dat) |
{ |
config.debug.gdb_enabled = val.int_val; |
} |
|
void debug_server_port(union param_val val, void *dat) |
{ |
config.debug.server_port = val.int_val; |
} |
|
void debug_vapi_id(union param_val val, void *dat) |
{ |
config.debug.vapi_id = val.int_val; |
} |
|
void reg_debug_sec(void) |
{ |
struct config_section *sec = reg_config_sec("debug", NULL, NULL); |
|
reg_config_param(sec, "enabled", paramt_int, debug_enabled); |
reg_config_param(sec, "gdb_enabled", paramt_int, debug_gdb_enabled); |
reg_config_param(sec, "server_port", paramt_int, debug_server_port); |
reg_config_param(sec, "vapi_id", paramt_int, debug_server_port); |
} |
/trunk/or1ksim/debug/gdbcomm.c
33,6 → 33,14
#include <unistd.h> |
#include <string.h> |
|
#include "config.h" |
|
#ifdef HAVE_INTTYPES_H |
#include <inttypes.h> |
#endif |
|
#include "port.h" |
#include "arch.h" |
#include "gdb.h" |
#include "gdbcomm.h" |
#include "vapi.h" |
/trunk/or1ksim/cpu/common/labels.c
34,9 → 34,9
|
#include "port.h" |
#include "config.h" |
#include "sim-config.h" |
|
#include "arch.h" |
#include "sim-config.h" |
#include "labels.h" |
|
static struct label_entry *label_hash[LABELS_HASH_SIZE]; |
/trunk/or1ksim/cpu/common/abstract.c
33,11 → 33,11
#endif |
|
#include "port.h" |
#include "sim-config.h" |
|
#include "arch.h" |
#include "parse.h" |
#include "abstract.h" |
#include "sim-config.h" |
#include "labels.h" |
#include "execute.h" |
#include "sprs.h" |
/trunk/or1ksim/profiler.c
23,6 → 23,14
#include <stdio.h> |
#include <string.h> |
|
#include "config.h" |
|
#ifdef HAVE_INTTYPES_H |
#include <inttypes.h> |
#endif |
|
#include "port.h" |
#include "arch.h" |
#include "profiler.h" |
#include "sim-config.h" |
|
/trunk/or1ksim/cache/dcache_model.c
348,3 → 348,80
mtspr(SPR_DCBLR, 0); |
} |
} |
|
/*-----------------------------------------------------[ DC configuration ]---*/ |
void dc_enabled(union param_val val, void *dat) |
{ |
config.dc.enabled = val.int_val; |
setsprbits (SPR_UPR, SPR_UPR_DCP, val.int_val ? 1 : 0); |
} |
|
void dc_nsets(union param_val val, void *dat) |
{ |
if (is_power2(val.int_val) && val.int_val <= MAX_DC_SETS) |
config.dc.nsets = val.int_val; |
else { |
char tmp[200]; |
sprintf (tmp, "value of power of two and lower or equal than %i expected.", MAX_DC_SETS); |
CONFIG_ERROR(tmp); |
} |
} |
|
void dc_nways(union param_val val, void *dat) |
{ |
if (val.int_val >= 1 && val.int_val <= MAX_DC_WAYS) |
config.dc.nways = val.int_val; |
else |
CONFIG_ERROR("value 1, 2, 3 or 4 expected."); |
} |
|
void dc_blocksize(union param_val val, void *dat) |
{ |
if (is_power2(val.int_val)) |
config.dc.blocksize = val.int_val; |
else |
CONFIG_ERROR("value of power of two expected."); |
} |
|
void dc_ustates(union param_val val, void *dat) |
{ |
if (val.int_val >= 2 && val.int_val <= 4) |
config.dc.ustates = val.int_val; |
else |
CONFIG_ERROR("invalid USTATE."); |
} |
|
void dc_load_missdelay(union param_val val, void *dat) |
{ |
config.dc.load_missdelay = val.int_val; |
} |
|
void dc_load_hitdelay(union param_val val, void *dat) |
{ |
config.dc.load_hitdelay = val.int_val; |
} |
|
void dc_store_missdelay(union param_val val, void *dat) |
{ |
config.dc.store_missdelay = val.int_val; |
} |
|
void dc_store_hitdelay(union param_val val, void *dat) |
{ |
config.dc.store_hitdelay = val.int_val; |
} |
|
void reg_dc_sec(void) |
{ |
struct config_section *sec = reg_config_sec("dc", NULL, NULL); |
|
reg_config_param(sec, "enabled", paramt_int, dc_enabled); |
reg_config_param(sec, "nsets", paramt_int, dc_nsets); |
reg_config_param(sec, "nways", paramt_int, dc_nways); |
reg_config_param(sec, "blocksize", paramt_int, dc_blocksize); |
reg_config_param(sec, "ustates", paramt_int, dc_ustates); |
reg_config_param(sec, "load_missdelay", paramt_int, dc_load_missdelay); |
reg_config_param(sec, "load_hitdelay", paramt_int, dc_load_hitdelay); |
reg_config_param(sec, "store_missdelay", paramt_int, dc_store_missdelay); |
reg_config_param(sec, "store_hitdelay", paramt_int, dc_store_hitdelay); |
} |
/trunk/or1ksim/cache/icache_model.c
214,3 → 214,68
mtspr(SPR_ICBLR, 0); |
} |
} |
|
/*-----------------------------------------------------[ IC configuration ]---*/ |
void ic_enabled(union param_val val, void *dat) |
{ |
config.ic.enabled = val.int_val; |
setsprbits (SPR_UPR, SPR_UPR_ICP, val.int_val ? 1 : 0); |
} |
|
void ic_nsets(union param_val val, void *dat) |
{ |
if (is_power2(val.int_val) && val.int_val <= MAX_IC_SETS) |
config.ic.nsets = val.int_val; |
else { |
char tmp[200]; |
sprintf (tmp, "value of power of two and lower or equal than %i expected.", MAX_IC_SETS); |
CONFIG_ERROR(tmp); |
} |
} |
|
void ic_nways(union param_val val, void *dat) |
{ |
if (val.int_val >= 1 && val.int_val <= MAX_IC_WAYS) |
config.ic.nways = val.int_val; |
else |
CONFIG_ERROR("value 1, 2, 3 or 4 expected."); |
} |
|
void ic_blocksize(union param_val val, void *dat) |
{ |
if (is_power2(val.int_val)) |
config.ic.blocksize = val.int_val; |
else |
CONFIG_ERROR("value of power of two expected."); |
} |
|
void ic_ustates(union param_val val, void *dat) |
{ |
if (val.int_val >= 2 && val.int_val <= 4) |
config.ic.ustates = val.int_val; |
else |
CONFIG_ERROR("invalid USTATE."); |
} |
|
void ic_missdelay(union param_val val, void *dat) |
{ |
config.ic.missdelay = val.int_val; |
} |
|
void ic_hitdelay(union param_val val, void *dat) |
{ |
config.ic.hitdelay = val.int_val; |
} |
|
void reg_ic_sec(void) |
{ |
struct config_sections *sec = reg_config_sec("ic", NULL, NULL); |
|
reg_config_param(sec, "enabled", paramt_int, ic_enabled); |
reg_config_param(sec, "nsets", paramt_int, ic_nsets); |
reg_config_param(sec, "nways", paramt_int, ic_nways); |
reg_config_param(sec, "blocksize", paramt_int, ic_blocksize); |
reg_config_param(sec, "ustates", paramt_int, ic_ustates); |
reg_config_param(sec, "missdelay", paramt_int, ic_missdelay); |
reg_config_param(sec, "hitdelay", paramt_int, ic_hitdelay); |
} |
/trunk/or1ksim/cuc/cuc.c
837,3 → 837,51
fclose (flog); |
} |
|
/*----------------------------------------------------[ CUC Configuration ]---*/ |
void cuc_calling_convention(union param_val val, void *dat) |
{ |
config.cuc.calling_convention = val.int_val; |
} |
|
void cuc_enable_bursts(union param_val val, void *dat) |
{ |
config.cuc.enable_bursts = val.int_val; |
} |
|
void cuc_no_multicycle(union param_val val, void *dat) |
{ |
config.cuc.no_multicycle = val.int_val; |
} |
|
void cuc_memory_order(union param_val val, void *dat) |
{ |
if (strcmp (val.str_val, "none") == 0) |
config.cuc.memory_order = MO_NONE; |
else if (strcmp (val.str_val, "weak") == 0) |
config.cuc.memory_order = MO_WEAK; |
else if (strcmp (val.str_val, "strong") == 0) |
config.cuc.memory_order = MO_STRONG; |
else if (strcmp (val.str_val, "exact") == 0) { |
config.cuc.memory_order = MO_EXACT; |
} else { |
char tmp[200]; |
sprintf (tmp, "invalid memory order '%s'.\n", val.str_val); |
CONFIG_ERROR(tmp); |
} |
} |
|
void cuc_timings_fn(union param_val val, void *dat) |
{ |
strcpy(config.cuc.timings_fn, val.str_val); |
} |
|
void reg_cuc_sec(void) |
{ |
struct config_section *sec = reg_config_sec("cuc", NULL, NULL); |
|
reg_config_param(sec, "calling_convention", paramt_int, cuc_calling_convention); |
reg_config_param(sec, "enable_bursts", paramt_int, cuc_enable_bursts); |
reg_config_param(sec, "no_multicycle", paramt_int, cuc_no_multicycle); |
reg_config_param(sec, "memory_order", paramt_word, cuc_memory_order); |
reg_config_param(sec, "timings_fn", paramt_str, cuc_timings_fn); |
} |
/trunk/or1ksim/pm/pm.c
46,3 → 46,16
if (config.sim.verbose) PRINTF("Resetting Power Management.\n"); |
mtspr(SPR_PMR, 0); |
} |
|
/*-----------------------------------------------------[ PM Configuration ]---*/ |
void pm_enabled(union param_val val, void *dat) |
{ |
config.pm.enabled = val.int_val; |
} |
|
void reg_pm_sec(void) |
{ |
struct config_section *sec = reg_config_sec("pm", NULL, NULL); |
|
reg_config_param(sec, "enabled", paramt_int, pm_enabled); |
} |
/trunk/or1ksim/peripheral/gpio.c
302,3 → 302,48
/* Switch to values for next clock */ |
memcpy( &(gpio->curr), &(gpio->next), sizeof(gpio->curr) ); |
} |
|
/*---------------------------------------------------[ GPIO configuration ]---*/ |
void gpio_ngpios(union param_val val, void *dat) |
{ |
if (val.int_val >= 0 && val.int_val < MAX_GPIOS) |
config.ngpios = val.int_val; |
else |
CONFIG_ERROR("invalid number of devices."); |
} |
|
void gpio_baseaddr(union param_val val, void *dat) |
{ |
if (current_device >= 0 && current_device < config.ngpios) |
config.gpios[current_device].baseaddr = val.int_val; |
else |
CONFIG_ERROR("invalid device number."); |
} |
|
void gpio_irq(union param_val val, void *dat) |
{ |
if (current_device >= 0 && current_device < config.ngpios) |
config.gpios[current_device].irq = val.int_val; |
else |
CONFIG_ERROR("invalid device number."); |
} |
|
void gpio_base_vapi_id(union param_val val, void *dat) |
{ |
if (current_device >= 0 && current_device < config.ngpios) |
config.gpios[current_device].base_vapi_id = val.int_val; |
else |
CONFIG_ERROR("invalid device number."); |
} |
|
void reg_gpio_sec(void) |
{ |
struct config_section *sec = reg_config_sec("gpio", NULL, NULL); |
|
reg_config_param(sec, "ngpios", paramt_int, gpio_ngpios); |
reg_config_param(sec, "device", paramt_int, change_device); |
reg_config_param(sec, "baseaddr", paramt_addr, gpio_baseaddr); |
reg_config_param(sec, "irq", paramt_int, gpio_irq); |
reg_config_param(sec, "base_vapi_id", paramt_int, gpio_base_vapi_id); |
reg_config_param(sec, "enddevice", paramt_none, end_device); |
} |
/trunk/or1ksim/peripheral/mc.c
198,3 → 198,28
mc.tms[i]); |
} |
} |
|
/*-----------------------------------------------------[ MC configuration }---*/ |
void mc_enabled(union param_val val, void *dat) |
{ |
config.mc.enabled = val.int_val; |
} |
|
void mc_baseaddr(union param_val val, void *dat) |
{ |
config.mc.baseaddr = val.addr_val; |
} |
|
void mc_POC(union param_val val, void *dat) |
{ |
config.mc.POC = val.int_val; |
} |
|
void reg_mc_sec(void) |
{ |
struct config_section *sec = reg_config_sec("mc", NULL, NULL); |
|
reg_config_param(sec, "enabled", paramt_int, mc_enabled); |
reg_config_param(sec, "baseaddr", paramt_addr, mc_baseaddr); |
reg_config_param(sec, "POC", paramt_int, mc_POC); |
} |
/trunk/or1ksim/peripheral/eth.c
889,3 → 889,104
|
return NULL; |
} |
|
/*-----------------------------------------------[ Ethernet configuration ]---*/ |
void eth_nethernets (union param_val val, void *dat) { |
if (val.int_val >= 0 && val.int_val < MAX_ETHERNETS) |
config.nethernets = val.int_val; |
else |
CONFIG_ERROR("invalid number of devices."); |
} |
|
void eth_baseaddr (union param_val val, void *dat) { |
if (current_device >= 0 && current_device < config.nethernets) |
config.ethernets[current_device].baseaddr = val.addr_val; |
else |
CONFIG_ERROR("invalid device number."); |
} |
|
void eth_dma (union param_val val, void *dat) { |
if (current_device >= 0 && current_device < config.nethernets) |
config.ethernets[current_device].dma = val.int_val; |
else |
CONFIG_ERROR("invalid device number."); |
} |
|
void eth_rtx_type (union param_val val, void *dat) { |
if (current_device >= 0 && current_device < config.nethernets) |
config.ethernets[current_device].rtx_type = val.int_val; |
else |
CONFIG_ERROR("invalid device number."); |
} |
|
void eth_rx_channel (union param_val val, void *dat) { |
if (current_device >= 0 && current_device < config.nethernets) |
config.ethernets[current_device].rx_channel = val.int_val; |
else |
CONFIG_ERROR("invalid device number."); |
} |
|
void eth_tx_channel (union param_val val, void *dat) { |
if (current_device >= 0 && current_device < config.nethernets) |
config.ethernets[current_device].rx_channel = val.int_val; |
else |
CONFIG_ERROR("invalid device number."); |
} |
|
void eth_rxfile (union param_val val, void *dat) { |
if (current_device >= 0 && current_device < config.nethernets) |
strcpy (config.ethernets[current_device].rxfile, val.str_val); |
else |
CONFIG_ERROR("invalid device number."); |
} |
|
void eth_txfile(union param_val val, void *dat) |
{ |
if (current_device >= 0 && current_device < config.nethernets) |
strcpy (config.ethernets[current_device].txfile, val.str_val); |
else |
CONFIG_ERROR("invalid device number."); |
} |
|
void eth_sockif(union param_val val, void *dat) |
{ |
if (current_device >= 0 && current_device < config.nethernets) |
strcpy (config.ethernets[current_device].sockif, val.str_val); |
else |
CONFIG_ERROR("invalid device number."); |
} |
|
void eth_irq(union param_val val, void *dat) |
{ |
if (current_device >= 0 && current_device < config.nethernets) |
config.ethernets[current_device].irq = val.int_val; |
else |
CONFIG_ERROR("invalid device number."); |
} |
|
void eth_vapi_id(union param_val val, void *dat) |
{ |
if (current_device >= 0 && current_device < config.nethernets) |
config.ethernets[current_device].base_vapi_id = val.int_val; |
else |
CONFIG_ERROR("invalid device number."); |
} |
|
void reg_ethernet_sec(void) |
{ |
struct config_section *sec = reg_config_sec("ethernet", NULL, NULL); |
|
reg_config_param(sec, "nethernets", paramt_int, eth_nethernets); |
reg_config_param(sec, "device", paramt_int, change_device); |
reg_config_param(sec, "irq", paramt_int, eth_irq); |
reg_config_param(sec, "enddevice", paramt_int, end_device); |
reg_config_param(sec, "baseaddr", paramt_int, eth_baseaddr); |
reg_config_param(sec, "dma", paramt_int, eth_dma); |
reg_config_param(sec, "rtx_type", paramt_int, eth_rtx_type); |
reg_config_param(sec, "rx_channel", paramt_int, eth_rx_channel); |
reg_config_param(sec, "tx_channel", paramt_int, eth_tx_channel); |
reg_config_param(sec, "rxfile", paramt_str, eth_rxfile); |
reg_config_param(sec, "txfile", paramt_str, eth_txfile); |
reg_config_param(sec, "sockif", paramt_str, eth_sockif); |
reg_config_param(sec, "vapi_id", paramt_int, eth_vapi_id); |
} |
/trunk/or1ksim/peripheral/ps2kbd.c
283,3 → 283,34
PRINTF("kbd_kresp: %lx\n", kbd_kresp); |
PRINTF("kbd_buf_count: %lx\n", kbd_buf_count); |
} |
|
/*----------------------------------------------------[ KBD Configuration ]---*/ |
void kbd_enabled(union param_val val, void *dat) |
{ |
config.kbd.enabled = val.int_val; |
} |
|
void kbd_baseaddr(union param_val val, void *dat) |
{ |
config.kbd.baseaddr = val.addr_val; |
} |
|
void kbd_irq(union param_val val, void *dat) |
{ |
config.kbd.irq = val.int_val; |
} |
|
void kbd_rxfile(union param_val val, void *dat) |
{ |
strcpy(config.kbd.rxfile, val.str_val); |
} |
|
void reg_kbd_sec(void) |
{ |
struct config_section *sec = reg_config_sec("kbd", NULL, NULL); |
|
reg_config_param(sec, "enabled", paramt_int, kbd_enabled); |
reg_config_param(sec, "baseaddr", paramt_int, kbd_baseaddr); |
reg_config_param(sec, "irq", paramt_int, kbd_irq); |
reg_config_param(sec, "rxfile", paramt_str, kbd_rxfile); |
} |
/trunk/or1ksim/peripheral/fb.c
294,3 → 294,34
SCHED_ADD(fb_job, 0, runtime.sim.cycles + config.fb.refresh_rate); |
} |
} |
|
/*-----------------------------------------------------[ FB configuration ]---*/ |
void fb_enabled(union param_val val, void *dat) |
{ |
config.fb.enabled = val.int_val; |
} |
|
void fb_baseaddr(union param_val val, void *dat) |
{ |
config.fb.baseaddr = val.addr_val; |
} |
|
void fb_refresh_rate(union param_val val, void *dat) |
{ |
config.fb.refresh_rate = val.int_val; |
} |
|
void fb_filename(union param_val val, void *dat) |
{ |
strcpy(config.fb.filename, val.str_val); |
} |
|
void reg_fb_sec(void) |
{ |
struct config_section *sec = reg_config_sec("fb", NULL, NULL); |
|
reg_config_param(sec, "enabled", paramt_int, fb_enabled); |
reg_config_param(sec, "baseaddr", paramt_addr, fb_baseaddr); |
reg_config_param(sec, "refresh_rate", paramt_int, fb_refresh_rate); |
reg_config_param(sec, "filename", paramt_str, fb_filename); |
} |
/trunk/or1ksim/peripheral/dma.c
488,3 → 488,48
{ |
*value = (*value & ~mask) | ((*value + 4) & mask); |
} |
|
/*----------------------------------------------------[ DMA configuration ]---*/ |
void dma_ndmas(union param_val val, void *dat) |
{ |
if (val.int_val >= 0 && val.int_val < MAX_DMAS) |
config.ndmas = val.int_val; |
else |
CONFIG_ERROR("invalid number of devices."); |
} |
|
void dma_baseaddr(union param_val val, void *dat) |
{ |
if (current_device >= 0 && current_device < config.ndmas) |
config.dmas[current_device].baseaddr = val.addr_val; |
else |
CONFIG_ERROR("invalid device number."); |
} |
|
void dma_irq(union param_val val, void *dat) |
{ |
if (current_device >= 0 && current_device < config.ndmas) |
config.dmas[current_device].irq = val.int_val; |
else |
CONFIG_ERROR("invalid device number."); |
} |
|
void dma_vapi_id(union param_val val, void *dat) |
{ |
if (current_device >= 0 && current_device < config.ndmas) |
config.dmas[current_device].vapi_id = val.int_val; |
else |
CONFIG_ERROR("invalid device number."); |
} |
|
void reg_dma_sec(void) |
{ |
struct config_section *sec = reg_config_sec("dma", NULL, NULL); |
|
reg_config_param(sec, "ndmas", paramt_int, dma_ndmas); |
reg_config_param(sec, "device", paramt_int, change_device); |
reg_config_param(sec, "enddevice", paramt_none, end_device); |
reg_config_param(sec, "irq", paramt_int, dma_irq); |
reg_config_param(sec, "baseaddr", paramt_addr, dma_baseaddr); |
reg_config_param(sec, "vapi_id", paramt_addr, dma_vapi_id); |
} |
/trunk/or1ksim/peripheral/atahost.c
319,3 → 319,111
} |
} |
/* ========================================================================= */ |
|
/*----------------------------------------------------[ ATA Configuration ]---*/ |
void ata_natas(union param_val val, void *dat) |
{ |
if (val.int_val >= 0 && val.int_val < MAX_ATAS) |
config.natas = val.int_val; |
else |
CONFIG_ERROR("invalid number of devices."); |
} |
|
void ata_baseaddr(union param_val val, void *dat) |
{ |
if (current_device >= 0 && current_device < config.natas) |
config.atas[current_device].baseaddr = val.addr_val; |
else |
CONFIG_ERROR("invalid device number."); |
} |
|
void ata_irq(union param_val val, void *dat) |
{ |
if (current_device >= 0 && current_device < config.natas) |
config.atas[current_device].irq = val.int_val; |
else |
CONFIG_ERROR("invalid device number."); |
} |
|
void ata_dev_type0(union param_val val, void *dat) |
{ |
if (current_device >= 0 && current_device < config.natas) |
config.atas[current_device].dev_type0 = val.int_val; |
else |
CONFIG_ERROR("invalid device number."); |
} |
|
void ata_dev_file0(union param_val val, void *dat) |
{ |
if (current_device >= 0 && current_device < config.natas) |
strcpy (config.atas[current_device].dev_file0, val.str_val); |
else |
CONFIG_ERROR("invalid device number."); |
} |
|
void ata_dev_size0(union param_val val, void *dat) |
{ |
if (current_device >= 0 && current_device < config.natas) |
config.atas[current_device].dev_size0 = val.int_val; |
else |
CONFIG_ERROR("invalid device number."); |
} |
|
void ata_dev_packet0(union param_val val, void *dat) |
{ |
if (current_device >= 0 && current_device < config.natas) |
config.atas[current_device].dev_packet0 = val.int_val; |
else |
CONFIG_ERROR("invalid device number."); |
} |
|
void ata_dev_type1(union param_val val, void *dat) |
{ |
if (current_device >= 0 && current_device < config.natas) |
config.atas[current_device].dev_type1 = val.int_val; |
else |
CONFIG_ERROR("invalid device number."); |
} |
|
void ata_dev_file1(union param_val val, void *dat) |
{ |
if (current_device >= 0 && current_device < config.natas) |
strcpy (config.atas[current_device].dev_file1, val.str_val); |
else |
CONFIG_ERROR("invalid device number."); |
} |
|
void ata_dev_size1(union param_val val, void *dat) |
{ |
if (current_device >= 0 && current_device < config.natas) |
config.atas[current_device].dev_size1 = val.int_val; |
else |
CONFIG_ERROR("invalid device number."); |
} |
|
void ata_dev_packet1(union param_val val, void *dat) |
{ |
if (current_device >= 0 && current_device < config.natas) |
config.atas[current_device].dev_packet1 = val.int_val; |
else |
CONFIG_ERROR("invalid device number."); |
} |
|
void reg_ata_sec(void) |
{ |
struct config_section *sec = reg_config_sec("ata", NULL, NULL); |
|
reg_config_param(sec, "natas", paramt_int, ata_natas); |
reg_config_param(sec, "device", paramt_int, change_device); |
reg_config_param(sec, "baseaddr", paramt_addr, ata_baseaddr); |
reg_config_param(sec, "irq", paramt_int, ata_irq); |
reg_config_param(sec, "dev_type0", paramt_int, ata_dev_type0); |
reg_config_param(sec, "dev_file0", paramt_str, ata_dev_file0); |
reg_config_param(sec, "dev_size0", paramt_int, ata_dev_size0); |
reg_config_param(sec, "dev_packet0", paramt_int, ata_dev_packet0); |
reg_config_param(sec, "dev_type1", paramt_int, ata_dev_type1); |
reg_config_param(sec, "dev_file1", paramt_str, ata_dev_file1); |
reg_config_param(sec, "dev_size1", paramt_int, ata_dev_size1); |
reg_config_param(sec, "dev_packet1", paramt_int, ata_dev_packet1); |
reg_config_param(sec, "enddevice", paramt_none, end_device); |
} |
/trunk/or1ksim/peripheral/vga.c
18,6 → 18,7
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ |
|
#include <stdio.h> |
#include <string.h> |
|
#include "config.h" |
|
260,3 → 261,57
SCHED_ADD(vga_job, i, runtime.sim.cycles + config.vgas[i].refresh_rate); |
} |
} |
|
/*----------------------------------------------------[ VGA Configuration ]---*/ |
void vga_nvgas(union param_val val, void *dat) |
{ |
if (val.int_val >= 0 && val.int_val < MAX_VGAS) |
config.nvgas = val.int_val; |
else |
CONFIG_ERROR("invalid number of devices."); |
} |
|
void vga_baseaddr(union param_val val, void *dat) |
{ |
if (current_device >= 0 && current_device < config.nvgas) |
config.vgas[current_device].baseaddr = val.addr_val; |
else |
CONFIG_ERROR("invalid device number."); |
} |
|
void vga_irq(union param_val val, void *dat) |
{ |
if (current_device >= 0 && current_device < config.nvgas) |
config.vgas[current_device].irq = val.int_val; |
else |
CONFIG_ERROR("invalid device number."); |
} |
|
void vga_refresh_rate(union param_val val, void *dat) |
{ |
if (current_device >= 0 && current_device < config.nvgas) |
config.vgas[current_device].refresh_rate = val.int_val; |
else |
CONFIG_ERROR("invalid device number."); |
} |
|
void vga_filename(union param_val val, void *dat) |
{ |
if (current_device >= 0 && current_device < config.nvgas) |
strcpy (config.vgas[current_device].filename, val.str_val); |
else |
CONFIG_ERROR("invalid device number."); |
} |
|
void reg_vga_sec(void) |
{ |
struct config_section *sec = reg_config_sec("vga", NULL, NULL); |
|
reg_config_param(sec, "nvgas", paramt_int, vga_nvgas); |
reg_config_param(sec, "device", paramt_int, change_device); |
reg_config_param(sec, "baseaddr", paramt_addr, vga_baseaddr); |
reg_config_param(sec, "irq", paramt_int, vga_irq); |
reg_config_param(sec, "refresh_rate", paramt_int, vga_refresh_rate); |
reg_config_param(sec, "filename", paramt_str, vga_filename); |
reg_config_param(sec, "enddevice", paramt_none, end_device); |
} |
/trunk/or1ksim/peripheral/16450.c
675,3 → 675,83
*/ |
} |
} |
|
/*---------------------------------------------------[ UART configuration ]---*/ |
void uart_nuarts(union param_val val, void *dat) |
{ |
if (val.int_val >= 0 && val.int_val < MAX_UARTS) |
config.nuarts = val.int_val; |
else |
CONFIG_ERROR("invalid number of devices."); |
} |
|
void uart_baseaddr(union param_val val, void *dat) |
{ |
if (current_device >= 0 && current_device < config.nuarts) |
config.uarts[current_device].baseaddr = val.addr_val; |
else |
CONFIG_ERROR("invalid device number."); |
} |
|
void uart_jitter(union param_val val, void *dat) |
{ |
if (current_device >= 0 && current_device < config.nuarts) |
config.uarts[current_device].jitter = val.int_val; |
else |
CONFIG_ERROR("invalid device number."); |
} |
|
void uart_irq(union param_val val, void *dat) |
{ |
if (current_device >= 0 && current_device < config.nuarts) |
config.uarts[current_device].irq = val.int_val; |
else |
CONFIG_ERROR("invalid device number."); |
} |
|
void uart_16550(union param_val val, void *dat) |
{ |
if (current_device >= 0 && current_device < config.nuarts) |
config.uarts[current_device].uart16550 = val.int_val; |
else |
CONFIG_ERROR("invalid device number."); |
} |
|
void uart_channel(union param_val val, void *dat) |
{ |
if (current_device >= 0 && current_device < config.nuarts) |
strcpy (config.uarts[current_device].channel, val.str_val); |
else |
CONFIG_ERROR("invalid device number."); |
} |
|
void uart_newway(union param_val val, void *dat) |
{ |
CONFIG_ERROR(" txfile and rxfile and now obsolete.\n\tUse 'channel = \"file:rxfile,txfile\"' instead."); |
exit(1); |
} |
|
void uart_vapi_id(union param_val val, void *dat) |
{ |
if (current_device >= 0 && current_device < config.nuarts) |
config.uarts[current_device].vapi_id = val.int_val; |
else |
CONFIG_ERROR("invalid device number."); |
} |
|
void reg_uart_sec(void) |
{ |
struct config_section *sec = reg_config_sec("uart", NULL, NULL); |
|
reg_config_param(sec, "nuarts", paramt_int, uart_nuarts); |
reg_config_param(sec, "device", paramt_int, change_device); |
reg_config_param(sec, "enddevice", paramt_none, end_device); |
reg_config_param(sec, "baseaddr", paramt_addr, uart_baseaddr); |
reg_config_param(sec, "irq", paramt_int, uart_irq); |
reg_config_param(sec, "16550", paramt_int, uart_16550); |
reg_config_param(sec, "jitter", paramt_int, uart_jitter); |
reg_config_param(sec, "channel", paramt_str, uart_channel); |
reg_config_param(sec, "txfile", paramt_str, uart_newway); |
reg_config_param(sec, "rxfile", paramt_str, uart_newway); |
reg_config_param(sec, "vapi_id", paramt_int, uart_vapi_id); |
} |
/trunk/or1ksim/peripheral/test.c
45,3 → 45,22
register_memoryarea(config.test.baseaddr, 256, 4, 0, test_read32, test_write32); |
} |
} |
|
/*---------------------------------------------------[ Test configuration ]---*/ |
void test_enabled(union param_val val, void *dat) |
{ |
config.test.enabled = val.int_val; |
} |
|
void test_baseaddr(union param_val val, void *dat) |
{ |
config.test.baseaddr = val.addr_val; |
} |
|
void reg_test_sec(void) |
{ |
struct config_section *sec = reg_config_sec("test", NULL, NULL); |
|
reg_config_param(sec, "enabled", paramt_int, test_enabled); |
reg_config_param(sec, "baseaddr", paramt_addr, test_baseaddr); |
} |
/trunk/or1ksim/mmu/dmmu.c
264,3 → 264,74
} |
if (start_set < end_set) PRINTF("\n"); |
} |
|
/*---------------------------------------------------[ DMMU configuration ]---*/ |
void dmmu_enabled(union param_val val, void *dat) |
{ |
setsprbits (SPR_UPR, SPR_UPR_DMP, val.int_val ? 1 : 0); |
config.dmmu.enabled = val.int_val; |
} |
|
void dmmu_nsets(union param_val val, void *dat) |
{ |
if (is_power2(val.int_val) && val.int_val <= 256) |
config.dmmu.nsets = val.int_val; |
else |
CONFIG_ERROR("value of power of two and lower or equal than 256 expected."); |
} |
|
void dmmu_nways(union param_val val, void *dat) |
{ |
if (val.int_val >= 1 && val.int_val <= 4) |
config.dmmu.nways = val.int_val; |
else |
CONFIG_ERROR("value 1, 2, 3 or 4 expected."); |
} |
|
void dmmu_pagesize(union param_val val, void *dat) |
{ |
if (is_power2(val.int_val)) |
config.dmmu.pagesize = val.int_val; |
else |
CONFIG_ERROR("value of power of two expected."); |
} |
|
void dmmu_entrysize(union param_val val, void *dat) |
{ |
if (is_power2(val.int_val)) |
config.dmmu.entrysize = val.int_val; |
else |
CONFIG_ERROR("value of power of two expected."); |
} |
|
void dmmu_ustates(union param_val val, void *dat) |
{ |
if (val.int_val >= 2 && val.int_val <= 4) |
config.dmmu.ustates = val.int_val; |
else |
CONFIG_ERROR("invalid USTATE."); |
} |
|
void dmmu_missdelay(union param_val val, void *dat) |
{ |
config.dmmu.missdelay = val.int_val; |
} |
|
void dmmu_hitdelay(union param_val val, void *dat) |
{ |
config.immu.hitdelay = val.int_val; |
} |
|
void reg_dmmu_sec(void) |
{ |
struct config_section *sec = reg_config_sec("dmmu", NULL, NULL); |
|
reg_config_param(sec, "enabled", paramt_int, dmmu_enabled); |
reg_config_param(sec, "nsets", paramt_int, dmmu_nsets); |
reg_config_param(sec, "nways", paramt_int, dmmu_nways); |
reg_config_param(sec, "pagesize", paramt_int, dmmu_pagesize); |
reg_config_param(sec, "entrysize", paramt_int, dmmu_entrysize); |
reg_config_param(sec, "ustates", paramt_int, dmmu_ustates); |
reg_config_param(sec, "missdelay", paramt_int, dmmu_missdelay); |
reg_config_param(sec, "hitdelay", paramt_int, dmmu_hitdelay); |
} |
/trunk/or1ksim/mmu/immu.c
241,3 → 241,74
} |
if (start_set < end_set) PRINTF("\n"); |
} |
|
/*---------------------------------------------------[ IMMU configuration ]---*/ |
void immu_enabled(union param_val val, void *dat) |
{ |
setsprbits (SPR_UPR, SPR_UPR_IMP, val.int_val ? 1 : 0); |
config.immu.enabled = val.int_val; |
} |
|
void immu_nsets(union param_val val, void *dat) |
{ |
if (is_power2(val.int_val) && val.int_val <= 256) |
config.immu.nsets = val.int_val; |
else |
CONFIG_ERROR("value of power of two and lower or equal than 256 expected."); |
} |
|
void immu_nways(union param_val val, void *dat) |
{ |
if (val.int_val >= 1 && val.int_val <= 4) |
config.immu.nways = val.int_val; |
else |
CONFIG_ERROR("value 1, 2, 3 or 4 expected."); |
} |
|
void immu_pagesize(union param_val val, void *dat) |
{ |
if (is_power2(val.int_val)) |
config.immu.pagesize = val.int_val; |
else |
CONFIG_ERROR("value of power of two expected."); |
} |
|
void immu_entrysize(union param_val val, void *dat) |
{ |
if (is_power2(val.int_val)) |
config.immu.entrysize = val.int_val; |
else |
CONFIG_ERROR("value of power of two expected."); |
} |
|
void immu_ustates(union param_val val, void *dat) |
{ |
if (val.int_val >= 2 && val.int_val <= 4) |
config.immu.ustates = val.int_val; |
else |
CONFIG_ERROR("invalid USTATE."); |
} |
|
void immu_missdelay(union param_val val, void *dat) |
{ |
config.immu.missdelay = val.int_val; |
} |
|
void immu_hitdelay(union param_val val, void *dat) |
{ |
config.immu.hitdelay = val.int_val; |
} |
|
void reg_immu_sec(void) |
{ |
struct config_section *sec = reg_config_sec("immu", NULL, NULL); |
|
reg_config_param(sec, "enabled", paramt_int, immu_enabled); |
reg_config_param(sec, "nsets", paramt_int, immu_nsets); |
reg_config_param(sec, "nways", paramt_int, immu_nways); |
reg_config_param(sec, "pagesize", paramt_int, immu_pagesize); |
reg_config_param(sec, "entrysize", paramt_int, immu_entrysize); |
reg_config_param(sec, "ustates", paramt_int, immu_ustates); |
reg_config_param(sec, "missdelay", paramt_int, immu_missdelay); |
reg_config_param(sec, "hitdelay", paramt_int, immu_hitdelay); |
} |
/trunk/or1ksim/vapi/vapi.c
39,6 → 39,14
#include <netdb.h> |
#include <netinet/tcp.h> |
|
#include "config.h" |
|
#ifdef HAVE_INTTYPES_H |
#include <inttypes.h> |
#endif |
|
#include "port.h" |
#include "arch.h" |
#include "sim-config.h" |
#include "vapi.h" |
#include "debug.h" |
605,3 → 613,40
} |
vapi_done (); |
}*/ |
|
/*---------------------------------------------------[ VAPI configuration ]---*/ |
void vapi_enabled(union param_val val, void *dat) |
{ |
config.vapi.enabled = val.int_val; |
} |
|
void vapi_server_port(union param_val val, void *dat) |
{ |
config.vapi.server_port = val.int_val; |
} |
|
void vapi_log_enabled(union param_val val, void *dat) |
{ |
config.vapi.log_enabled = val.int_val; |
} |
|
void vapi_hide_device_id(union param_val val, void *dat) |
{ |
config.vapi.hide_device_id = val.int_val; |
} |
|
void vapi_log_fn(union param_val val, void *dat) |
{ |
strcpy(config.vapi.vapi_fn, val.str_val); |
} |
|
void reg_vapi_sec(void) |
{ |
struct config_section *sec = reg_config_sec("VAPI", NULL, NULL); |
|
reg_config_param(sec, "enabled", paramt_int, vapi_enabled); |
reg_config_param(sec, "server_port", paramt_int, vapi_server_port); |
reg_config_param(sec, "log_enabled", paramt_int, vapi_log_enabled); |
reg_config_param(sec, "hide_device_id", paramt_int, vapi_hide_device_id); |
reg_config_param(sec, "vapi_log_fn", paramt_str, vapi_log_fn); |
} |
/trunk/or1ksim/bpb/branch_predict.c
240,3 → 240,46
btic[entry].way[minway].lru = BTIC_USTATES - 1; |
} |
} |
|
/*----------------------------------------------------[ BPB configuration ]---*/ |
void bpb_enabled(union param_val val, void *dat) |
{ |
config.bpb.enabled = val.int_val; |
} |
|
void bpb_btic(union param_val val, void *dat) |
{ |
config.bpb.btic = val.int_val; |
} |
|
void bpb_sbp_bnf_fwd(union param_val val, void *dat) |
{ |
config.bpb.sbp_bnf_fwd = val.int_val; |
} |
|
void bpb_sbp_bf_fwd(union param_val val, void *dat) |
{ |
config.bpb.sbp_bf_fwd = val.int_val; |
} |
|
void bpb_missdelay(union param_val val, void *dat) |
{ |
config.bpb.missdelay = val.int_val; |
} |
|
void bpb_hitdelay(union param_val val, void *dat) |
{ |
config.bpb.hitdelay = val.int_val; |
} |
|
void reg_bpb_sec(void) |
{ |
struct config_section *sec = reg_config_sec("bpb", NULL, NULL); |
|
reg_config_param(sec, "enabled", paramt_int, bpb_enabled); |
reg_config_param(sec, "btic", paramt_int, bpb_btic); |
reg_config_param(sec, "sbp_bnf_fwd", paramt_int, bpb_sbp_bnf_fwd); |
reg_config_param(sec, "sbp_bf_fwd", paramt_int, bpb_sbp_bf_fwd); |
reg_config_param(sec, "missdelay", paramt_int, bpb_missdelay); |
reg_config_param(sec, "hitdelay", paramt_int, bpb_hitdelay); |
} |
/trunk/or1ksim/toplevel.c
77,7 → 77,7
#include "cuc.h" |
|
/* CVS revision number. */ |
const char rcsrev[] = "$Revision: 1.103 $"; |
const char rcsrev[] = "$Revision: 1.104 $"; |
|
inline void debug(int level, const char *format, ...) |
{ |
340,6 → 340,7
{ |
srand(getpid()); |
init_defconfig(); |
reg_config_secs(); |
if (parse_args(argc, argv)) { |
PRINTF("Usage: %s [options] <filename>\n", argv[0]); |
PRINTF("Options:\n"); |
/trunk/or1ksim/sim-config.c
1,4 → 1,4
/* config.c -- Simulator configuration |
/* sim-config.c -- Simulator configuration |
Copyright (C) 1999 Damjan Lampret, lampret@opencores.org |
|
This file is part of OpenRISC 1000 Architectural Simulator. |
46,8 → 46,9
#include "mprofiler.h" |
#include "cuc.h" |
|
#define WARNING(s) fprintf (stderr, "WARNING: config.%s: %s\n", sections[section].name, (s)) |
#define ERROR(s) {fprintf (stderr, "ERROR: config.%s:%s\n", sections[section].name, s); if (runtime.sim.init) exit (1);} |
#include "debug.h" |
|
#define WARNING(s) fprintf (stderr, "WARNING: config.%s: %s\n", cur_section->name, (s)) |
#define MERROR(s) {fprintf (stderr, "ERROR: %s\n", s); if (runtime.sim.init) exit (1);} |
|
#if !FAST_SIM |
55,12 → 56,10
#endif |
struct runtime runtime; |
|
int section = 0; |
extern struct section { |
char *name; |
int flags; |
} sections[]; |
struct config_section *cur_section; |
|
struct config_section *sections = NULL; |
|
void init_defconfig() |
{ |
int i; |
273,65 → 272,6
return 0; |
} |
|
#if !FAST_SIM |
#define CNV(x) ((isspace(x) || (x) == 0) ? ' ' : (x)) |
|
/* Substitute for less powerful fscanf */ |
int fscanf_ex (FILE *f, char *fmt, void *buf, char *str) |
{ |
char tmp[STR_SIZE]; |
char ch; |
int i = 0; |
while (*fmt) { |
switch (*fmt) { |
case '%': |
while(*fmt != 0 && !isalpha (*fmt)) |
tmp[i++] = *(fmt++); |
tmp[i++] = *(fmt++); |
if (tmp[i - 1] == 's') { |
char *cbuf = (char *)buf; |
i = 0; |
while (ch = (f ? fgetc (f) : *str++), isspace(ch)) |
if (f ? feof (f) : *str) return 1; |
if (f) |
ungetc (ch, f); |
else |
str--; |
while ((*(cbuf++) = ch = (f ? fgetc (f) : *str++), CNV(ch) ) != *fmt) { |
if ((f ? feof (f) : *str)) return 1; |
if (++i >= STR_SIZE) { |
fprintf (stderr, "ERROR: string too long.\n"); |
return 1; |
} |
} |
*(--cbuf) = 0; |
fmt++; |
} else { |
tmp[i++] = 0; |
if (f) |
fscanf (f, tmp, buf); |
else |
sscanf (str, tmp, buf); |
} |
break; |
default: |
while ((ch = (f ? fgetc (f) : *str++)) != *fmt) { |
if (!isspace (ch)) { |
char tmp[200]; |
sprintf (tmp, "unexpected char '%c' (expecting '%c')\n", ch, *fmt); |
fprintf (stderr, "WARNING: config.%s: %s\n", sections[section].name, tmp); |
WARNING(tmp); |
} |
if ((f ? feof (f) : *str)) return 1; |
} |
fmt++; |
break; |
} |
} |
return 0; |
} |
#endif /* !FAST_SIM */ |
|
void print_config() |
{ |
if (config.sim.verbose) { |
369,647 → 309,302
} |
|
#if !FAST_SIM |
/* Forward declarations of functions */ |
void base_include (); |
void sim_clkcycle (); |
void sim_exe_log_type (); |
void change_device (); |
void end_device (); |
void uart_nuarts (); |
void uart_baseaddr (); |
void uart_channel (); |
void uart_newway (); |
void uart_jitter (); |
void uart_irq (); |
void uart_16550 (); |
void uart_vapi_id (); |
void dma_ndmas (); |
void dma_baseaddr (); |
void dma_irq (); |
void dma_vapi_id (); |
void memory_type (); |
void memory_nmemories (); |
void memory_ce (); |
void memory_baseaddr (); |
void memory_size (); |
void memory_name (); |
void memory_log (); |
void memory_delayr (); |
void memory_delayw (); |
void cpu_sbuf_len (); |
void eth_nethernets (); |
void eth_baseaddr (); |
void eth_irq (); |
void eth_dma (); |
void eth_rtx_type (); |
void eth_rx_channel (); |
void eth_tx_channel (); |
void eth_rxfile (); |
void eth_txfile (); |
void eth_sockif (); |
void eth_vapi_id (); |
void gpio_ngpios (); |
void gpio_baseaddr (); |
void gpio_irq (); |
void gpio_base_vapi_id (); |
void vga_nvgas (); |
void vga_baseaddr (); |
void vga_irq (); |
void vga_refresh_rate (); |
//void vga_filename (); |
void vga_bufaddr (); |
void vga_paladdr (); |
void vga_refresh_rate (); |
void vga_filename (); |
void ata_natas (); |
void ata_baseaddr (); |
void ata_irq (); |
void ata_dev_type0 (); |
void ata_dev_file0 (); |
void ata_dev_size0 (); |
void ata_dev_packet0 (); |
void ata_dev_type1 (); |
void ata_dev_file1 (); |
void ata_dev_size1 (); |
void ata_dev_packet1 (); |
void immu_enabled (); |
void immu_nsets (); |
void immu_nways (); |
void immu_pagesize (); |
void immu_entrysize (); |
void immu_ustates (); |
void dmmu_enabled (); |
void dmmu_nsets (); |
void dmmu_nways (); |
void dmmu_pagesize (); |
void dmmu_entrysize (); |
void dmmu_ustates (); |
void ic_enabled (); |
void ic_nsets (); |
void ic_nways (); |
void ic_blocksize (); |
void ic_ustates (); |
void dc_enabled (); |
void dc_nsets (); |
void dc_nways (); |
void dc_blocksize (); |
void dc_ustates (); |
void cuc_memory_order (); |
|
unsigned long tempL; |
unsigned long tempUL; |
char tempS[STR_SIZE]; |
|
#define CPF_SUBSECTION 1 |
#define CPF_SUBFIELD 2 |
#define CPF_GLOBAL 4 /* Not part of the substructure (group) in config */ |
|
struct section sections[] = { |
{"base", 0}, /* 0 */ |
{"mc", 0}, |
{"uart", 0}, |
{"dma", 0}, |
{"memory", 0}, |
{"cpu", 0}, /* 5 */ |
{"sim", 0}, |
{"debug", 0}, |
{"VAPI", 0}, |
{"ethernet",0}, |
{"", 0}, /* 10 */ |
{"immu", 0}, |
{"dmmu", 0}, |
{"ic", 0}, |
{"dc", 0}, |
{"gpio", 0}, /* 15 */ |
{"bpb", 0}, |
{"pm", 0}, |
{"vga", 0}, |
{"fb", 0}, |
{"kbd", 0}, /* 20 */ |
{"ata", 0}, |
{"cuc", 0}, |
{"test", 0} |
struct config_param { |
char *name; |
enum param_t type; |
void (*func)(union param_val, void *dat); |
struct config_param *next; |
}; |
|
/* *INDENT-OFF* */ |
/* FIXME: These will be removed */ |
int current_device = -1; |
void change_device (union param_val val, void *dat) { |
current_device = val.int_val; |
} |
|
/* Parameter definitions */ |
struct config_params { |
int section; |
char *name; |
char *type; |
void (*func)(); |
void *addr; |
int attr; |
} config_params[] = { |
{0, "include", "\"%s\"", base_include, (void *)(&tempS), 0}, |
void end_device (union param_val val, void *dat) { |
current_device = -1; |
} |
|
{1, "enabled", "=%i", NULL, (void *)(&config.mc.enabled), 0}, |
{1, "baseaddr", "=0x%x", NULL, (void *)(&config.mc.baseaddr), 0}, |
{1, "POC", "=0x%x", NULL, (void *)(&config.mc.POC), 0}, |
|
{2, "nuarts", "=%i", uart_nuarts, (void *)(&tempL), CPF_GLOBAL}, |
{2, "device", "%i", change_device, (void *)(&tempL), 0}, |
{2, "enddevice", "", end_device, NULL, 0}, |
{2, "baseaddr", "=0x%x", uart_baseaddr, (void *)(&tempUL), 0}, |
{2, "irq", "=%i", uart_irq, (void *)(&tempL), 0}, |
{2, "16550", "=%i", uart_16550, (void *)(&tempL), 0}, |
{2, "jitter", "=%i", uart_jitter, (void *)(&tempL), 0}, |
{2, "channel", "=\"%s\"", uart_channel, (void *)(&tempS[0]), 0}, |
{2, "txfile", "=\"%s\"", uart_newway, (void *)(&tempS[0]), 0}, |
{2, "rxfile", "=\"%s\"", uart_newway, (void *)(&tempS[0]), 0}, |
{2, "vapi_id", "=0x%x", uart_vapi_id, (void *)(&tempUL), 0}, |
void base_include (union param_val val, void *dat) { |
read_script_file (val.str_val); |
cur_section = NULL; |
} |
|
{3, "ndmas", "=%i", dma_ndmas, (void *)(&tempL), CPF_GLOBAL}, |
{3, "device", "%i", change_device, (void *)(&tempL), 0}, |
{3, "enddevice", "", end_device, NULL, 0}, |
{3, "baseaddr", "=0x%x", dma_baseaddr, (void *)(&tempUL), 0}, |
{3, "irq", "=%i", dma_irq, (void *)(&tempL), 0}, |
{3, "vapi_id", "=0x%x", dma_vapi_id, (void *)(&tempUL), 0}, |
/*----------------------------------------------[ Simulator configuration ]---*/ |
void sim_debug (union param_val val, void *dat) { |
config.sim.debug = val.int_val; |
} |
|
{4, "random_seed", "=%i", NULL, (void *)(&config.memory.random_seed), 0}, |
{4, "pattern", "=%i", NULL, (void *)(&config.memory.pattern), 0}, |
{4, "type", "=%s ", memory_type, (void *)(&tempS[0]), 0}, |
{4, "nmemories", "=%i", memory_nmemories,(void *)(&tempL), CPF_GLOBAL}, |
{4, "device", "%i", change_device, (void *)(&tempL), 0}, |
{4, "enddevice", "", end_device, NULL, 0}, |
{4, "ce", "=%i", memory_ce, (void *)(&tempL), 0}, |
{4, "baseaddr", "=0x%x", memory_baseaddr,(void *)(&tempUL), 0}, |
{4, "size", "=0x%x", memory_size, (void *)(&tempUL), 0}, |
{4, "name", "=\"%s\"", memory_name, (void *)(&tempS[0]), 0}, |
{4, "log", "=\"%s\"", memory_log, (void *)(&tempS[0]), 0}, |
{4, "delayr", "=%i", memory_delayr, (void *)(&tempL), 0}, |
{4, "delayw", "=%i", memory_delayw, (void *)(&tempL), 0}, |
void sim_verbose (union param_val val, void *dat) { |
config.sim.verbose = val.int_val; |
} |
|
{5, "ver", "=0x%x", NULL, (void *)(&config.cpu.ver), 0}, |
{5, "rev", "=0x%x", NULL, (void *)(&config.cpu.rev), 0}, |
{5, "upr", "=0x%x", NULL, (void *)(&config.cpu.upr), 0}, |
{5, "sr", "=0x%x", NULL, (void *)(&config.cpu.sr), 0}, |
{5, "hazards", "=%i", NULL, (void *)(&config.cpu.hazards), 0}, |
{5, "superscalar", "=%i", NULL, (void *)(&config.cpu.superscalar), 0}, |
{5, "dependstats", "=%i", NULL, (void *)(&config.cpu.dependstats), 0}, |
{5, "sbuf_len", "=%i", cpu_sbuf_len, (void *)(&config.cpu.sbuf_len), 0}, |
|
{6, "debug", "=%i", NULL, (void *)(&config.sim.debug), 0}, |
{6, "verbose", "=%i", NULL, (void *)(&config.sim.verbose), 0}, |
{6, "profile", "=%i", NULL, (void *)(&config.sim.profile), 0}, |
{6, "prof_fn", "=\"%s\"", NULL, (void *)(&config.sim.prof_fn[0]), 0}, |
{6, "mprofile", "=%i", NULL, (void *)(&config.sim.mprofile), 0}, |
{6, "mprof_fn", "=\"%s\"", NULL, (void *)(&config.sim.mprof_fn[0]), 0}, |
{6, "history", "=%i", NULL, (void *)(&config.sim.history), 0}, |
{6, "exe_log", "=%i", NULL, (void *)(&config.sim.exe_log), 0}, |
{6, "exe_log_type", "=%s ", sim_exe_log_type, (void *)(&tempS[0]), 0}, |
{6, "exe_log_start", "=%i", NULL, (void *)(&config.sim.exe_log_start), 0}, |
{6, "exe_log_end", "=%i", NULL, (void *)(&config.sim.exe_log_end), 0}, |
{6, "exe_log_marker", "=%i", NULL, (void *)(&config.sim.exe_log_marker), 0}, |
{6, "exe_log_fn", "=\"%s\"", NULL, (void *)(&config.sim.exe_log_fn[0]), 0}, |
{6, "spr_log", "=%i", NULL, (void *)(&config.sim.spr_log), 0}, |
{6, "spr_log_fn", "=\"%s\"", NULL, (void *)(&config.sim.spr_log_fn[0]), 0}, |
{6, "clkcycle", "=%s ", sim_clkcycle, (void *)(&tempS[0]), 0}, |
{6, "stdout", "=\"%s\"", NULL, (void *)(&config.sim.fstdout[0]), 0}, |
void sim_profile (union param_val val, void *dat) { |
config.sim.profile = val.int_val; |
} |
|
{7, "enabled", "=%i", NULL, (void *)(&config.debug.enabled), 0}, |
{7, "gdb_enabled", "=%i", NULL, (void *)(&config.debug.gdb_enabled), 0}, |
{7, "server_port", "=%i", NULL, (void *)(&config.debug.server_port), 0}, |
{7, "vapi_id", "=0x%x", NULL, (void *)(&config.debug.vapi_id), 0}, |
|
{8, "enabled", "=%i", NULL, (void *)(&config.vapi.enabled), 0}, |
{8, "server_port", "=%i", NULL, (void *)(&config.vapi.server_port), 0}, |
{8, "log_enabled", "=%i", NULL, (void *)(&config.vapi.log_enabled), 0}, |
{8, "hide_device_id", "=%i", NULL, (void *)(&config.vapi.hide_device_id), 0}, |
{8, "vapi_log_fn", "=\"%s\"", NULL, (void *)(&config.vapi.vapi_fn[0]), 0}, |
|
{9, "nethernets", "=%i", eth_nethernets,(void *)(&tempL), CPF_GLOBAL}, |
{9, "device", "%i", change_device, (void *)(&tempL), 0}, |
{9, "irq", "=%i", eth_irq, (void *)(&tempUL), 15}, |
{9, "enddevice", "", end_device, NULL, 0}, |
{9, "baseaddr", "=0x%x", eth_baseaddr, (void *)(&tempUL), 0}, |
{9, "dma", "=%i", eth_dma, (void *)(&tempL), 0}, |
{9, "rtx_type", "=%i", eth_rtx_type, (void *)(&tempUL), 0}, |
{9, "rx_channel", "=%i", eth_rx_channel,(void *)(&tempL), 0}, |
{9, "tx_channel", "=%i", eth_tx_channel,(void *)(&tempL), 0}, |
{9, "rxfile", "=\"%s\"", eth_rxfile, (void *)(&tempS[0]), 0}, |
{9, "txfile", "=\"%s\"", eth_txfile, (void *)(&tempS[0]), 0}, |
{9, "sockif", "=\"%s\"", eth_sockif, (void *)(&tempS[0]), 0}, |
{9, "vapi_id", "=0x%x", eth_vapi_id, (void *)(&tempUL), 0}, |
|
{11, "enabled", "=%i", immu_enabled, (void *)(&tempL), 0}, |
{11, "nsets", "=%i", immu_nsets, (void *)(&tempL), 0}, |
{11, "nways", "=%i", immu_nways, (void *)(&tempL), 0}, |
{11, "pagesize", "=%i", immu_pagesize, (void *)(&tempL), 0}, |
{11, "entrysize", "=%i", immu_entrysize,(void *)(&tempL), 0}, |
{11, "ustates", "=%i", immu_ustates, (void *)(&tempL), 0}, |
{11, "missdelay", "=%i", NULL, (void *)(&config.immu.missdelay), 0}, |
{11, "hitdelay", "=%i", NULL, (void *)(&config.immu.hitdelay), 0}, |
|
{12, "enabled", "=%i", dmmu_enabled, (void *)(&tempL), 0}, |
{12, "nsets", "=%i", dmmu_nsets, (void *)(&tempL), 0}, |
{12, "nways", "=%i", dmmu_nways, (void *)(&tempL), 0}, |
{12, "pagesize", "=%i", dmmu_pagesize, (void *)(&tempL), 0}, |
{12, "entrysize", "=%i", dmmu_entrysize,(void *)(&tempL), 0}, |
{12, "ustates", "=%i", dmmu_ustates, (void *)(&tempL), 0}, |
{12, "missdelay", "=%i", NULL, (void *)(&config.dmmu.missdelay), 0}, |
{12, "hitdelay", "=%i", NULL, (void *)(&config.dmmu.hitdelay), 0}, |
void sim_prof_fn (union param_val val, void *dat) { |
strcpy(config.sim.prof_fn, val.str_val); |
} |
|
{13, "enabled", "=%i", ic_enabled, (void *)(&tempL), 0}, |
{13, "nsets", "=%i", ic_nsets, (void *)(&tempL), 0}, |
{13, "nways", "=%i", ic_nways, (void *)(&tempL), 0}, |
{13, "blocksize", "=%i", ic_blocksize, (void *)(&tempL), 0}, |
{13, "ustates", "=%i", ic_ustates, (void *)(&tempL), 0}, |
{13, "missdelay", "=%i", NULL, (void *)(&config.ic.missdelay), 0}, |
{13, "hitdelay", "=%i", NULL, (void *)(&config.ic.hitdelay), 0}, |
|
{14, "enabled", "=%i", dc_enabled, (void *)(&tempL), 0}, |
{14, "nsets", "=%i", dc_nsets, (void *)(&tempL), 0}, |
{14, "nways", "=%i", dc_nways, (void *)(&tempL), 0}, |
{14, "blocksize", "=%i", dc_blocksize, (void *)(&tempL), 0}, |
{14, "ustates", "=%i", dc_ustates, (void *)(&tempL), 0}, |
{14, "load_missdelay", "=%i", NULL, (void *)(&config.dc.load_missdelay), 0}, |
{14, "load_hitdelay", "=%i", NULL, (void *)(&config.dc.load_hitdelay), 0}, |
{14, "store_missdelay", "=%i", NULL, (void *)(&config.dc.store_missdelay), 0}, |
{14, "store_hitdelay", "=%i", NULL, (void *)(&config.dc.store_hitdelay), 0}, |
|
{15, "ngpios", "=%i", gpio_ngpios, (void *)(&tempL), CPF_GLOBAL}, |
{15, "device", "%i", change_device, (void *)(&tempL), 0}, |
{15, "baseaddr", "=0x%x", gpio_baseaddr, (void *)(&tempUL), 0}, |
{15, "irq", "=%i", gpio_irq, (void *)(&tempL), 0}, |
{15, "base_vapi_id", "=0x%x", gpio_base_vapi_id, (void *)(&tempUL), 0}, |
{15, "enddevice", "", end_device, NULL, 0}, |
|
{16, "enabled", "=%i", NULL, (void *)(&config.bpb.enabled), 0}, |
{16, "btic", "=%i", NULL, (void *)(&config.bpb.btic), 0}, |
{16, "sbp_bnf_fwd", "=%i", NULL, (void *)(&config.bpb.sbp_bnf_fwd), 0}, |
{16, "sbp_bf_fwd", "=%i", NULL, (void *)(&config.bpb.sbp_bf_fwd), 0}, |
{16, "missdelay", "=%i", NULL, (void *)(&config.bpb.missdelay), 0}, |
{16, "hitdelay", "=%i", NULL, (void *)(&config.bpb.hitdelay), 0}, |
|
{17, "enabled", "=%i", NULL, (void *)(&config.pm.enabled), 0}, |
|
{18, "nvgas", "=%i", vga_nvgas, (void *)(&tempL), CPF_GLOBAL}, |
{18, "device", "%i", change_device, (void *)(&tempL), 0}, |
{18, "baseaddr", "=0x%x", vga_baseaddr, (void *)(&tempUL), 0}, |
{18, "irq", "=%i", vga_irq, (void *)(&tempL), 0}, |
{18, "refresh_rate", "=%i", vga_refresh_rate, (void *)(&tempUL), 0}, |
{18, "filename", "=\"%s\"", vga_filename, (void *)(&tempS[0]), 0}, |
{18, "enddevice", "", end_device, NULL, 0}, |
|
{19, "enabled", "=%i", NULL, (void *)(&config.fb.enabled), 0}, |
{19, "baseaddr", "=0x%x", NULL, (void *)(&config.fb.baseaddr), 0}, |
{19, "refresh_rate", "=%i", NULL, (void *)(&config.fb.refresh_rate), 0}, |
{19, "filename", "=\"%s\"", NULL, (void *)(&config.fb.filename), 0}, |
|
{20, "enabled", "=%i", NULL, (void *)(&config.kbd.enabled), 0}, |
{20, "baseaddr", "=0x%x", NULL, (void *)(&config.kbd.baseaddr), 0}, |
{20, "irq", "=%i", NULL, (void *)(&config.kbd.irq), 0}, |
{20, "rxfile", "=\"%s\"", NULL, (void *)(&config.kbd.rxfile), 0}, |
|
{21, "natas", "=%i", ata_natas, (void *)(&tempL ), CPF_GLOBAL}, |
{21, "device", "%i", change_device, (void *)(&tempL ), 0}, |
{21, "baseaddr", "=0x%x", ata_baseaddr, (void *)(&tempUL), 0}, |
{21, "irq", "=%i", ata_irq, (void *)(&tempL ), 0}, |
{21, "dev_type0", "=%i", ata_dev_type0, (void *)(&tempL ), 0}, |
{21, "dev_file0", "=\"%s\"", ata_dev_file0, (void *)(&tempS ), 0}, |
{21, "dev_size0", "=%i", ata_dev_size0, (void *)(&tempUL), 0}, |
{21, "dev_packet0", "=%i", ata_dev_packet0, (void *)(&tempL ), 0}, |
{21, "dev_type1", "=%i", ata_dev_type1, (void *)(&tempL ), 0}, |
{21, "dev_file1", "=\"%s\"", ata_dev_file1, (void *)(&tempS ), 0}, |
{21, "dev_size1", "=%i", ata_dev_size1, (void *)(&tempUL), 0}, |
{21, "dev_packet1", "=%i", ata_dev_packet1, (void *)(&tempL ), 0}, |
{21, "enddevice", "", end_device, NULL, 0}, |
|
{22, "calling_convention","=%i", NULL, (void *)&config.cuc.calling_convention, 0}, |
{22, "enable_bursts", "=%i", NULL, (void *)&config.cuc.enable_bursts, 0}, |
{22, "no_multicycle", "=%i", NULL, (void *)&config.cuc.no_multicycle, 0}, |
{22, "memory_order", "=%s ", cuc_memory_order, (void *)&tempS, 0}, |
{22, "timings_fn", "=\"%s\"", NULL, (void *)config.cuc.timings_fn}, |
|
{23, "enabled", "=%i", NULL, (void *)(&config.test.enabled), 0}, |
{23, "baseaddr", "=0x%x", NULL, (void *)(&config.test.baseaddr), 0} |
}; |
|
/* *INDENT-ON* */ |
|
int current_device = -1; |
void change_device () { |
current_device = tempL; |
void sim_mprofile (union param_val val, void *dat) { |
config.sim.mprofile = val.int_val; |
} |
|
void end_device () { |
current_device = -1; |
void sim_mprof_fn (union param_val val, void *dat) { |
strcpy(config.sim.mprof_fn, val.str_val); |
} |
|
void base_include () { |
read_script_file (tempS); |
section = 0; |
void sim_history (union param_val val, void *dat) { |
config.sim.history = val.int_val; |
} |
|
void sim_clkcycle () { |
int len = strlen (tempS); |
int pos = len - 1; |
long time; |
if (len < 2) goto err; |
if (tempS[pos--] != 's') goto err; |
switch (tempS[pos--]) { |
case 'p': time = 1; break; |
case 'n': time = 1000; break; |
case 'u': time = 1000000; break; |
case 'm': time = 1000000000; break; |
default: |
goto err; |
} |
tempS[pos + 1] = 0; |
config.sim.clkcycle_ps = time * atol (tempS); |
return; |
err: |
ERROR("invalid time format."); |
void sim_exe_log (union param_val val, void *dat) { |
config.sim.exe_log = val.int_val; |
} |
|
void sim_exe_log_type () { |
if (strcmp (tempS, "default") == 0) |
void sim_exe_log_type (union param_val val, void *dat) { |
if (strcmp (val.str_val, "default") == 0) |
config.sim.exe_log_type = EXE_LOG_HARDWARE; |
else if (strcmp (tempS, "hardware") == 0) |
else if (strcmp (val.str_val, "hardware") == 0) |
config.sim.exe_log_type = EXE_LOG_HARDWARE; |
else if (strcmp (tempS, "simple") == 0) |
else if (strcmp (val.str_val, "simple") == 0) |
config.sim.exe_log_type = EXE_LOG_SIMPLE; |
else if (strcmp (tempS, "software") == 0) { |
else if (strcmp (val.str_val, "software") == 0) { |
config.sim.exe_log_type = EXE_LOG_SOFTWARE; |
} else { |
char tmp[200]; |
sprintf (tmp, "invalid execute log type '%s'.\n", tempS); |
ERROR(tmp); |
sprintf (tmp, "invalid execute log type '%s'.\n", val.str_val); |
CONFIG_ERROR(tmp); |
} |
} |
|
void uart_nuarts () { |
if (tempL >= 0 && tempL < MAX_UARTS) |
config.nuarts = tempL; |
else |
ERROR("invalid number of devices."); |
void sim_exe_log_start (union param_val val, void *dat) { |
config.sim.exe_log_start = val.int_val; |
} |
|
void uart_baseaddr () { |
if (current_device >= 0 && current_device < config.nuarts) |
config.uarts[current_device].baseaddr = tempUL; |
else |
ERROR("invalid device number."); |
void sim_exe_log_end (union param_val val, void *dat) { |
config.sim.exe_log_end = val.int_val; |
} |
|
void uart_jitter () { |
if (current_device >= 0 && current_device < config.nuarts) |
config.uarts[current_device].jitter = tempL; |
else |
ERROR("invalid device number."); |
void sim_exe_log_marker (union param_val val, void *dat) { |
config.sim.exe_log_marker = val.int_val; |
} |
|
void uart_irq () { |
if (current_device >= 0 && current_device < config.nuarts) |
config.uarts[current_device].irq = tempL; |
else |
ERROR("invalid device number."); |
void sim_exe_log_fn (union param_val val, void *dat) { |
strcpy(config.sim.exe_log_fn, val.str_val); |
} |
|
void uart_16550 () { |
if (current_device >= 0 && current_device < config.nuarts) |
config.uarts[current_device].uart16550 = tempL; |
else |
ERROR("invalid device number."); |
void sim_clkcycle (union param_val val, void *dat) { |
int len = strlen (val.str_val); |
int pos = len - 1; |
long time; |
if (len < 2) goto err; |
if (val.str_val[pos--] != 's') goto err; |
switch (val.str_val[pos--]) { |
case 'p': time = 1; break; |
case 'n': time = 1000; break; |
case 'u': time = 1000000; break; |
case 'm': time = 1000000000; break; |
default: |
goto err; |
} |
val.str_val[pos + 1] = 0; |
config.sim.clkcycle_ps = time * atol (val.str_val); |
return; |
err: |
CONFIG_ERROR("invalid time format."); |
} |
|
void uart_channel () { |
if (current_device >= 0 && current_device < config.nuarts) |
strcpy (config.uarts[current_device].channel, tempS); |
else |
ERROR("invalid device number."); |
void sim_stdout (union param_val val, void *dat) { |
strcpy(config.sim.fstdout, val.str_val); |
} |
|
void uart_newway () { |
ERROR(" txfile and rxfile and now obsolete.\n\tUse 'channel = \"file:rxfile,txfile\"' instead."); |
exit(1); |
void sim_spr_log (union param_val val, void *dat) { |
config.sim.spr_log = val.int_val; |
} |
|
void uart_vapi_id () { |
if (current_device >= 0 && current_device < config.nuarts) |
config.uarts[current_device].vapi_id = tempUL; |
else |
ERROR("invalid device number."); |
void sim_spr_log_fn (union param_val val, void *dat) { |
strcpy(config.sim.spr_log_fn, val.str_val); |
} |
|
void dma_ndmas () { |
if (tempL >= 0 && tempL < MAX_DMAS) |
config.ndmas = tempL; |
else |
ERROR("invalid number of devices."); |
} |
void reg_sim_sec (void) { |
struct config_section *sec = reg_config_sec("sim", NULL, NULL); |
|
void dma_baseaddr () { |
if (current_device >= 0 && current_device < config.ndmas) |
config.dmas[current_device].baseaddr = tempUL; |
else |
ERROR("invalid device number."); |
reg_config_param(sec, "debug", paramt_int, sim_debug); |
reg_config_param(sec, "verbose", paramt_int, sim_verbose); |
reg_config_param(sec, "profile", paramt_int, sim_profile); |
reg_config_param(sec, "prof_fn", paramt_str, sim_prof_fn); |
reg_config_param(sec, "mprofile", paramt_int, sim_mprofile); |
reg_config_param(sec, "mprof_fn", paramt_str, sim_mprof_fn); |
reg_config_param(sec, "history", paramt_int, sim_history); |
reg_config_param(sec, "exe_log", paramt_int, sim_exe_log); |
reg_config_param(sec, "exe_log_type", paramt_word, sim_exe_log_type); |
reg_config_param(sec, "exe_log_start", paramt_int, sim_exe_log_start); |
reg_config_param(sec, "exe_log_end", paramt_int, sim_exe_log_end); |
reg_config_param(sec, "exe_log_marker", paramt_int, sim_exe_log_marker); |
reg_config_param(sec, "exe_log_fn", paramt_str, sim_exe_log_fn); |
reg_config_param(sec, "spr_log", paramt_int, sim_spr_log); |
reg_config_param(sec, "spr_log_fn", paramt_str, sim_spr_log_fn); |
reg_config_param(sec, "clkcycle", paramt_word, sim_clkcycle); |
reg_config_param(sec, "stdout", paramt_str, sim_stdout); |
} |
|
void dma_irq () { |
if (current_device >= 0 && current_device < config.ndmas) |
config.dmas[current_device].irq = tempL; |
else |
ERROR("invalid device number."); |
/*-------------------------------------------------[ Memory configuration ]---*/ |
void memory_random_seed(union param_val val, void *dat) { |
config.memory.random_seed = val.int_val; |
} |
|
void dma_vapi_id () { |
if (current_device >= 0 && current_device < config.ndmas) |
config.dmas[current_device].vapi_id = tempUL; |
else |
ERROR("invalid device number."); |
void memory_pattern(union param_val val, void *dat) { |
config.memory.pattern = val.int_val; |
} |
|
void memory_nmemories () { |
if (tempL >= 0 && tempL < MAX_MEMORIES) |
config.memory.nmemories = tempL; |
void memory_nmemories (union param_val val, void *dat) { |
if (val.int_val >= 0 && val.int_val < MAX_MEMORIES) |
config.memory.nmemories = val.int_val; |
else |
ERROR("invalid number of devices."); |
CONFIG_ERROR("invalid number of devices."); |
} |
|
void memory_type () { |
if (strcmp (tempS, "unknown") == 0) |
void memory_type (union param_val val, void *dat) { |
if (strcmp (val.str_val, "unknown") == 0) |
config.memory.type = MT_UNKNOWN; |
else if (strcmp (tempS, "random") == 0) |
else if (strcmp (val.str_val, "random") == 0) |
config.memory.type = MT_RANDOM; |
else if (strcmp (tempS, "pattern") == 0) |
else if (strcmp (val.str_val, "pattern") == 0) |
config.memory.type = MT_PATTERN; |
else if (strcmp (tempS, "zero") == 0) { |
else if (strcmp (val.str_val, "zero") == 0) { |
config.memory.type = MT_PATTERN; |
config.memory.pattern = 0; |
} else { |
char tmp[200]; |
sprintf (tmp, "invalid memory type '%s'.\n", tempS); |
ERROR(tmp); |
sprintf (tmp, "invalid memory type '%s'.\n", val.str_val); |
CONFIG_ERROR(tmp); |
} |
} |
|
void memory_ce () { |
void memory_ce (union param_val val, void *dat) { |
if (current_device >= 0 && current_device < config.memory.nmemories) |
config.memory.table[current_device].ce = tempL; |
config.memory.table[current_device].ce = val.int_val; |
else |
ERROR("invalid device number."); |
CONFIG_ERROR("invalid device number."); |
} |
|
void memory_baseaddr () { |
void memory_baseaddr (union param_val val, void *dat) { |
if (current_device >= 0 && current_device < config.memory.nmemories) |
config.memory.table[current_device].baseaddr = tempUL; |
config.memory.table[current_device].baseaddr = val.addr_val; |
else |
ERROR("invalid device number."); |
CONFIG_ERROR("invalid device number."); |
} |
|
void memory_size () { |
void memory_size (union param_val val, void *dat) { |
if (current_device >= 0 && current_device < config.memory.nmemories) |
config.memory.table[current_device].size = tempUL; |
config.memory.table[current_device].size = val.int_val; |
else |
ERROR("invalid device number."); |
CONFIG_ERROR("invalid device number."); |
} |
|
void memory_name () { |
void memory_name (union param_val val, void *dat) { |
if (current_device >= 0 && current_device < config.memory.nmemories) |
strcpy (config.memory.table[current_device].name, tempS); |
strcpy (config.memory.table[current_device].name, val.str_val); |
else |
ERROR("invalid device number."); |
CONFIG_ERROR("invalid device number."); |
} |
|
void memory_log () { |
void memory_log (union param_val val, void *dat) { |
if (current_device >= 0 && current_device < config.memory.nmemories) |
strcpy (config.memory.table[current_device].log, tempS); |
strcpy (config.memory.table[current_device].log, val.str_val); |
else |
ERROR("invalid device number."); |
CONFIG_ERROR("invalid device number."); |
} |
|
void memory_delayr () { |
void memory_delayr (union param_val val, void *dat) { |
if (current_device >= 0 && current_device < config.memory.nmemories) |
config.memory.table[current_device].delayr = tempL; |
config.memory.table[current_device].delayr = val.int_val; |
else |
ERROR("invalid device number."); |
CONFIG_ERROR("invalid device number."); |
} |
|
void memory_delayw () { |
void memory_delayw (union param_val val, void *dat) { |
if (current_device >= 0 && current_device < config.memory.nmemories) |
config.memory.table[current_device].delayw = tempL; |
config.memory.table[current_device].delayw = val.int_val; |
else |
ERROR("invalid device number."); |
CONFIG_ERROR("invalid device number."); |
} |
|
void cpu_sbuf_len () { |
if (config.cpu.sbuf_len >= MAX_SBUF_LEN) { |
config.cpu.sbuf_len = MAX_SBUF_LEN - 1; |
WARNING("sbuf_len too large; truncated."); |
} else if (config.cpu.sbuf_len < 0) { |
config.cpu.sbuf_len = 0; |
WARNING("sbuf_len negative; disabled."); |
} |
} |
void reg_memory_sec(void) { |
struct config_section *sec = reg_config_sec("memory", NULL, NULL); |
|
void eth_nethernets () { |
if (tempL >= 0 && tempL < MAX_ETHERNETS) |
config.nethernets = tempL; |
else |
ERROR("invalid number of devices."); |
reg_config_param(sec, "random_seed", paramt_int, memory_random_seed); |
reg_config_param(sec, "pattern", paramt_int, memory_pattern); |
reg_config_param(sec, "type", paramt_word, memory_type); |
reg_config_param(sec, "nmemories", paramt_int, memory_nmemories); |
reg_config_param(sec, "device", paramt_int, change_device); |
reg_config_param(sec, "enddevice", paramt_none, end_device); |
reg_config_param(sec, "ce", paramt_int, memory_ce); |
reg_config_param(sec, "baseaddr", paramt_addr, memory_baseaddr); |
reg_config_param(sec, "size", paramt_int, memory_size); |
reg_config_param(sec, "name", paramt_str, memory_name); |
reg_config_param(sec, "log", paramt_str, memory_log); |
reg_config_param(sec, "delayr", paramt_int, memory_delayr); |
reg_config_param(sec, "delayw", paramt_int, memory_delayw); |
} |
|
void eth_baseaddr () { |
if (current_device >= 0 && current_device < config.nethernets) |
config.ethernets[current_device].baseaddr = tempUL; |
else |
ERROR("invalid device number."); |
/*----------------------------------------------------[ CPU configuration ]---*/ |
void cpu_ver (union param_val val, void *dat) { |
config.cpu.ver = val.int_val; |
} |
|
void eth_dma () { |
if (current_device >= 0 && current_device < config.nethernets) |
config.ethernets[current_device].dma = tempL; |
else |
ERROR("invalid device number."); |
void cpu_rev (union param_val val, void *dat) { |
config.cpu.rev = val.int_val; |
} |
|
void eth_rtx_type () { |
if (current_device >= 0 && current_device < config.nethernets) |
config.ethernets[current_device].rtx_type = tempUL; |
else |
ERROR("invalid device number."); |
void cpu_upr (union param_val val, void *dat) { |
config.cpu.upr = val.int_val; |
} |
|
void eth_rx_channel () { |
if (current_device >= 0 && current_device < config.nethernets) |
config.ethernets[current_device].rx_channel = tempL; |
else |
ERROR("invalid device number."); |
void cpu_sr (union param_val val, void *dat) { |
config.cpu.sr = val.int_val; |
} |
|
void eth_tx_channel () { |
if (current_device >= 0 && current_device < config.nethernets) |
config.ethernets[current_device].rx_channel = tempL; |
else |
ERROR("invalid device number."); |
void cpu_hazards (union param_val val, void *dat) { |
config.cpu.hazards = val.int_val; |
} |
|
void eth_rxfile () { |
if (current_device >= 0 && current_device < config.nethernets) |
strcpy (config.ethernets[current_device].rxfile, tempS); |
else |
ERROR("invalid device number."); |
void cpu_superscalar (union param_val val, void *dat) { |
config.cpu.superscalar = val.int_val; |
} |
|
void eth_txfile () { |
if (current_device >= 0 && current_device < config.nethernets) |
strcpy (config.ethernets[current_device].txfile, tempS); |
else |
ERROR("invalid device number."); |
void cpu_dependstats (union param_val val, void *dat) { |
config.cpu.dependstats = val.int_val; |
} |
|
void eth_sockif () { |
if (current_device >= 0 && current_device < config.nethernets) |
strcpy (config.ethernets[current_device].sockif, tempS); |
else |
ERROR("invalid device number."); |
void cpu_sbuf_len (union param_val val, void *dat) { |
if (val.int_val >= MAX_SBUF_LEN) { |
config.cpu.sbuf_len = MAX_SBUF_LEN - 1; |
WARNING("sbuf_len too large; truncated."); |
} else if (val.int_val < 0) { |
config.cpu.sbuf_len = 0; |
WARNING("sbuf_len negative; disabled."); |
} else |
config.cpu.sbuf_len = val.int_val; |
} |
|
void eth_irq () { |
if (current_device >= 0 && current_device < config.nethernets) |
config.ethernets[current_device].irq = tempUL; |
else |
ERROR("invalid device number."); |
} |
void reg_cpu_sec(void) |
{ |
struct config_section *sec = reg_config_sec("cpu", NULL, NULL); |
|
void eth_vapi_id () { |
if (current_device >= 0 && current_device < config.nethernets) |
config.ethernets[current_device].base_vapi_id = tempUL; |
else |
ERROR("invalid device number."); |
reg_config_param(sec, "ver", paramt_int, cpu_ver); |
reg_config_param(sec, "rev", paramt_int, cpu_rev); |
reg_config_param(sec, "upr", paramt_int, cpu_upr); |
reg_config_param(sec, "sr", paramt_int, cpu_sr); |
reg_config_param(sec, "hazards", paramt_int, cpu_hazards); |
reg_config_param(sec, "superscalar", paramt_int, cpu_superscalar); |
reg_config_param(sec, "dependstats", paramt_int, cpu_dependstats); |
reg_config_param(sec, "sbuf_len", paramt_int, cpu_sbuf_len); |
} |
|
void gpio_ngpios () { |
if (tempL >= 0 && tempL < MAX_GPIOS) |
config.ngpios = tempL; |
else |
ERROR("invalid number of devices."); |
} |
|
void gpio_baseaddr () { |
if (current_device >= 0 && current_device < config.ngpios) |
config.gpios[current_device].baseaddr = tempUL; |
else |
ERROR("invalid device number."); |
} |
|
void gpio_irq () { |
if (current_device >= 0 && current_device < config.ngpios) |
config.gpios[current_device].irq = tempL; |
else |
ERROR("invalid device number."); |
} |
|
void gpio_base_vapi_id () { |
if (current_device >= 0 && current_device < config.ngpios) |
config.gpios[current_device].base_vapi_id = tempUL; |
else |
ERROR("invalid device number."); |
} |
|
int is_power2 (int x) { |
while (!(x & 1)) |
x >>= 1; |
1016,287 → 611,126
return x == 1; |
} |
|
void immu_enabled () { |
setsprbits (SPR_UPR, SPR_UPR_IMP, tempL & 1); |
config.immu.enabled = tempL; |
} |
void reg_config_secs(void) |
{ |
reg_config_param(reg_config_sec("base", NULL, NULL), "include", paramt_str, |
base_include); |
|
void dmmu_enabled () { |
setsprbits (SPR_UPR, SPR_UPR_DMP, tempL & 1); |
config.dmmu.enabled = tempL; |
reg_sim_sec(); |
reg_cpu_sec(); |
reg_memory_sec(); |
reg_mc_sec(); |
reg_uart_sec(); |
reg_dma_sec(); |
reg_debug_sec(); |
reg_vapi_sec(); |
reg_ethernet_sec(); |
reg_immu_sec(); |
reg_dmmu_sec(); |
reg_ic_sec(); |
reg_dc_sec(); |
reg_gpio_sec(); |
reg_bpb_sec(); |
reg_pm_sec(); |
reg_vga_sec(); |
reg_fb_sec(); |
reg_kbd_sec(); |
reg_ata_sec(); |
reg_cuc_sec(); |
reg_test_sec(); |
} |
|
void immu_nsets () { |
if (is_power2(tempL) && tempL <= 256) |
config.immu.nsets = tempL; |
else |
ERROR("value of power of two and lower or equal than 256 expected."); |
} |
void reg_config_param(struct config_section *sec, const char *param, |
enum param_t type, |
void (*param_cb)(union param_val, void *)) |
{ |
struct config_param *new = malloc(sizeof(struct config_param)); |
|
void dmmu_nsets () { |
if (is_power2(tempL) && tempL <= 256) |
config.dmmu.nsets = tempL; |
else |
ERROR("value of power of two and lower or equal than 256 expected."); |
} |
if(!new) { |
fprintf(stderr, "Out-of-memory\n"); |
exit(1); |
} |
|
void immu_nways () { |
if (tempL >= 1 && tempL <= 4) |
config.immu.nways = tempL; |
else |
ERROR("value 1, 2, 3 or 4 expected."); |
} |
if(!(new->name = strdup(param))) { |
fprintf(stderr, "Out-of-memory\n"); |
exit(1); |
} |
|
void dmmu_nways () { |
if (tempL >= 1 && tempL <= 4) |
config.dmmu.nways = tempL; |
else |
ERROR("value 1, 2, 3 or 4 expected."); |
} |
new->func = param_cb; |
new->type = type; |
|
void immu_pagesize () { |
if (is_power2(tempL)) |
config.immu.pagesize = tempL; |
else |
ERROR("value of power of two expected."); |
new->next = sec->params; |
sec->params = new; |
} |
|
void dmmu_pagesize () { |
if (is_power2(tempL)) |
config.dmmu.pagesize = tempL; |
else |
ERROR("value of power of two expected."); |
} |
struct config_section *reg_config_sec(const char *section, |
void *(*sec_start)(void), |
void (*sec_end)(void *)) |
{ |
struct config_section *new = malloc(sizeof(struct config_section)); |
|
void immu_entrysize () { |
if (is_power2(tempL)) |
config.immu.entrysize = tempL; |
else |
ERROR("value of power of two expected."); |
} |
if(!new) { |
fprintf(stderr, "Out-of-memory\n"); |
exit(1); |
} |
|
void dmmu_entrysize () { |
if (is_power2(tempL)) |
config.dmmu.entrysize = tempL; |
else |
ERROR("value of power of two expected."); |
} |
|
void immu_ustates () { |
if (tempL >= 2 && tempL <= 4) |
config.immu.ustates = tempL; |
else |
ERROR("invalid USTATE."); |
} |
|
void dmmu_ustates () { |
if (tempL >= 2 && tempL <= 4) |
config.dmmu.ustates = tempL; |
else |
ERROR("invalid USTATE."); |
} |
|
void ic_enabled () { |
config.ic.enabled = tempL; |
setsprbits (SPR_UPR, SPR_UPR_ICP, tempL & 1); |
} |
|
void ic_nsets () { |
if (is_power2(tempL) && tempL <= MAX_IC_SETS) |
config.ic.nsets = tempL; |
else { |
char tmp[200]; |
sprintf (tmp, "value of power of two and lower or equal than %i expected.", MAX_IC_SETS); |
ERROR(tmp); |
if(!(new->name = strdup(section))) { |
fprintf(stderr, "Out-of-memory\n"); |
exit(1); |
} |
} |
|
void ic_nways () { |
if (tempL >= 1 && tempL <= MAX_IC_WAYS) |
config.ic.nways = tempL; |
else |
ERROR("value 1, 2, 3 or 4 expected."); |
} |
new->next = sections; |
new->sec_start = sec_start; |
new->sec_end = sec_end; |
new->params = NULL; |
|
void ic_blocksize () { |
if (is_power2(tempL)) |
config.ic.blocksize = tempL; |
else |
ERROR("value of power of two expected."); |
} |
sections = new; |
|
void ic_ustates () { |
if (tempL >= 2 && tempL <= 4) |
config.ic.ustates = tempL; |
else |
ERROR("invalid USTATE."); |
return new; |
} |
|
void dc_enabled () { |
config.dc.enabled = tempL; |
setsprbits (SPR_UPR, SPR_UPR_DCP, tempL & 1); |
} |
static void switch_param(char *param, struct config_param *cur_param) |
{ |
char *end_p; |
union param_val val; |
|
void dc_nsets () { |
if (is_power2(tempL) && tempL <= MAX_DC_SETS) |
config.dc.nsets = tempL; |
else { |
char tmp[200]; |
sprintf (tmp, "value of power of two and lower or equal than %i expected.", MAX_DC_SETS); |
ERROR(tmp); |
/* Skip over an = sign if it exists */ |
if(*param == '=') { |
param++; |
while(*param && isspace(*param)) param++; |
} |
} |
|
void dc_nways () { |
if (tempL >= 1 && tempL <= MAX_IC_WAYS) |
config.dc.nways = tempL; |
else |
ERROR("value 1, 2, 3 or 4 expected."); |
} |
switch (cur_param->type) { |
case paramt_int: |
val.int_val = strtol(param, NULL, 0); |
case paramt_addr: |
val.addr_val = strtoul(param, NULL, 0); |
break; |
case paramt_str: |
if(*param != '"') { |
CONFIG_ERROR("String value expected\n"); |
return; |
} |
|
void dc_blocksize () { |
if (is_power2(tempL)) |
config.dc.blocksize = tempL; |
else |
ERROR("value of power of two expected."); |
} |
param++; |
end_p = param; |
while(*end_p && (*end_p != '"')) end_p++; |
*end_p = '\0'; |
val.str_val = param; |
break; |
case paramt_word: |
end_p = param; |
while(*end_p && !isspace(*end_p)) end_p++; |
*end_p = '\0'; |
val.str_val = param; |
break; |
case paramt_none: |
break; |
} |
|
void dc_ustates () { |
if (tempL >= 2 && tempL <= 4) |
config.dc.ustates = tempL; |
else |
ERROR("invalid USTATE."); |
cur_param->func(val, cur_section->dat); |
} |
|
void vga_nvgas () { |
if (tempL >= 0 && tempL < MAX_VGAS) |
config.nvgas = tempL; |
else |
ERROR("invalid number of devices."); |
} |
|
void vga_baseaddr () { |
if (current_device >= 0 && current_device < config.nvgas) |
config.vgas[current_device].baseaddr = tempUL; |
else |
ERROR("invalid device number."); |
} |
|
void vga_irq () { |
if (current_device >= 0 && current_device < config.nvgas) |
config.vgas[current_device].irq = tempL; |
else |
ERROR("invalid device number."); |
} |
|
void vga_refresh_rate () { |
if (current_device >= 0 && current_device < config.nvgas) |
config.vgas[current_device].refresh_rate = tempUL; |
else |
ERROR("invalid device number."); |
} |
|
void vga_filename () { |
if (current_device >= 0 && current_device < config.nvgas) |
strcpy (config.vgas[current_device].filename, tempS); |
else |
ERROR("invalid device number."); |
} |
|
|
void ata_natas () { |
if (tempL >= 0 && tempL < MAX_ATAS) |
config.natas = tempL; |
else |
ERROR("invalid number of devices."); |
} |
|
void ata_baseaddr () { |
if (current_device >= 0 && current_device < config.natas) |
config.atas[current_device].baseaddr = tempUL; |
else |
ERROR("invalid device number."); |
} |
|
void ata_irq () { |
if (current_device >= 0 && current_device < config.natas) |
config.atas[current_device].irq = tempL; |
else |
ERROR("invalid device number."); |
} |
|
void ata_dev_type0 () { |
if (current_device >= 0 && current_device < config.natas) |
config.atas[current_device].dev_type0 = tempL; |
else |
ERROR("invalid device number."); |
} |
|
void ata_dev_file0 () { |
if (current_device >= 0 && current_device < config.natas) |
strcpy (config.atas[current_device].dev_file0, tempS); |
else |
ERROR("invalid device number."); |
} |
|
void ata_dev_size0 () { |
if (current_device >= 0 && current_device < config.natas) |
config.atas[current_device].dev_size0 = tempUL; |
else |
ERROR("invalid device number."); |
} |
|
void ata_dev_packet0 () { |
if (current_device >= 0 && current_device < config.natas) |
config.atas[current_device].dev_packet0 = tempL; |
else |
ERROR("invalid device number."); |
} |
|
void ata_dev_type1 () { |
if (current_device >= 0 && current_device < config.natas) |
config.atas[current_device].dev_type1 = tempL; |
else |
ERROR("invalid device number."); |
} |
|
void ata_dev_file1 () { |
if (current_device >= 0 && current_device < config.natas) |
strcpy (config.atas[current_device].dev_file1, tempS); |
else |
ERROR("invalid device number."); |
} |
|
void ata_dev_size1 () { |
if (current_device >= 0 && current_device < config.natas) |
config.atas[current_device].dev_size1 = tempUL; |
else |
ERROR("invalid device number."); |
} |
|
void ata_dev_packet1 () { |
if (current_device >= 0 && current_device < config.natas) |
config.atas[current_device].dev_packet1 = tempL; |
else |
ERROR("invalid device number."); |
} |
|
void cuc_memory_order () { |
if (strcmp (tempS, "none") == 0) |
config.cuc.memory_order = MO_NONE; |
else if (strcmp (tempS, "weak") == 0) |
config.cuc.memory_order = MO_WEAK; |
else if (strcmp (tempS, "strong") == 0) |
config.cuc.memory_order = MO_STRONG; |
else if (strcmp (tempS, "exact") == 0) { |
config.cuc.memory_order = MO_EXACT; |
} else { |
char tmp[200]; |
sprintf (tmp, "invalid memory order '%s'.\n", tempS); |
ERROR(tmp); |
} |
} |
|
/* Read environment from a script file. Does not fail - assumes default configuration instead. |
The syntax of script file is: |
param = value |
1320,7 → 754,7
char *home = getenv("HOME"); |
char ctmp[STR_SIZE]; |
int local = 1; |
section = 0; |
cur_section = NULL; |
|
sprintf(ctmp, "%s/.or1k/%s", home, filename); |
if ((f = fopen (filename, "rt")) != NULL |
1332,28 → 766,32
while (!feof(f)) { |
char param[STR_SIZE]; |
if (fscanf(f, "%s ", param) != 1) break; |
/* Is this a sections? */ |
/* Is this a section? */ |
if (strcmp (param, "section") == 0) { |
int i; |
section = 0; |
struct config_section *cur; |
cur_section = NULL; |
if (fscanf (f, "%s\n", param) != 1) { |
fprintf (stderr, "%s: ERROR: Section name required.\n", local ? filename : ctmp); |
exit (1); |
} |
for (i = 1; i < sizeof(sections) / sizeof(struct section); i++) |
if (strcmp (sections[i].name, param) == 0) { |
section = i; |
for (cur = sections; cur; cur = cur->next) |
if (strcmp (cur->name, param) == 0) { |
cur_section = cur; |
break; |
} |
if (!section) { |
char tmp[200]; |
sprintf (tmp, "Unknown section: %s; ignoring.", param); |
WARNING(tmp); |
if (!cur) { |
fprintf (stderr, "WARNING: config: Unknown section: %s; ignoring.", param); |
/* just skip section */ |
while (fscanf (f, "%s\n", param) != 1 && strcmp (param, "end")); |
} else { |
cur->dat = NULL; |
if (cur->sec_start) |
cur->dat = cur->sec_start(); |
} |
} else if (strcmp (param, "end") == 0) { |
section = 0; |
if(cur_section->sec_end) |
cur_section->sec_end(cur_section->dat); |
cur_section = NULL; |
} else if (strncmp (param, "/*", 2) == 0) { |
char c0 = 0, c1 = 0; |
while (c0 != '*' || c1 != '/') { |
1365,13 → 803,13
} |
} |
} else { |
int i, found = -1; |
for (i = 0; i < sizeof(config_params)/sizeof(struct config_params); i++) |
if (config_params[i].section == section && strcmp (config_params[i].name, param) == 0) { |
found = i; |
struct config_param *cur_param; |
char *cur_p; |
for (cur_param = cur_section->params; cur_param; cur_param = cur_param->next) |
if (strcmp (cur_param->name, param) == 0) { |
break; |
} |
if (found < 0) { |
if (!cur_param) { |
char tmp[200]; |
sprintf (tmp, "Invalid parameter: %s; ignoring.\n", param); |
WARNING(tmp); |
1379,14 → 817,15
continue; |
} |
|
if(cur_param->type == paramt_none) |
continue; |
|
/* Parse parameter value */ |
{ |
if (config_params[found].type[0]) |
if(fscanf_ex (f, config_params[found].type, config_params[found].addr, 0)) |
exit (1); |
} |
if (config_params[found].func) |
config_params[found].func(); |
cur_p = fgets (param, STR_SIZE, f); |
|
while(*cur_p && isspace(*cur_p)) cur_p++; |
|
switch_param(cur_p, cur_param); |
} |
} |
fclose (f); |
1399,41 → 838,38
/* Utility for execution of set sim command. */ |
static int set_config (int argc, char **argv) |
{ |
int i; |
struct config_section *cur; |
struct config_param *cur_param; |
|
if (argc < 2) return 1; |
|
PRINTF ("sec:%s\n", argv[1]); |
section = 0; |
for (i = 1; i < sizeof(sections) / sizeof(struct section); i++) |
if (strcmp (sections[i].name, argv[1]) == 0) { |
section = i; |
cur_section = NULL; |
for (cur = sections; cur; cur = cur->next) |
if (strcmp (cur->name, argv[1]) == 0) { |
cur_section = cur; |
break; |
} |
|
if (!section) return 1; |
if (!cur_section) return 1; |
|
if (argc < 3) return 2; |
|
PRINTF ("item:%s\n", argv[2]); |
{ |
int found = -1; |
for (i = 0; i < sizeof(config_params)/sizeof(struct config_params); i++) |
if (config_params[i].section == section && strcmp (config_params[i].name, argv[2]) == 0) { |
found = i; |
for (cur_param = cur->params; cur_param; cur_param = cur_param->next) |
if (strcmp (cur_param->name, argv[2]) == 0) { |
break; |
} |
if (found < 0) return 2; |
if (!cur_param) return 2; |
|
/* Parse parameter value */ |
if (config_params[found].type[0]) { |
if (cur_param->type) { |
if (argc < 4) return 3; |
if (fscanf_ex (0, config_params[found].type, config_params[found].addr, argv[3])) |
return 3; |
PRINTF ("params:%s\n", argv[3]); |
} |
if (config_params[found].func) |
config_params[found].func(); |
|
switch_param(argv[3], cur_param); |
} |
return 0; |
} |
1441,20 → 877,20
/* Executes set sim command, displays error. */ |
void set_config_command(int argc, char **argv) |
{ |
int i; |
struct config_section *cur; |
struct config_param *cur_param; |
|
switch (set_config (argc, argv)) { |
case 1: |
PRINTF ("Invalid or missing section name. One of valid sections must be specified:\n"); |
for (i = 1; i < sizeof(sections) / sizeof(struct section); i++) |
PRINTF ("%s ", sections[i].name); |
for (cur = sections; cur; cur = cur->next) |
PRINTF ("%s ", cur->name); |
PRINTF ("\n"); |
break; |
case 2: |
PRINTF ("Invalid or missing item name. One of valid items must be specified:\n"); |
for (i = 0; i < sizeof(config_params)/sizeof(struct config_params); i++) |
if (config_params[i].section == section) |
PRINTF ("%s ", config_params[i].name); |
for (cur_param = cur_section->params; cur_param; cur_param = cur_param->next) |
PRINTF ("%s ", cur_param->name); |
PRINTF ("\n"); |
break; |
case 3: |
/trunk/or1ksim/support/sched.c
28,7 → 28,6
#include <limits.h> |
|
#include "config.h" |
#include "sim-config.h" |
#include "sched.h" |
|
struct scheduler_struct scheduler; |
/trunk/or1ksim/support/dumpverilog.c
31,8 → 31,8
#endif |
|
#include "port.h" |
#include "arch.h" |
#include "sim-config.h" |
#include "arch.h" |
#include "parse.h" |
#include "abstract.h" |
#include "opcode/or32.h" |