improved generic payload entry point

This commit is contained in:
2020-02-11 20:51:04 -05:00
parent 33f3ab9a0d
commit a6ddec511a
8 changed files with 46 additions and 68 deletions

View File

@@ -1,29 +1,13 @@
#include "bootrom_addr.h"
#include "dev_util.h"
#include "bootrom_addr.h"
extern uint64_t entry_sync(uint64_t *args);
extern uint64_t entry_async(uint64_t *base);
TEXT_SECTION
uint64_t _start(uint64_t arg0, uint64_t arg1, uint64_t arg2, uint64_t arg3,
uint64_t arg4, uint64_t arg5, uint64_t arg6, uint64_t arg7)
PAYLOAD_SECTION
void load_sync_entry()
{
uint64_t entry, args[8];
__asm__ volatile ("mov %0, x30" : "=r" (entry));
uint64_t addr = ADDR_SYNC_ENTRY;
__asm__ volatile("mov x9, %0" :: "i" (addr & 0xFFFFu));
__asm__ volatile("movk x9, %0, LSL #16" :: "i" ((addr & 0xFFFF0000u) >> 16u));
__asm__ volatile("movk x9, %0, LSL #32" :: "i" ((addr & 0xFFFF00000000u) >> 32u));
__asm__ volatile("movk x9, %0, LSL #48" :: "i" ((addr & 0xFFFF000000000000u) >> 48u));
if(entry == ADDR_SYNC_ENTRY /* todo: correct entry */)
{
args[0] = arg0;
args[1] = arg1;
args[2] = arg2;
args[3] = arg3;
args[4] = arg4;
args[5] = arg5;
args[6] = arg6;
args[7] = arg7;
return entry_sync(args);
}
else
return entry_async((uint64_t *) arg0);
}