diff --git a/sys/arch/x86_64/x86_64/db_trace.c b/sys/arch/x86_64/x86_64/db_trace.c index 3f30c4526811..fec5177b278b 100644 --- a/sys/arch/x86_64/x86_64/db_trace.c +++ b/sys/arch/x86_64/x86_64/db_trace.c @@ -1,4 +1,4 @@ -/* $NetBSD: db_trace.c,v 1.4 2003/03/05 23:56:08 fvdl Exp $ */ +/* $NetBSD: db_trace.c,v 1.5 2003/03/06 20:58:09 fvdl Exp $ */ /* * Mach Operating System @@ -27,7 +27,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: db_trace.c,v 1.4 2003/03/05 23:56:08 fvdl Exp $"); +__KERNEL_RCSID(0, "$NetBSD: db_trace.c,v 1.5 2003/03/06 20:58:09 fvdl Exp $"); #include #include @@ -46,36 +46,58 @@ __KERNEL_RCSID(0, "$NetBSD: db_trace.c,v 1.4 2003/03/05 23:56:08 fvdl Exp $"); #define dbreg(xx) (long *)offsetof(db_regs_t, tf_ ## xx) +static int db_x86_64_regop(const struct db_variable *, db_expr_t *, int); + /* * Machine register set. */ const struct db_variable db_regs[] = { - { "ds", dbreg(ds), FCN_NULL }, - { "es", dbreg(es), FCN_NULL }, - { "fs", dbreg(fs), FCN_NULL }, - { "gs", dbreg(gs), FCN_NULL }, - { "rdi", dbreg(rdi), FCN_NULL }, - { "rsi", dbreg(rsi), FCN_NULL }, - { "rbp", dbreg(rbp), FCN_NULL }, - { "rbx", dbreg(rbx), FCN_NULL }, - { "rdx", dbreg(rdx), FCN_NULL }, - { "rcx", dbreg(rcx), FCN_NULL }, - { "rax", dbreg(rax), FCN_NULL }, - { "r8", dbreg(r8), FCN_NULL }, - { "r9", dbreg(r9), FCN_NULL }, - { "r10", dbreg(r10), FCN_NULL }, - { "r11", dbreg(r11), FCN_NULL }, - { "r12", dbreg(r12), FCN_NULL }, - { "r13", dbreg(r13), FCN_NULL }, - { "r14", dbreg(r14), FCN_NULL }, - { "r15", dbreg(r15), FCN_NULL }, - { "rip", dbreg(rip), FCN_NULL }, - { "cs", dbreg(cs), FCN_NULL }, - { "rflags", dbreg(rflags), FCN_NULL }, - { "rsp", dbreg(rsp), FCN_NULL }, - { "ss", dbreg(ss), FCN_NULL }, + { "ds", dbreg(ds), db_x86_64_regop }, + { "es", dbreg(es), db_x86_64_regop }, + { "fs", dbreg(fs), db_x86_64_regop }, + { "gs", dbreg(gs), db_x86_64_regop }, + { "rdi", dbreg(rdi), db_x86_64_regop }, + { "rsi", dbreg(rsi), db_x86_64_regop }, + { "rbp", dbreg(rbp), db_x86_64_regop }, + { "rbx", dbreg(rbx), db_x86_64_regop }, + { "rdx", dbreg(rdx), db_x86_64_regop }, + { "rcx", dbreg(rcx), db_x86_64_regop }, + { "rax", dbreg(rax), db_x86_64_regop }, + { "r8", dbreg(r8), db_x86_64_regop }, + { "r9", dbreg(r9), db_x86_64_regop }, + { "r10", dbreg(r10), db_x86_64_regop }, + { "r11", dbreg(r11), db_x86_64_regop }, + { "r12", dbreg(r12), db_x86_64_regop }, + { "r13", dbreg(r13), db_x86_64_regop }, + { "r14", dbreg(r14), db_x86_64_regop }, + { "r15", dbreg(r15), db_x86_64_regop }, + { "rip", dbreg(rip), db_x86_64_regop }, + { "cs", dbreg(cs), db_x86_64_regop }, + { "rflags", dbreg(rflags), db_x86_64_regop }, + { "rsp", dbreg(rsp), db_x86_64_regop }, + { "ss", dbreg(ss), db_x86_64_regop }, }; -const struct db_variable * const db_eregs = db_regs + sizeof(db_regs)/sizeof(db_regs[0]); +const struct db_variable * const db_eregs = + db_regs + sizeof(db_regs)/sizeof(db_regs[0]); + +static int +db_x86_64_regop(const struct db_variable *vp, db_expr_t *val, int opcode) +{ + db_expr_t *regaddr = + (db_expr_t *)(((uint8_t *)DDB_REGS) + ((size_t)vp->valuep)); + + switch (opcode) { + case DB_VAR_GET: + *val = *regaddr; + break; + case DB_VAR_SET: + *regaddr = *val; + break; + default: + panic("db_x86_64_regop: unknown op %d", opcode); + } + return 0; +} /* * Stack trace. diff --git a/sys/arch/x86_64/x86_64/vector.S b/sys/arch/x86_64/x86_64/vector.S index 90e838602e0d..d3c1d105cbb9 100644 --- a/sys/arch/x86_64/x86_64/vector.S +++ b/sys/arch/x86_64/x86_64/vector.S @@ -1,4 +1,4 @@ -/* $NetBSD: vector.S,v 1.19 2003/03/05 23:56:13 fvdl Exp $ */ +/* $NetBSD: vector.S,v 1.20 2003/03/06 20:58:09 fvdl Exp $ */ /* * Copyright (c) 2001 Wasabi Systems, Inc. @@ -322,6 +322,8 @@ IDTVEC(intr_lapic_ipi) #if defined(DDB) IDTVEC(intrddb) 1: + pushq $0 + pushq $T_BPTFLT INTRENTRY movl $0xff,%eax movq %rax,%cr8 @@ -330,8 +332,7 @@ IDTVEC(intrddb) call _C_LABEL(ddb_ipi) xorl %eax,%eax movq %rax,%cr8 - iretq - jmp 1b + INTRFASTEXIT #endif /* DDB */ #endif /* MULTIPROCESSOR */