mirror of
https://github.com/Atmosphere-NX/Atmosphere.git
synced 2024-12-19 08:52:25 +00:00
thermopshere: refactor jump-to-kernel ,add single-step code
not working under qemu yet though
This commit is contained in:
parent
cc232ef4f8
commit
ff9714d4f6
8 changed files with 108 additions and 15 deletions
|
@ -70,6 +70,7 @@ CFLAGS := \
|
||||||
-std=gnu11 \
|
-std=gnu11 \
|
||||||
-Werror \
|
-Werror \
|
||||||
-Wall \
|
-Wall \
|
||||||
|
-Wno-main \
|
||||||
$(ARCH) $(DEFINES)
|
$(ARCH) $(DEFINES)
|
||||||
|
|
||||||
CFLAGS += $(INCLUDE)
|
CFLAGS += $(INCLUDE)
|
||||||
|
@ -140,7 +141,7 @@ all: $(BUILD)
|
||||||
|
|
||||||
ifeq ($(PLATFORM), qemu)
|
ifeq ($(PLATFORM), qemu)
|
||||||
QEMUFLAGS := -nographic -machine virt,secure=on,virtualization=on,gic-version=2 -cpu cortex-a57 -smp 4 -m 1024\
|
QEMUFLAGS := -nographic -machine virt,secure=on,virtualization=on,gic-version=2 -cpu cortex-a57 -smp 4 -m 1024\
|
||||||
-bios bl1.bin -d unimp,int,mmu -semihosting-config enable,target=native -serial mon:stdio
|
-bios bl1.bin -d unimp,int -semihosting-config enable,target=native -serial mon:stdio
|
||||||
|
|
||||||
# NOTE: copy bl1.bin, bl2.bin, bl31.bin from your own build of Arm Trusted Firmware!
|
# NOTE: copy bl1.bin, bl2.bin, bl31.bin from your own build of Arm Trusted Firmware!
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,8 @@ typedef struct CoreCtx {
|
||||||
u8 *crashStack; // @0x10
|
u8 *crashStack; // @0x10
|
||||||
u64 scratch; // @0x18
|
u64 scratch; // @0x18
|
||||||
u32 coreId; // @0x20
|
u32 coreId; // @0x20
|
||||||
bool isBootCore; // @0x24
|
bool isBootCore; // @0x24
|
||||||
|
bool wasSingleStepping; // @0x25 (for pIRQ handler)
|
||||||
} CoreCtx;
|
} CoreCtx;
|
||||||
|
|
||||||
extern CoreCtx g_coreCtxs[4];
|
extern CoreCtx g_coreCtxs[4];
|
||||||
|
|
|
@ -135,6 +135,7 @@ vector_entry fiq_sp0
|
||||||
.endfunc
|
.endfunc
|
||||||
.cfi_endproc
|
.cfi_endproc
|
||||||
/* To save space, insert in an unused vector segment. */
|
/* To save space, insert in an unused vector segment. */
|
||||||
|
.global _restore_all_regs
|
||||||
_restore_all_regs:
|
_restore_all_regs:
|
||||||
ldp x30, x20, [sp, #0xF0]
|
ldp x30, x20, [sp, #0xF0]
|
||||||
ldp x21, x22, [sp, #0x100]
|
ldp x21, x22, [sp, #0x100]
|
||||||
|
@ -161,7 +162,7 @@ vector_entry fiq_sp0
|
||||||
ldp x26, x27, [sp, #0xD0]
|
ldp x26, x27, [sp, #0xD0]
|
||||||
ldp x28, x29, [sp, #0xE0]
|
ldp x28, x29, [sp, #0xE0]
|
||||||
|
|
||||||
add sp, sp, #0x210
|
add sp, sp, #0x120
|
||||||
eret
|
eret
|
||||||
|
|
||||||
vector_entry serror_sp0
|
vector_entry serror_sp0
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include "sysreg_traps.h"
|
#include "sysreg_traps.h"
|
||||||
#include "smc.h"
|
#include "smc.h"
|
||||||
#include "core_ctx.h"
|
#include "core_ctx.h"
|
||||||
|
#include "single_step.h"
|
||||||
|
|
||||||
#include "debug_log.h"
|
#include "debug_log.h"
|
||||||
|
|
||||||
|
@ -110,6 +111,10 @@ void handleLowerElSyncException(ExceptionStackFrame *frame, ExceptionSyndromeReg
|
||||||
handleMsrMrsTrap(frame, esr);
|
handleMsrMrsTrap(frame, esr);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case Exception_SoftwareStepLowerEl:
|
||||||
|
handleSingleStep(frame, esr);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
DEBUG("Lower EL sync exception, EC = 0x%02llx IL=%llu ISS=0x%06llx\n", (u64)esr.ec, esr.il, esr.iss);
|
DEBUG("Lower EL sync exception, EC = 0x%02llx IL=%llu ISS=0x%06llx\n", (u64)esr.ec, esr.il, esr.iss);
|
||||||
dumpStackFrame(frame, false);
|
dumpStackFrame(frame, false);
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "core_ctx.h"
|
#include "core_ctx.h"
|
||||||
#include "debug_log.h"
|
#include "debug_log.h"
|
||||||
|
@ -5,6 +7,8 @@
|
||||||
#include "semihosting.h"
|
#include "semihosting.h"
|
||||||
#include "traps.h"
|
#include "traps.h"
|
||||||
#include "sysreg.h"
|
#include "sysreg.h"
|
||||||
|
#include "exceptions.h"
|
||||||
|
#include "single_step.h"
|
||||||
|
|
||||||
extern const u8 __start__[];
|
extern const u8 __start__[];
|
||||||
|
|
||||||
|
@ -31,9 +35,10 @@ static void loadKernelViaSemihosting(void)
|
||||||
currentCoreCtx->kernelEntrypoint = buf;
|
currentCoreCtx->kernelEntrypoint = buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(void)
|
void main(ExceptionStackFrame *frame)
|
||||||
{
|
{
|
||||||
enableTraps();
|
enableTraps();
|
||||||
|
enableSingleStepExceptions();
|
||||||
|
|
||||||
if (currentCoreCtx->isBootCore) {
|
if (currentCoreCtx->isBootCore) {
|
||||||
uartInit(115200);
|
uartInit(115200);
|
||||||
|
@ -50,8 +55,14 @@ int main(void)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
DEBUG("EL2: core %u reached main!\n", currentCoreCtx->coreId);
|
DEBUG("EL2: core %u reached main!\n", currentCoreCtx->coreId);
|
||||||
DEBUG("Test 0x%08llx %016llx\n", get_physical_address_el1_stage12(0x08010000ull), GET_SYSREG(par_el1));
|
//DEBUG("Test 0x%08llx %016llx\n", get_physical_address_el1_stage12(0x08010000ull), GET_SYSREG(par_el1));
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
// Set up exception frame: init regs to 0, set spsr, elr, etc.
|
||||||
|
memset(frame, 0, sizeof(ExceptionStackFrame));
|
||||||
|
frame->spsr_el2 = (0xF << 6) | (1 << 2) | 1; // EL1h+DAIF
|
||||||
|
frame->elr_el2 = currentCoreCtx->kernelEntrypoint;
|
||||||
|
frame->x[0] = currentCoreCtx->kernelArgument;
|
||||||
|
|
||||||
|
//setSingleStep(frame, false);
|
||||||
}
|
}
|
||||||
|
|
48
thermosphere/src/single_step.c
Normal file
48
thermosphere/src/single_step.c
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 Atmosphère-NX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "single_step.h"
|
||||||
|
#include "core_ctx.h"
|
||||||
|
#include "sysreg.h"
|
||||||
|
#include "debug_log.h"
|
||||||
|
|
||||||
|
void enableSingleStepExceptions(void)
|
||||||
|
{
|
||||||
|
u64 mdscr = GET_SYSREG(mdscr_el1);
|
||||||
|
|
||||||
|
// Enable Single Step functionality
|
||||||
|
mdscr |= BIT(0);
|
||||||
|
|
||||||
|
SET_SYSREG(mdscr_el1, mdscr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void setSingleStep(ExceptionStackFrame *frame, bool singleStep)
|
||||||
|
{
|
||||||
|
// Set or clear SPSR.SS
|
||||||
|
if (singleStep) {
|
||||||
|
frame->spsr_el2 |= BITL(22);
|
||||||
|
} else {
|
||||||
|
frame->spsr_el2 &= ~BITL(22);
|
||||||
|
}
|
||||||
|
|
||||||
|
currentCoreCtx->wasSingleStepping = singleStep;
|
||||||
|
}
|
||||||
|
|
||||||
|
void handleSingleStep(ExceptionStackFrame *frame, ExceptionSyndromeRegister esr)
|
||||||
|
{
|
||||||
|
DEBUG("Single-step exeception ELR = 0x%016llx, ISV = %u, EX = %u\n", frame->elr_el2, (esr.iss >> 24) & 1, (esr.iss >> 6) & 1);
|
||||||
|
setSingleStep(frame, true); // hehe boi
|
||||||
|
}
|
26
thermosphere/src/single_step.h
Normal file
26
thermosphere/src/single_step.h
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 Atmosphère-NX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "utils.h"
|
||||||
|
#include "exceptions.h"
|
||||||
|
|
||||||
|
void enableSingleStepExceptions(void);
|
||||||
|
|
||||||
|
void setSingleStep(ExceptionStackFrame *frame, bool singleStep);
|
||||||
|
|
||||||
|
void handleSingleStep(ExceptionStackFrame *frame, ExceptionSyndromeRegister esr);
|
|
@ -44,7 +44,7 @@ _startCommon:
|
||||||
add x8, x8, #:lo12:__vectors_start__
|
add x8, x8, #:lo12:__vectors_start__
|
||||||
msr vbar_el2, x8
|
msr vbar_el2, x8
|
||||||
|
|
||||||
// Set system to sane defaults, aarch64 for el1
|
// Set system to sane defaults, aarch64 for el1, mmu disabled
|
||||||
mov x4, #0x0838
|
mov x4, #0x0838
|
||||||
movk x4, #0xC5, lsl #16
|
movk x4, #0xC5, lsl #16
|
||||||
orr x1, x4, #0x30000000
|
orr x1, x4, #0x30000000
|
||||||
|
@ -70,7 +70,7 @@ _startCommon:
|
||||||
cmp x0, #4
|
cmp x0, #4
|
||||||
bhs .
|
bhs .
|
||||||
|
|
||||||
// Set tmp stack (__stacks_top__ is aligned)
|
// Set stack pointer
|
||||||
adrp x8, __stacks_top__
|
adrp x8, __stacks_top__
|
||||||
lsl x9, x0, #10
|
lsl x9, x0, #10
|
||||||
sub sp, x8, x9
|
sub sp, x8, x9
|
||||||
|
@ -80,6 +80,9 @@ _startCommon:
|
||||||
bl coreCtxInit
|
bl coreCtxInit
|
||||||
stp x18, xzr, [sp, #-0x10]!
|
stp x18, xzr, [sp, #-0x10]!
|
||||||
|
|
||||||
|
// Reserve space for exception frame
|
||||||
|
sub sp, sp, #0x120
|
||||||
|
|
||||||
// Don't call init array to save space?
|
// Don't call init array to save space?
|
||||||
// Clear BSS & call main for the first core executing this code
|
// Clear BSS & call main for the first core executing this code
|
||||||
cbz x19, _enable_mmu
|
cbz x19, _enable_mmu
|
||||||
|
@ -101,16 +104,13 @@ _enable_mmu:
|
||||||
dsb sy
|
dsb sy
|
||||||
isb
|
isb
|
||||||
|
|
||||||
|
mov x0, sp
|
||||||
bl main
|
bl main
|
||||||
|
|
||||||
// Jump to kernel
|
|
||||||
mov x8, #(0b1111 << 6 | 0b0101) // EL1h+DAIF
|
|
||||||
msr spsr_el2, x8
|
|
||||||
|
|
||||||
ldp x0, x1, [x18]
|
|
||||||
msr elr_el2, x1
|
|
||||||
dsb sy
|
dsb sy
|
||||||
isb
|
isb
|
||||||
eret
|
|
||||||
|
// Jump to kernel
|
||||||
|
b _restore_all_regs
|
||||||
|
|
||||||
.pool
|
.pool
|
||||||
|
|
Loading…
Reference in a new issue