зеркало из https://github.com/microsoft/Komodo.git
checkpoint: entering linux, and parking other cores
This commit is contained in:
Родитель
b960572817
Коммит
a89c1db659
|
@ -27,10 +27,13 @@
|
||||||
#define ARM_SCTLR_VE 0x1000000 /* interrupt vectors enable */
|
#define ARM_SCTLR_VE 0x1000000 /* interrupt vectors enable */
|
||||||
#define ARM_SCTLR_AFE (1UL << 29) /* access flag enable -- simplified PTEs */
|
#define ARM_SCTLR_AFE (1UL << 29) /* access flag enable -- simplified PTEs */
|
||||||
|
|
||||||
|
#define ARM_SCR_NS 0x01 // non-secure bit
|
||||||
|
|
||||||
// defined in kevlar linker script
|
// defined in kevlar linker script
|
||||||
extern char monitor_image_start, monitor_image_data, monitor_image_end, _monitor_start;
|
extern char monitor_image_start, monitor_image_data, monitor_image_end, _monitor_start;
|
||||||
|
|
||||||
|
void park_secondary_cores(void);
|
||||||
|
|
||||||
static inline uint8_t mycoreid(void)
|
static inline uint8_t mycoreid(void)
|
||||||
{
|
{
|
||||||
uint32_t val;
|
uint32_t val;
|
||||||
|
@ -79,11 +82,22 @@ static void secure_world_init(uintptr_t ptbase, uintptr_t vbar)
|
||||||
}
|
}
|
||||||
|
|
||||||
static volatile bool global_barrier;
|
static volatile bool global_barrier;
|
||||||
|
static uintptr_t g_ptbase, g_mvbar;
|
||||||
|
|
||||||
static void __attribute__((noreturn)) secondary_main(uint8_t coreid)
|
static void __attribute__((noreturn)) secondary_main(uint8_t coreid)
|
||||||
{
|
{
|
||||||
while (!global_barrier) __asm volatile("yield");
|
while (!global_barrier) __asm volatile("yield");
|
||||||
|
|
||||||
|
secure_world_init(g_ptbase, g_mvbar);
|
||||||
|
|
||||||
|
uintptr_t reg;
|
||||||
|
__asm volatile("mrc p15, 0, %0, c1, c1, 0" : "=r" (reg));
|
||||||
|
reg |= ARM_SCR_NS;
|
||||||
|
__asm volatile("mcr p15, 0, %0, c1, c1, 0" : : "r" (reg));
|
||||||
|
__asm volatile("isb");
|
||||||
|
|
||||||
|
park_secondary_cores();
|
||||||
|
|
||||||
/* TODO */
|
/* TODO */
|
||||||
while (1) {}
|
while (1) {}
|
||||||
}
|
}
|
||||||
|
@ -195,7 +209,11 @@ void __attribute__((noreturn)) main(void)
|
||||||
|
|
||||||
uintptr_t monitor_entry
|
uintptr_t monitor_entry
|
||||||
= &_monitor_start - &monitor_image_start + KEVLAR_MON_VBASE;
|
= &_monitor_start - &monitor_image_start + KEVLAR_MON_VBASE;
|
||||||
secure_world_init(ptbase, KEVLAR_MON_VBASE);
|
|
||||||
|
g_ptbase = ptbase;
|
||||||
|
g_mvbar = KEVLAR_MON_VBASE;
|
||||||
|
|
||||||
|
secure_world_init(g_ptbase, g_mvbar);
|
||||||
|
|
||||||
/* call into the monitor's init routine
|
/* call into the monitor's init routine
|
||||||
* this will return to us in non-secure world */
|
* this will return to us in non-secure world */
|
||||||
|
@ -205,5 +223,16 @@ void __attribute__((noreturn)) main(void)
|
||||||
|
|
||||||
console_printf("returned from monitor!\n");
|
console_printf("returned from monitor!\n");
|
||||||
|
|
||||||
|
global_barrier = true;
|
||||||
|
|
||||||
|
__asm volatile("mrc p15, 0, %0, c1, c1, 0" : "=r" (reg));
|
||||||
|
reg |= ARM_SCR_NS;
|
||||||
|
__asm volatile("mcr p15, 0, %0, c1, c1, 0" : : "r" (reg));
|
||||||
|
__asm volatile("isb");
|
||||||
|
|
||||||
|
console_printf("exited secure world, entering kernel...\n");
|
||||||
|
typedef void kernel_entry(uintptr_t zero, uintptr_t boardid, void *atags);
|
||||||
|
((kernel_entry *)0x8000)(0, 0xc43, (void *)0x100);
|
||||||
|
|
||||||
while (1) {}
|
while (1) {}
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче