fernly: Move to new offset
This commit is contained in:
parent
6d5fb2d819
commit
0d3b04307d
7 changed files with 61 additions and 67 deletions
4
Makefile
4
Makefile
|
@ -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
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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
93
main.c
|
@ -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();
|
||||||
|
|
2
start.S
2
start.S
|
@ -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
|
||||||
|
|
8
utils.c
8
utils.c
|
@ -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++;
|
||||||
|
}
|
||||||
|
|
18
vectors.c
18
vectors.c
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue