1
0
Fork 0
mirror of https://github.com/Atmosphere-NX/Atmosphere.git synced 2024-12-27 04:36:04 +00:00

thermosphere: add breakpoint/watchpoint enable/reset code

This commit is contained in:
TuxSH 2019-08-05 23:49:25 +02:00
parent a3da478089
commit 3649b94b5d
10 changed files with 157 additions and 5 deletions

View file

@ -141,11 +141,11 @@ all: $(BUILD)
ifeq ($(PLATFORM), qemu) ifeq ($(PLATFORM), qemu)
#export QEMU := qemu-system-aarch64 export QEMU := qemu-system-aarch64
export QEMU := ~/qemu/aarch64-softmmu/qemu-system-aarch64 #export QEMU := ~/qemu/aarch64-softmmu/qemu-system-aarch64
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 -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!

View file

@ -13,3 +13,6 @@ void invalidate_icache_all(void);
void set_memory_registers_enable_mmu(uintptr_t ttbr0, u64 tcr, u64 mair); void set_memory_registers_enable_mmu(uintptr_t ttbr0, u64 tcr, u64 mair);
void set_memory_registers_enable_stage2(uintptr_t vttbr, u64 vtcr); void set_memory_registers_enable_stage2(uintptr_t vttbr, u64 vtcr);
void initBreakpointRegs(size_t num);
void initWatchpointRegs(size_t num);

View file

@ -262,3 +262,46 @@ set_memory_registers_enable_stage2:
isb isb
ret ret
// Precondition: x0 <= 16
.section .text.initBreakpointRegs, "ax", %progbits
.type initBreakpointRegs, %function
.global initBreakpointRegs
initBreakpointRegs:
// x0 = number
adr x16, 1f
mov x1, #(16 * 8)
sub x0, x1, x0,lsl #3
add x16, x16, x0
br x16
1:
.irp count, 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
msr dbgbcr\count\()_el1, xzr
msr dbgbvr\count\()_el1, xzr
.endr
dsb sy
isb
ret
// Precondition: x0 <= 16
.section .text.initBreakpointRegs, "ax", %progbits
.type initWatchpointRegs, %function
.global initWatchpointRegs
initWatchpointRegs:
// x0 = number
adr x16, 1f
mov x1, #(16 * 8)
sub x0, x1, x0,lsl #3
add x16, x16, x0
br x16
1:
.irp count, 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
msr dbgwcr\count\()_el1, xzr
msr dbgwvr\count\()_el1, xzr
.endr
dsb sy
isb
ret

View file

@ -0,0 +1,29 @@
/*
* 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 "breakpoints.h"
#include "utils.h"
#include "sysreg.h"
#include "arm.h"
void enableAndResetBreakpoints(void)
{
SET_SYSREG(mdscr_el1, GET_SYSREG(mdscr_el1) | MDSCR_EL1_MDE);
// 20 for watchpoints
size_t num = ((GET_SYSREG(id_aa64dfr0_el1) >> 12) & 0xF) + 1;
initBreakpointRegs(num);
}

View file

@ -0,0 +1,21 @@
/*
* 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 "types.h"
void enableAndResetBreakpoints(void);

View file

@ -9,6 +9,8 @@
#include "sysreg.h" #include "sysreg.h"
#include "exceptions.h" #include "exceptions.h"
#include "single_step.h" #include "single_step.h"
#include "breakpoints.h"
#include "watchpoints.h"
extern const u8 __start__[]; extern const u8 __start__[];
@ -38,6 +40,8 @@ static void loadKernelViaSemihosting(void)
void main(ExceptionStackFrame *frame) void main(ExceptionStackFrame *frame)
{ {
enableTraps(); enableTraps();
enableAndResetBreakpoints();
enableAndResetWatchpoints();
if (currentCoreCtx->isBootCore) { if (currentCoreCtx->isBootCore) {
uartInit(115200); uartInit(115200);
@ -63,5 +67,6 @@ void main(ExceptionStackFrame *frame)
frame->elr_el2 = currentCoreCtx->kernelEntrypoint; frame->elr_el2 = currentCoreCtx->kernelEntrypoint;
frame->x[0] = currentCoreCtx->kernelArgument; frame->x[0] = currentCoreCtx->kernelArgument;
// Test
singleStepSetNextState(frame, SingleStepState_ActivePending); singleStepSetNextState(frame, SingleStepState_ActivePending);
} }

View file

@ -66,5 +66,5 @@ 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); DEBUG("Single-step exeception ELR = 0x%016llx, ISV = %u, EX = %u\n", frame->elr_el2, (esr.iss >> 24) & 1, (esr.iss >> 6) & 1);
// Hehe boi // Hehe boi
singleStepSetNextState(frame, SingleStepState_ActivePending); //singleStepSetNextState(frame, SingleStepState_ActivePending);
} }

View file

@ -403,6 +403,7 @@
#define MDCR_EL2_TPMCR BITL(5) #define MDCR_EL2_TPMCR BITL(5)
#define MDCR_EL2_HPMN_MASK 0x1Full #define MDCR_EL2_HPMN_MASK 0x1Full
#define MDSCR_EL1_MDE BITL(15)
#define MDSCR_EL1_SS BITL(0) #define MDSCR_EL1_SS BITL(0)
#define ENCODE_SYSREG_FIELDS_MOV(op0, op1, crn, crm, op2) (((op0) << 19) | ((op1) << 16) | ((crn) << 12) | ((crm) << 8) | ((op2) << 5)) #define ENCODE_SYSREG_FIELDS_MOV(op0, op1, crn, crm, op2) (((op0) << 19) | ((op1) << 16) | ((crn) << 12) | ((crm) << 8) | ((op2) << 5))

View file

@ -0,0 +1,29 @@
/*
* 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 "breakpoints.h"
#include "utils.h"
#include "sysreg.h"
#include "arm.h"
void enableAndResetWatchpoints(void)
{
SET_SYSREG(mdscr_el1, GET_SYSREG(mdscr_el1) | MDSCR_EL1_MDE);
// 20 for watchpoints
size_t num = ((GET_SYSREG(id_aa64dfr0_el1) >> 12) & 0xF) + 1;
initBreakpointRegs(num);
}

View file

@ -0,0 +1,21 @@
/*
* 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 "types.h"
void enableAndResetWatchpoints(void);