#if WITH_COMMON
#include "sim-main.h"
#include "sim-options.h"
+/* start-sanitize-am30 */
#include "sim-hw.h"
+/* end-sanitize-am30 */
#else
#include "mn10300_sim.h"
#endif
host_callback *mn10300_callback;
int mn10300_debug;
+
+/* simulation target board. NULL=default configuration */
+static char* board = NULL;
+
+static DECLARE_OPTION_HANDLER (mn10300_option_handler);
+
+enum {
+ OPTION_BOARD = OPTION_START,
+};
+
+static SIM_RC
+mn10300_option_handler (sd, cpu, opt, arg, is_command)
+ SIM_DESC sd;
+ sim_cpu *cpu;
+ int opt;
+ char *arg;
+ int is_command;
+{
+ int cpu_nr;
+ switch (opt)
+ {
+ case OPTION_BOARD:
+ {
+ if (arg)
+ {
+ board = zalloc(strlen(arg) + 1);
+ strcpy(board, arg);
+ }
+ return SIM_RC_OK;
+ }
+ }
+
+ return SIM_RC_OK;
+}
+
+static const OPTION mn10300_options[] =
+{
+/* start-sanitize-am30 */
+#define BOARD_AM32 "am32"
+ { {"board", required_argument, NULL, OPTION_BOARD},
+ '\0', "none" /* rely on compile-time string concatenation for other options */
+ "|" BOARD_AM32
+ , "Customize simulation for a particular board.", mn10300_option_handler },
+/* end-sanitize-am30 */
+
+ { {NULL, no_argument, NULL, 0}, '\0', NULL, NULL, NULL }
+};
+
#if WITH_COMMON
#else
static void dispatch PARAMS ((uint32, uint32, int));
return 0;
}
-
SIM_DESC
sim_open (kind, cb, abfd, argv)
SIM_OPEN_KIND kind;
char **argv;
{
SIM_DESC sd = sim_state_alloc (kind, cb);
- struct hw *hw;
mn10300_callback = cb;
SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
if (sim_pre_argv_init (sd, argv[0]) != SIM_RC_OK)
return 0;
+ sim_add_option_table (sd, NULL, mn10300_options);
/* Allocate core managed memory */
sim_do_command (sd, "memory region 0,0x100000");
return 0;
}
- hw = hw_tree_create (sd, "core");
- hw_tree_parse (hw, "/");
- if (STATE_VERBOSE_P (sd))
- hw_tree_parse (hw, "/trace? true");
-
-
- /* interrupt controller */
-
- hw_tree_parse (hw, "/mn103int@0x34000100");
- if (STATE_VERBOSE_P (sd))
- hw_tree_parse (hw, "/mn103int/trace? true");
- hw_tree_parse (hw, "/mn103int/reg 0x34000100 0x68 0x34000200 0x8 0x3400280 0x8");
-
- /* NMI input's */
- hw_tree_parse (hw, "/glue@0x30000000");
- if (STATE_VERBOSE_P (sd))
- hw_tree_parse (hw, "/glue@0x30000000/trace? true");
- hw_tree_parse (hw, "/glue@0x30000000/reg 0x30000000 16");
- hw_tree_parse (hw, "/glue@0x30000000 > int1 nmirq /mn103int");
- hw_tree_parse (hw, "/glue@0x30000000 > int2 watchdog /mn103int");
- hw_tree_parse (hw, "/glue@0x30000000 > int3 syserr /mn103int");
-
- /* NMI output */
- hw_tree_parse (hw, "/mn103int > nmi int0 /glue@0x30000000");
-
- /* ACK input */
- hw_tree_parse (hw, "/glue@0x30002000");
- if (STATE_VERBOSE_P (sd))
- hw_tree_parse (hw, "/glue@0x30002000/trace? true");
- hw_tree_parse (hw, "/glue@0x30002000/reg 0x30002000 4");
- hw_tree_parse (hw, "/glue@0x30002000 > int ack /mn103int");
-
- /* LEVEL output */
- hw_tree_parse (hw, "/glue@0x30004000");
- if (STATE_VERBOSE_P (sd))
- hw_tree_parse (hw, "/glue@0x30004000/trace? true");
- hw_tree_parse (hw, "/glue@0x30004000/reg 0x30004000 4");
- hw_tree_parse (hw, "/mn103int > level int /glue@0x30004000");
-
- /* A bunch of interrupt inputs */
- hw_tree_parse (hw, "/glue@0x30006000");
- if (STATE_VERBOSE_P (sd))
- hw_tree_parse (hw, "/glue@0x30006000/trace? true");
- hw_tree_parse (hw, "/glue@0x30006000/reg 0x30006000 16");
- hw_tree_parse (hw, "/glue@0x30006000 > int0 irq-0 /mn103int");
- hw_tree_parse (hw, "/glue@0x30006000 > int1 irq-1 /mn103int");
- hw_tree_parse (hw, "/glue@0x30006000 > int2 irq-2 /mn103int");
- hw_tree_parse (hw, "/glue@0x30006000 > int3 irq-3 /mn103int");
-
-
- /* processor interrupt device */
-
- /* the device */
- hw_tree_parse (hw, "/mn103cpu@0x20000000");
- if (STATE_VERBOSE_P (sd))
- hw_tree_parse (hw, "/mn103cpu@0x20000000/trace? true");
- hw_tree_parse (hw, "/mn103cpu@0x20000000/reg 0x20000000 0x42");
-
- /* DEBUG: ACK output wired upto a glue device */
- hw_tree_parse (hw, "/glue@0x20002000");
- if (STATE_VERBOSE_P (sd))
- hw_tree_parse (hw, "/glue@0x20002000/trace? true");
- hw_tree_parse (hw, "/glue@0x20002000/reg 0x20002000 4");
- hw_tree_parse (hw, "/mn103cpu > ack int0 /glue@0x20002000");
-
- /* DEBUG: RESET/NMI/LEVEL wired up to a glue device */
- hw_tree_parse (hw, "/glue@0x20004000");
- if (STATE_VERBOSE_P (sd))
- hw_tree_parse (hw, "/glue@0x20004000/trace? true");
- hw_tree_parse (hw, "/glue@0x20004000/reg 0x20004000 12");
- hw_tree_parse (hw, "/glue@0x20004000 > int0 reset /mn103cpu");
- hw_tree_parse (hw, "/glue@0x20004000 > int1 nmi /mn103cpu");
- hw_tree_parse (hw, "/glue@0x20004000 > int2 level /mn103cpu");
-
- /* The processor wired up to the real interrupt controller */
- hw_tree_parse (hw, "/mn103cpu > ack ack /mn103int");
- hw_tree_parse (hw, "/mn103int > level level /mn103cpu");
- hw_tree_parse (hw, "/mn103int > nmi nmi /mn103cpu");
-
-
- /* PAL */
-
- /* the device */
- hw_tree_parse (hw, "/pal@0x31000000");
- if (STATE_VERBOSE_P (sd))
- hw_tree_parse (hw, "/pal@0x31000000/trace? true");
- hw_tree_parse (hw, "/pal@0x31000000/reg 0x31000000 64");
-
- /* DEBUG: PAL wired up to a glue device */
- hw_tree_parse (hw, "/glue@0x31002000");
- if (STATE_VERBOSE_P (sd))
- hw_tree_parse (hw, "/glue@0x31002000/trace? true");
- hw_tree_parse (hw, "/glue@0x31002000/reg 0x31002000 16");
- hw_tree_parse (hw, "/pal@0x31000000 > countdown int0 /glue@0x31002000");
- hw_tree_parse (hw, "/pal@0x31000000 > timer int1 /glue@0x31002000");
- hw_tree_parse (hw, "/pal@0x31000000 > int int2 /glue@0x31002000");
- hw_tree_parse (hw, "/glue@0x31002000 > int0 int3 /glue@0x31002000");
- hw_tree_parse (hw, "/glue@0x31002000 > int1 int3 /glue@0x31002000");
- hw_tree_parse (hw, "/glue@0x31002000 > int2 int3 /glue@0x31002000");
-
- /* The PAL wired up to the real interrupt controller */
- hw_tree_parse (hw, "/pal@0x31000000 > countdown irq-0 /mn103int");
- hw_tree_parse (hw, "/pal@0x31000000 > timer irq-1 /mn103int");
- hw_tree_parse (hw, "/pal@0x31000000 > int irq-2 /mn103int");
-
-
-
- hw_tree_finish (hw);
- if (STATE_VERBOSE_P (sd))
- hw_tree_print (hw);
+ /* start-sanitize-am30 */
+ if ( NULL != board
+ && (strcmp(board, BOARD_AM32) == 0 ) )
+ {
+ /* device support for mn1030002 */
+ /* interrupt controller */
+
+ sim_hw_parse (sd, "/mn103int@0x34000100/reg 0x34000100 0x7C 0x34000200 0x8 0x3400280 0x8");
+
+ /* DEBUG: NMI input's */
+ sim_hw_parse (sd, "/glue@0x30000000/reg 0x30000000 12");
+ sim_hw_parse (sd, "/glue@0x30000000 > int0 nmirq /mn103int");
+ sim_hw_parse (sd, "/glue@0x30000000 > int1 watchdog /mn103int");
+ sim_hw_parse (sd, "/glue@0x30000000 > int2 syserr /mn103int");
+
+ /* DEBUG: ACK input */
+ sim_hw_parse (sd, "/glue@0x30002000/reg 0x30002000 4");
+ sim_hw_parse (sd, "/glue@0x30002000 > int ack /mn103int");
+
+ /* DEBUG: LEVEL output */
+ sim_hw_parse (sd, "/glue@0x30004000/reg 0x30004000 8");
+ sim_hw_parse (sd, "/mn103int > nmi int0 /glue@0x30004000");
+ sim_hw_parse (sd, "/mn103int > level int1 /glue@0x30004000");
+
+ /* DEBUG: A bunch of interrupt inputs */
+ sim_hw_parse (sd, "/glue@0x30006000/reg 0x30006000 32");
+ sim_hw_parse (sd, "/glue@0x30006000 > int0 irq-0 /mn103int");
+ sim_hw_parse (sd, "/glue@0x30006000 > int1 irq-1 /mn103int");
+ sim_hw_parse (sd, "/glue@0x30006000 > int2 irq-2 /mn103int");
+ sim_hw_parse (sd, "/glue@0x30006000 > int3 irq-3 /mn103int");
+ sim_hw_parse (sd, "/glue@0x30006000 > int4 irq-4 /mn103int");
+ sim_hw_parse (sd, "/glue@0x30006000 > int5 irq-5 /mn103int");
+ sim_hw_parse (sd, "/glue@0x30006000 > int6 irq-6 /mn103int");
+ sim_hw_parse (sd, "/glue@0x30006000 > int7 irq-7 /mn103int");
+
+ /* processor interrupt device */
+
+ /* the device */
+ sim_hw_parse (sd, "/mn103cpu@0x20000000");
+ sim_hw_parse (sd, "/mn103cpu@0x20000000/reg 0x20000000 0x42");
+
+ /* DEBUG: ACK output wired upto a glue device */
+ sim_hw_parse (sd, "/glue@0x20002000");
+ sim_hw_parse (sd, "/glue@0x20002000/reg 0x20002000 4");
+ sim_hw_parse (sd, "/mn103cpu > ack int0 /glue@0x20002000");
+
+ /* DEBUG: RESET/NMI/LEVEL wired up to a glue device */
+ sim_hw_parse (sd, "/glue@0x20004000");
+ sim_hw_parse (sd, "/glue@0x20004000/reg 0x20004000 12");
+ sim_hw_parse (sd, "/glue@0x20004000 > int0 reset /mn103cpu");
+ sim_hw_parse (sd, "/glue@0x20004000 > int1 nmi /mn103cpu");
+ sim_hw_parse (sd, "/glue@0x20004000 > int2 level /mn103cpu");
+
+ /* REAL: The processor wired up to the real interrupt controller */
+ sim_hw_parse (sd, "/mn103cpu > ack ack /mn103int");
+ sim_hw_parse (sd, "/mn103int > level level /mn103cpu");
+ sim_hw_parse (sd, "/mn103int > nmi nmi /mn103cpu");
+
+
+ /* PAL */
+
+ /* the device */
+ sim_hw_parse (sd, "/pal@0x31000000");
+ sim_hw_parse (sd, "/pal@0x31000000/reg 0x31000000 64");
+ sim_hw_parse (sd, "/pal@0x31000000/poll? true");
+
+ /* DEBUG: PAL wired up to a glue device */
+ sim_hw_parse (sd, "/glue@0x31002000");
+ sim_hw_parse (sd, "/glue@0x31002000/reg 0x31002000 16");
+ sim_hw_parse (sd, "/pal@0x31000000 > countdown int0 /glue@0x31002000");
+ sim_hw_parse (sd, "/pal@0x31000000 > timer int1 /glue@0x31002000");
+ sim_hw_parse (sd, "/pal@0x31000000 > int int2 /glue@0x31002000");
+ sim_hw_parse (sd, "/glue@0x31002000 > int0 int3 /glue@0x31002000");
+ sim_hw_parse (sd, "/glue@0x31002000 > int1 int3 /glue@0x31002000");
+ sim_hw_parse (sd, "/glue@0x31002000 > int2 int3 /glue@0x31002000");
+
+ /* REAL: The PAL wired up to the real interrupt controller */
+ sim_hw_parse (sd, "/pal@0x31000000 > countdown irq-0 /mn103int");
+ sim_hw_parse (sd, "/pal@0x31000000 > timer irq-1 /mn103int");
+ sim_hw_parse (sd, "/pal@0x31000000 > int irq-2 /mn103int");
+
+ /* 8 and 16 bit timers */
+ sim_hw_parse (sd, "/mn103tim@0x34001000/reg 0x34001000 36 0x34001080 100");
+
+ /* Hook timer interrupts up to interrupt controller */
+ sim_hw_parse (sd, "/mn103tim > timer-0-underflow timer-0-underflow /mn103int");
+ sim_hw_parse (sd, "/mn103tim > timer-1-underflow timer-1-underflow /mn103int");
+ sim_hw_parse (sd, "/mn103tim > timer-2-underflow timer-2-underflow /mn103int");
+ sim_hw_parse (sd, "/mn103tim > timer-3-underflow timer-3-underflow /mn103int");
+ sim_hw_parse (sd, "/mn103tim > timer-4-underflow timer-4-underflow /mn103int");
+ sim_hw_parse (sd, "/mn103tim > timer-5-underflow timer-5-underflow /mn103int");
+ sim_hw_parse (sd, "/mn103tim > timer-6-underflow timer-6-underflow /mn103int");
+ sim_hw_parse (sd, "/mn103tim > timer-6-compare-a timer-6-compare-a /mn103int");
+ sim_hw_parse (sd, "/mn103tim > timer-6-compare-b timer-6-compare-b /mn103int");
+
+
+ /* Serial devices 0,1,2 */
+ sim_hw_parse (sd, "/mn103ser@0x34000800/reg 0x34000800 48");
+
+ /* Hook serial interrupts up to interrupt controller */
+ sim_hw_parse (sd, "/mn103ser > serial-0-receive serial-0-receive /mn103int");
+ sim_hw_parse (sd, "/mn103ser > serial-0-transmit serial-0-transmit /mn103int");
+ sim_hw_parse (sd, "/mn103ser > serial-1-receive serial-0-receive /mn103int");
+ sim_hw_parse (sd, "/mn103ser > serial-1-transmit serial-0-transmit /mn103int");
+ sim_hw_parse (sd, "/mn103ser > serial-2-receive serial-0-receive /mn103int");
+ sim_hw_parse (sd, "/mn103ser > serial-2-transmit serial-0-transmit /mn103int");
+ }
+
+ /* end-sanitize-am30 */
/* check for/establish the a reference program image */
if (sim_analyze_program (sd,