Skip to content

Commit 3057b32

Browse files
committed
Implement ptrace emulation of NT_ARM_PACA_KEYS/NT_ARM_PACG_KEYS
1 parent e93dc54 commit 3057b32

2 files changed

Lines changed: 54 additions & 0 deletions

File tree

src/Task.cc

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -827,6 +827,20 @@ void Task::on_syscall_exit_arch(int syscallno, const Registers& regs) {
827827
2*sizeof(ARM64Arch::hw_bp));
828828
break;
829829
}
830+
case NT_ARM_PACA_KEYS: {
831+
auto set = ptrace_get_regs_set<Arch>(
832+
this, regs, sizeof(ARM64Arch::user_pac_address_keys));
833+
struct iovec vec = { (void*)set.data(), sizeof(ARM64Arch::user_pac_address_keys) };
834+
fallible_ptrace(PTRACE_SETREGSET, NT_ARM_PACA_KEYS, &vec);
835+
break;
836+
}
837+
case NT_ARM_PACG_KEYS: {
838+
auto set = ptrace_get_regs_set<Arch>(
839+
this, regs, sizeof(ARM64Arch::user_pac_generic_keys));
840+
struct iovec vec = { (void*)set.data(), sizeof(ARM64Arch::user_pac_generic_keys) };
841+
fallible_ptrace(PTRACE_SETREGSET, NT_ARM_PACG_KEYS, &vec);
842+
break;
843+
}
830844
case NT_X86_XSTATE: {
831845
if (auto extra_regs = tracee->extra_regs_fallible()) {
832846
switch (extra_regs->format()) {

src/record_syscall.cc

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2950,6 +2950,27 @@ static Switchable prepare_ptrace(RecordTask* t,
29502950
}
29512951
break;
29522952
}
2953+
case NT_ARM_PACA_KEYS:
2954+
case NT_ARM_PACG_KEYS: {
2955+
if (Arch::arch() != aarch64) {
2956+
syscall_state.expect_errno = EINVAL;
2957+
emulate = false;
2958+
break;
2959+
}
2960+
RecordTask* tracee = verify_ptrace_target(t, syscall_state, tid);
2961+
if (tracee) {
2962+
bool ok = true;
2963+
vector<uint8_t> keys = tracee->pac_keys(&ok);
2964+
ASSERT(tracee, ok);
2965+
if ((int)t->regs().arg3() == NT_ARM_PACA_KEYS) {
2966+
keys.erase(keys.begin() + sizeof(ARM64Arch::user_pac_address_keys), keys.end());
2967+
} else {
2968+
keys.erase(keys.begin(), keys.begin() + sizeof(ARM64Arch::user_pac_address_keys));
2969+
}
2970+
ptrace_get_reg_set<Arch>(t, syscall_state, keys);
2971+
}
2972+
break;
2973+
}
29532974
case NT_X86_XSTATE: {
29542975
if (!Arch::is_x86ish()) {
29552976
syscall_state.expect_errno = EINVAL;
@@ -3028,6 +3049,25 @@ static Switchable prepare_ptrace(RecordTask* t,
30283049
}
30293050
break;
30303051
}
3052+
case NT_ARM_PACA_KEYS:
3053+
case NT_ARM_PACG_KEYS: {
3054+
if (Arch::arch() != aarch64) {
3055+
syscall_state.expect_errno = EINVAL;
3056+
emulate = false;
3057+
break;
3058+
}
3059+
RecordTask* tracee = verify_ptrace_target(t, syscall_state, tid);
3060+
if (tracee) {
3061+
if ((int)t->regs().arg3() == NT_ARM_PACA_KEYS) {
3062+
ptrace_verify_set_reg_set<Arch>(
3063+
t, sizeof(ARM64Arch::user_pac_address_keys), syscall_state);
3064+
} else {
3065+
ptrace_verify_set_reg_set<Arch>(
3066+
t, sizeof(ARM64Arch::user_pac_generic_keys), syscall_state);
3067+
}
3068+
}
3069+
break;
3070+
}
30313071
case NT_X86_XSTATE: {
30323072
if (!Arch::is_x86ish()) {
30333073
syscall_state.expect_errno = EINVAL;

0 commit comments

Comments
 (0)