From 7aec09ca69cc61e7e0cca42e635fa56ca61d72a8 Mon Sep 17 00:00:00 2001 From: Taylor R Campbell <riastradh@NetBSD.org> Date: Wed, 2 Nov 2022 22:48:53 +0000 Subject: [PATCH] WIP: aarch64: emulate MRS xN,MIDR_EL1 at EL0 (userland) --- sys/arch/aarch64/aarch64/trap.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/sys/arch/aarch64/aarch64/trap.c b/sys/arch/aarch64/aarch64/trap.c index 6ac09810c447..7ad4dad19e1f 100644 --- a/sys/arch/aarch64/aarch64/trap.c +++ b/sys/arch/aarch64/aarch64/trap.c @@ -390,6 +390,7 @@ emul_aarch64_insn(struct trapframe *tf) } LE32TOH(insn); + printf("%s: insn=%"PRIx32"\n", __func__, insn); if ((insn & 0xffffffe0) == 0xd53b0020) { /* mrs x?,ctr_el0 */ unsigned int Xt = insn & 31; @@ -400,7 +401,11 @@ emul_aarch64_insn(struct trapframe *tf) tf->tf_reg[Xt] = ctr_el0; } curcpu()->ci_uct_trap.ev_count++; - + } else if ((insn & 0xffffffe0) == 0xd5380000) { + /* mrs x?,midr_el1 */ + unsigned int Xt = insn & 31; + if (Xt != 31) + tf->tf_reg[Xt] = reg_midr_el1_read(); } else { return EMUL_ARM_UNKNOWN; } @@ -485,14 +490,19 @@ trap_el0_sync(struct trapframe *tf) default: case ESR_EC_UNKNOWN: unknown: + printf("%s: esr=0x%"PRIx32"\n", __func__, esr); #ifdef DDB + sigill_debug = 1; if (sigill_debug) { /* show illegal instruction */ + uint32_t insn = 0; + ufetch_32((const uint32_t *)tf->tf_pc, &insn); printf("TRAP: pid %d (%s), uid %d: %s:" - " esr=0x%lx: pc=0x%lx: %s\n", + " esr=0x%lx: pc=0x%lx: 0x%"PRIx32" %s\n", curlwp->l_proc->p_pid, curlwp->l_proc->p_comm, l->l_cred ? kauth_cred_geteuid(l->l_cred) : -1, eclass_trapname(eclass), tf->tf_esr, tf->tf_pc, + insn, strdisasm(tf->tf_pc, tf->tf_spsr)); } #endif