|
@@ -207,23 +207,32 @@ static void init(void)
|
|
|
read_rtc();
|
|
|
}
|
|
|
|
|
|
+static uint32_t romcopy_time[2];
|
|
|
+static unsigned int romcopy_state;
|
|
|
+extern const char __dram_init_start[], __dram_init_end[], __dram_init_len[];
|
|
|
+
|
|
|
static uint32_t romcopy_time[2];
|
|
|
static unsigned int romcopy_state;
|
|
|
IRQHANDLER(romcopy)
|
|
|
{
|
|
|
+ size_t rombase;
|
|
|
+
|
|
|
+ /* The handover code from the normal startup will set tp to our ROM area */
|
|
|
+ asm("mv %0,tp" : "=r" (rombase));
|
|
|
+
|
|
|
switch (romcopy_state++) {
|
|
|
case 0:
|
|
|
/* Copy testdata */
|
|
|
- ROMCOPY_RAMADDR = 0;
|
|
|
- ROMCOPY_ROMADDR = 0x100000;
|
|
|
- ROMCOPY_DATALEN = TESTDATA_WORDS << 2;
|
|
|
+ ROMCOPY_RAMADDR = (size_t)__dram_init_start;
|
|
|
+ ROMCOPY_ROMADDR = rombase + SRAM_SIZE;
|
|
|
+ ROMCOPY_DATALEN = (size_t)__dram_init_len;
|
|
|
break;
|
|
|
case 1:
|
|
|
/* Zero .dram.bss */
|
|
|
romcopy_time[0] = rdtime() - time_zero;
|
|
|
|
|
|
ROMCOPY_RAMADDR = (size_t)__dram_bss_start;
|
|
|
- ROMCOPY_ROMADDR = 0; /* Zero */
|
|
|
+ ROMCOPY_ROMADDR = 0; /* Clear */
|
|
|
ROMCOPY_DATALEN = (size_t)__dram_bss_len;
|
|
|
break;
|
|
|
default:
|
|
@@ -252,7 +261,7 @@ IRQHANDLER(EBREAK)
|
|
|
killed("invalid instruction", pc);
|
|
|
}
|
|
|
|
|
|
-static uint32_t get_reset_vector(void)
|
|
|
+static uint32_t get_null_ptr(void)
|
|
|
{
|
|
|
uint32_t rv;
|
|
|
|
|
@@ -266,14 +275,14 @@ void main(void)
|
|
|
/* The data section is not reinitialized on reset */
|
|
|
static unsigned int loops = 1;
|
|
|
|
|
|
- uint32_t reset_vector;
|
|
|
+ uint32_t null_ptr;
|
|
|
uint32_t irq_count;
|
|
|
uint32_t abc_status;
|
|
|
uint32_t done;
|
|
|
uint32_t time_to_main;
|
|
|
|
|
|
time_to_main = rdtime() - time_zero;
|
|
|
- reset_vector = get_reset_vector();
|
|
|
+ null_ptr = get_null_ptr();
|
|
|
|
|
|
con_set_baudrate(115200);
|
|
|
|
|
@@ -325,10 +334,10 @@ void main(void)
|
|
|
(done+(CPU_HZ/64))/(CPU_HZ/32));
|
|
|
|
|
|
udelay(1000000);
|
|
|
- uint32_t reset_vector_now = get_reset_vector();
|
|
|
- if (reset_vector != reset_vector_now) {
|
|
|
- con_printf("*** RESET VECTOR CORRUPT: 0x%08x not 0x%08x\n",
|
|
|
- reset_vector_now, reset_vector);
|
|
|
+ uint32_t null_ptr_now = get_null_ptr();
|
|
|
+ if (null_ptr != null_ptr_now) {
|
|
|
+ con_printf("*** NULL POINTER AREA CORRUPT: 0x%08x not 0x%08x\n",
|
|
|
+ null_ptr_now, null_ptr);
|
|
|
con_flush();
|
|
|
_die();
|
|
|
}
|