Module Name: src Committed By: nisimura Date: Fri Aug 25 22:23:59 UTC 2017
Modified Files: src/sys/arch/aarch64/aarch64: locore.S trap.c Log Message: - reorder faultbuf member. - introduce trap() and interrupt(). now brk insn work. - To generate a diff of this commit: cvs rdiff -u -r1.3 -r1.4 src/sys/arch/aarch64/aarch64/locore.S cvs rdiff -u -r1.2 -r1.3 src/sys/arch/aarch64/aarch64/trap.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/aarch64/aarch64/locore.S diff -u src/sys/arch/aarch64/aarch64/locore.S:1.3 src/sys/arch/aarch64/aarch64/locore.S:1.4 --- src/sys/arch/aarch64/aarch64/locore.S:1.3 Fri Aug 25 21:43:49 2017 +++ src/sys/arch/aarch64/aarch64/locore.S Fri Aug 25 22:23:59 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: locore.S,v 1.3 2017/08/25 21:43:49 nisimura Exp $ */ +/* $NetBSD: locore.S,v 1.4 2017/08/25 22:23:59 nisimura Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ #include "opt_ddb.h" -RCSID("$NetBSD: locore.S,v 1.3 2017/08/25 21:43:49 nisimura Exp $") +RCSID("$NetBSD: locore.S,v 1.4 2017/08/25 22:23:59 nisimura Exp $") // XXX:AARCH64 lr .req x30 @@ -304,10 +304,10 @@ ENTRY(cpu_set_onfault) stp x23, x24, [x0, #32] stp x25, x26, [x0, #48] stp x27, x28, [x0, #64] - stp x29, x9, [x0, #80] - stp lr, x1, [x0, #96] - mrs x3, tpidr_el1 /* curcpu */ - ldr x2, [x3, #CI_CURLWP] /* curlwp */ + stp x29, lr, [x0, #80] + stp x9, x1, [x0, #96] + mrs x3, tpidr_el1 + ldr x2, [x3, #CI_CURLWP] /* curlwp = curcpu()->ci_curlwp */ str x0, [x2, #L_MD_ONFAULT] /* l_md.md_onfault = fb */ mov x0, #0 END(cpu_set_onfault) Index: src/sys/arch/aarch64/aarch64/trap.c diff -u src/sys/arch/aarch64/aarch64/trap.c:1.2 src/sys/arch/aarch64/aarch64/trap.c:1.3 --- src/sys/arch/aarch64/aarch64/trap.c:1.2 Wed Aug 16 22:48:11 2017 +++ src/sys/arch/aarch64/aarch64/trap.c Fri Aug 25 22:23:59 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: trap.c,v 1.2 2017/08/16 22:48:11 nisimura Exp $ */ +/* $NetBSD: trap.c,v 1.3 2017/08/25 22:23:59 nisimura Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -31,21 +31,105 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(1, "$NetBSD: trap.c,v 1.2 2017/08/16 22:48:11 nisimura Exp $"); +__KERNEL_RCSID(1, "$NetBSD: trap.c,v 1.3 2017/08/25 22:23:59 nisimura Exp $"); #include <sys/param.h> #include <sys/types.h> #include <sys/cpu.h> +#include <sys/proc.h> #include <sys/userret.h> +#include <sys/systm.h> + +#include <sys/signal.h> +#include <sys/signalvar.h> +#include <sys/siginfo.h> #include <aarch64/locore.h> +static void +dump_trapframe(struct trapframe *tf, void (*pr)(const char *, ...)) +{ + (*pr)("trapframe @ %p:\n", tf); + (*pr)("esr=%016"PRIxREGISTER + ", pc=%016"PRIxREGISTER + ", lr=%016"PRIxREGISTER + ", sp=%016"PRIxREGISTER"\n", + tf->tf_esr, tf->tf_pc, tf->tf_lr, tf->tf_sp); + (*pr)(" x0=%016"PRIxREGISTER + ", x1=%016"PRIxREGISTER + ", x2=%016"PRIxREGISTER + ", x3=%016"PRIxREGISTER"\n", + tf->tf_reg[0], tf->tf_reg[1], tf->tf_reg[2], tf->tf_reg[3]); + (*pr)(" x4=%016"PRIxREGISTER + ", x5=%016"PRIxREGISTER + ", x6=%016"PRIxREGISTER + ", x7=%016"PRIxREGISTER"\n", + tf->tf_reg[4], tf->tf_reg[5], tf->tf_reg[6], tf->tf_reg[7]); + (*pr)(" x8=%016"PRIxREGISTER + ", x9=%016"PRIxREGISTER + ", x10=%016"PRIxREGISTER + ", x11=%016"PRIxREGISTER"\n", + tf->tf_reg[8], tf->tf_reg[9], tf->tf_reg[10], tf->tf_reg[11]); + (*pr)("x12=%016"PRIxREGISTER + ", x13=%016"PRIxREGISTER + ", x14=%016"PRIxREGISTER + ", x15=%016"PRIxREGISTER"\n", + tf->tf_reg[12], tf->tf_reg[13], tf->tf_reg[14], tf->tf_reg[15]); + (*pr)("x16=%016"PRIxREGISTER + ", x17=%016"PRIxREGISTER + ", x18=%016"PRIxREGISTER + ", x19=%016"PRIxREGISTER"\n", + tf->tf_reg[16], tf->tf_reg[17], tf->tf_reg[18], tf->tf_reg[19]); + (*pr)("x20=%016"PRIxREGISTER + ", x21=%016"PRIxREGISTER + ", x22=%016"PRIxREGISTER + ", x23=%016"PRIxREGISTER"\n", + tf->tf_reg[20], tf->tf_reg[21], tf->tf_reg[22], tf->tf_reg[23]); + (*pr)("x24=%016"PRIxREGISTER + ", x25=%016"PRIxREGISTER + ", x26=%016"PRIxREGISTER + ", x27=%016"PRIxREGISTER"\n", + tf->tf_reg[24], tf->tf_reg[25], tf->tf_reg[26], tf->tf_reg[27]); + (*pr)("x28=%016"PRIxREGISTER + ", x29=%016"PRIxREGISTER + ", x30=%016"PRIxREGISTER"\n", + tf->tf_reg[28], tf->tf_reg[29], tf->tf_reg[30]); +} + void userret(struct lwp *l, struct trapframe *tf) { mi_userret(l); } +void +trap(struct trapframe *tf, int reason) +{ + struct lwp * const l = curlwp; + size_t code = tf->tf_esr & 0xffff; + bool usertrap_p = tf->tf_esr & 01; + bool ok = true; + ksiginfo_t ksi; + + code = code; + dump_trapframe(tf, printf); + + if (usertrap_p) { + if (!ok) + (*l->l_proc->p_emul->e_trapsignal)(l, &ksi); + userret(l, tf); + } + else if (!ok) { + dump_trapframe(tf, printf); + panic("%s: fatal kernel trap", __func__); + } +} + +void +interrupt(struct trapframe *tf) +{ +} + // XXXAARCH64 might be populated in frame.h in future #define FB_X19 0 @@ -59,8 +143,8 @@ userret(struct lwp *l, struct trapframe #define FB_X27 8 #define FB_X28 9 #define FB_X29 10 -#define FB_SP 11 -#define FB_LR 12 +#define FB_LR 11 +#define FB_SP 12 #define FB_V0 13 #define FB_MAX 14