fernly: Move to new offset

This commit is contained in:
Sean Cross 2014-07-21 18:25:49 +08:00
parent 6d5fb2d819
commit 0d3b04307d
7 changed files with 61 additions and 67 deletions

View file

@ -11,9 +11,7 @@ SRC_C = \
main.c \ main.c \
vectors.c \ vectors.c \
serial.c \ serial.c \
utils.c \ utils.c
bionic.c \
vsprintf.c
SRC_S = \ SRC_S = \
start.S start.S

View file

@ -39,7 +39,7 @@ SECTIONS
{ {
/* The OS entry point is here */ /* The OS entry point is here */
. = 0x20000; /* bootloader will copy data to this address */ . = 0x00002000; /* bootloader will copy data to this address */
.text : { .text : {
_stext = ABSOLUTE(.); _stext = ABSOLUTE(.);
KEEP(*(vectors)) KEEP(*(vectors))

View file

@ -3,6 +3,5 @@
#include <stdint.h> #include <stdint.h>
uint32_t _udiv64(uint64_t n, uint32_t d); uint32_t _udiv64(uint64_t n, uint32_t d);
int printf(const char *fmt, ...);
#endif /* __UTILS_H__ */ #endif /* __UTILS_H__ */

93
main.c
View file

@ -51,102 +51,97 @@ static int list_registers(void)
{ {
int var; int var;
printf("Registers:\n"); serial_puts("Registers:\n");
printf("CPSR: "); serial_puts("CPSR: ");
asm volatile ("mrs %0, cpsr":"=r" (var)); asm volatile ("mrs %0, cpsr":"=r" (var));
serial_puth(var, 8); serial_puth(var, 8);
printf("\n"); serial_puts("\n");
printf("SPSR: "); serial_puts("SPSR: ");
asm volatile ("mrs %0, spsr":"=r" (var)); asm volatile ("mrs %0, spsr":"=r" (var));
serial_puth(var, 8); serial_puth(var, 8);
printf("\n"); serial_puts("\n");
printf("R0: "); serial_puts("R0: ");
asm volatile ("mov %0, r0":"=r" (var)); asm volatile ("mov %0, r0":"=r" (var));
serial_puth(var, 8); serial_puth(var, 8);
printf("\n"); serial_puts("\n");
printf("R1: "); serial_puts("R1: ");
asm volatile ("mov %0, r1":"=r" (var)); asm volatile ("mov %0, r1":"=r" (var));
serial_puth(var, 8); serial_puth(var, 8);
printf("\n"); serial_puts("\n");
printf("R2: "); serial_puts("R2: ");
asm volatile ("mov %0, r2":"=r" (var)); asm volatile ("mov %0, r2":"=r" (var));
serial_puth(var, 8); serial_puth(var, 8);
printf("\n"); serial_puts("\n");
printf("R3: "); serial_puts("R3: ");
asm volatile ("mov %0, r3":"=r" (var)); asm volatile ("mov %0, r3":"=r" (var));
serial_puth(var, 8); serial_puth(var, 8);
printf("\n"); serial_puts("\n");
printf("R4: "); serial_puts("R4: ");
asm volatile ("mov %0, r4":"=r" (var)); asm volatile ("mov %0, r4":"=r" (var));
serial_puth(var, 8); serial_puth(var, 8);
printf("\n"); serial_puts("\n");
printf("R5: "); serial_puts("R5: ");
asm volatile ("mov %0, r5":"=r" (var)); asm volatile ("mov %0, r5":"=r" (var));
serial_puth(var, 8); serial_puth(var, 8);
printf("\n"); serial_puts("\n");
printf("R6: "); serial_puts("R6: ");
asm volatile ("mov %0, r6":"=r" (var)); asm volatile ("mov %0, r6":"=r" (var));
serial_puth(var, 8); serial_puth(var, 8);
printf("\n"); serial_puts("\n");
printf("R7: "); serial_puts("R7: ");
asm volatile ("mov %0, r7":"=r" (var)); asm volatile ("mov %0, r7":"=r" (var));
serial_puth(var, 8); serial_puth(var, 8);
printf("\n"); serial_puts("\n");
printf("R8: "); serial_puts("R8: ");
asm volatile ("mov %0, r8":"=r" (var)); asm volatile ("mov %0, r8":"=r" (var));
serial_puth(var, 8); serial_puth(var, 8);
printf("\n"); serial_puts("\n");
printf("R9: "); serial_puts("R9: ");
asm volatile ("mov %0, r9":"=r" (var)); asm volatile ("mov %0, r9":"=r" (var));
serial_puth(var, 8); serial_puth(var, 8);
printf("\n"); serial_puts("\n");
printf("R10: "); serial_puts("R10: ");
asm volatile ("mov %0, r10":"=r" (var)); asm volatile ("mov %0, r10":"=r" (var));
serial_puth(var, 8); serial_puth(var, 8);
printf("\n"); serial_puts("\n");
printf("FP: "); serial_puts("FP: ");
asm volatile ("mov %0, r11":"=r" (var)); asm volatile ("mov %0, r11":"=r" (var));
serial_puth(var, 8); serial_puth(var, 8);
printf("\n"); serial_puts("\n");
printf("IP: "); serial_puts("IP: ");
asm volatile ("mov %0, r12":"=r" (var)); asm volatile ("mov %0, r12":"=r" (var));
serial_puth(var, 8); serial_puth(var, 8);
printf("\n"); serial_puts("\n");
printf("SP: "); serial_puts("SP: ");
asm volatile ("mov %0, r13":"=r" (var)); asm volatile ("mov %0, r13":"=r" (var));
serial_puth(var, 8); serial_puth(var, 8);
printf("\n"); serial_puts("\n");
printf("R14: "); serial_puts("LR: ");
asm volatile ("mov %0, r14":"=r" (var)); asm volatile ("mov %0, r14":"=r" (var));
serial_puth(var, 8); serial_puth(var, 8);
printf("\n"); serial_puts("\n");
printf("R15: "); serial_puts("PC: ");
asm volatile ("mov %0, r15":"=r" (var)); asm volatile ("mov %0, r15":"=r" (var));
serial_puth(var, 8); serial_puth(var, 8);
printf("\n"); serial_puts("\n");
printf("LR: ");
asm volatile ("mov %0, lr":"=r" (var));
serial_puth(var, 8);
printf("\n");
return 0; return 0;
} }
@ -156,11 +151,11 @@ static int enable_irq(void)
register int var; register int var;
asm volatile ("mrs %0, cpsr":"=r" (var)); asm volatile ("mrs %0, cpsr":"=r" (var));
if (!(var & 0x80)) { if (!(var & 0x80)) {
printf("Interrupts already enabled\n"); serial_puts("Interrupts already enabled\n");
return -1; return -1;
} }
// printf("Interrupts were disabled. Re-enabling...\n"); // serial_puts("Interrupts were disabled. Re-enabling...\n");
var &= ~0x80; var &= ~0x80;
var &= ~0x1f; var &= ~0x1f;
var |= 0x10; var |= 0x10;
@ -174,11 +169,11 @@ static int enable_fiq(void)
register int var; register int var;
asm volatile ("mrs %0, cpsr":"=r" (var)); asm volatile ("mrs %0, cpsr":"=r" (var));
if (!(var & 0x40)) { if (!(var & 0x40)) {
printf("FIQ already enabled\n"); serial_puts("FIQ already enabled\n");
return -1; return -1;
} }
// printf("FIQ was disabled. Re-enabling...\n"); // serial_puts("FIQ was disabled. Re-enabling...\n");
var &= ~0x40; var &= ~0x40;
asm volatile ("msr cpsr, %0":"=r" (var)); asm volatile ("msr cpsr, %0":"=r" (var));
@ -199,13 +194,9 @@ static int do_init(void)
/* Disable WDT */ /* Disable WDT */
writel(0x2200, 0xa0030000); writel(0x2200, 0xa0030000);
printf("\n\nFernly shell\n"); serial_puts("\n\nFernly shell\n");
/* Copy exception vectors to address 0 */ /* Copy exception vectors to address 0 */
printf("Copying vectors");
printf(" Src: %p", rv_start);
printf(" Src end: %p", rv_end);
printf(" Size: %d\n", rv_end - rv_start);
_memcpy((void *)0, rv_start, rv_end - rv_start); _memcpy((void *)0, rv_start, rv_end - rv_start);
enable_irq(); enable_irq();
enable_fiq(); enable_fiq();

View file

@ -23,7 +23,7 @@ clear_stack:
# Copy 0x10000 bytes from =spi_offset to psram at 0x20000 # Copy 0x10000 bytes from =spi_offset to psram at 0x20000
copy_code_to_ram: copy_code_to_ram:
mov r0, #0x20000 ldr r0, =0x00002000 // Source offset
ldr r1, =0x10003460 // spi_offset ldr r1, =0x10003460 // spi_offset
mov r2, r1 mov r2, r1
mov r3, #0x10000 mov r3, #0x10000

View file

@ -66,3 +66,11 @@ uint32_t _udiv64(uint64_t n, uint32_t d)
{ {
return __udiv64(n >> 32, n, d); return __udiv64(n >> 32, n, d);
} }
void _memcpy(void *dst0, void *_src, int length)
{
uint8_t *ptr = dst0;
uint8_t *src = _src;
while(length--)
*ptr++ = *src++;
}

View file

@ -3,44 +3,42 @@
void reset_handler(void) { void reset_handler(void) {
extern int main(int argc, char **argv); extern int main(int argc, char **argv);
serial_putc('<'); serial_puts("Reset exception\n");
printf("Reset exception\n");
serial_putc('>');
main(1, 0); main(1, 0);
return; return;
} }
void undef_handler(void) { void undef_handler(void) {
printf("Undefined instruction exception\n"); serial_puts("Undefined instruction exception\n");
return; return;
} }
void swi_handler(void) { void swi_handler(void) {
printf("SWI exception\n"); serial_puts("SWI exception\n");
return; return;
} }
void prefetch_abort_handler(void) { void prefetch_abort_handler(void) {
printf("Prefetch abort exception\n"); serial_puts("Prefetch abort exception\n");
return; return;
} }
void data_abort_handler(void) { void data_abort_handler(void) {
printf("Data abort exception\n"); serial_puts("Data abort exception\n");
return; return;
} }
void reserved_handler(void) { void reserved_handler(void) {
printf("Handled some IRQ that shouldn't exist\n"); serial_puts("Handled some IRQ that shouldn't exist\n");
return; return;
} }
void irq_handler(void) { void irq_handler(void) {
printf("Handled IRQ\n"); serial_puts("Handled IRQ\n");
return; return;
} }
void fiq_handler(void) { void fiq_handler(void) {
printf("Handled FIQ\n"); serial_puts("Handled FIQ\n");
return; return;
} }