Module Name: src Committed By: maxv Date: Sun Jul 22 15:02:51 UTC 2018
Modified Files: src/sys/arch/amd64/amd64: machdep.c src/sys/arch/i386/i386: machdep.c src/sys/arch/x86/include: dbregs.h src/sys/arch/x86/x86: dbregs.c Log Message: Clean up dbregs; remove useless comments, remove arguments from prototypes, style, add KASSERT and move x86_dbregspl into dbregs.c. No real functional change. To generate a diff of this commit: cvs rdiff -u -r1.307 -r1.308 src/sys/arch/amd64/amd64/machdep.c cvs rdiff -u -r1.806 -r1.807 src/sys/arch/i386/i386/machdep.c cvs rdiff -u -r1.4 -r1.5 src/sys/arch/x86/include/dbregs.h cvs rdiff -u -r1.9 -r1.10 src/sys/arch/x86/x86/dbregs.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/amd64/amd64/machdep.c diff -u src/sys/arch/amd64/amd64/machdep.c:1.307 src/sys/arch/amd64/amd64/machdep.c:1.308 --- src/sys/arch/amd64/amd64/machdep.c:1.307 Sat Jul 21 06:09:13 2018 +++ src/sys/arch/amd64/amd64/machdep.c Sun Jul 22 15:02:51 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: machdep.c,v 1.307 2018/07/21 06:09:13 maxv Exp $ */ +/* $NetBSD: machdep.c,v 1.308 2018/07/22 15:02:51 maxv Exp $ */ /* * Copyright (c) 1996, 1997, 1998, 2000, 2006, 2007, 2008, 2011 @@ -110,7 +110,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.307 2018/07/21 06:09:13 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.308 2018/07/22 15:02:51 maxv Exp $"); #include "opt_modular.h" #include "opt_user_ldt.h" @@ -280,7 +280,7 @@ void (*delay_func)(unsigned int) = xen_d void (*initclock_func)(void) = xen_initclocks; #endif -struct pool x86_dbregspl; +extern struct pool x86_dbregspl; struct nmistore { uint64_t cr3; @@ -1929,11 +1929,7 @@ init_x86_64(paddr_t first_avail) #endif pcb->pcb_dbregs = NULL; - - x86_dbregs_setup_initdbstate(); - - pool_init(&x86_dbregspl, sizeof(struct dbreg), 16, 0, 0, "dbregs", - NULL, IPL_NONE); + x86_dbregs_init(); } void Index: src/sys/arch/i386/i386/machdep.c diff -u src/sys/arch/i386/i386/machdep.c:1.806 src/sys/arch/i386/i386/machdep.c:1.807 --- src/sys/arch/i386/i386/machdep.c:1.806 Thu Apr 5 08:43:07 2018 +++ src/sys/arch/i386/i386/machdep.c Sun Jul 22 15:02:51 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: machdep.c,v 1.806 2018/04/05 08:43:07 maxv Exp $ */ +/* $NetBSD: machdep.c,v 1.807 2018/07/22 15:02:51 maxv Exp $ */ /* * Copyright (c) 1996, 1997, 1998, 2000, 2004, 2006, 2008, 2009, 2017 @@ -67,7 +67,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.806 2018/04/05 08:43:07 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.807 2018/07/22 15:02:51 maxv Exp $"); #include "opt_beep.h" #include "opt_compat_freebsd.h" @@ -213,7 +213,7 @@ int i386_use_fxsave; int i386_has_sse; int i386_has_sse2; -struct pool x86_dbregspl; +extern struct pool x86_dbregspl; vaddr_t idt_vaddr; paddr_t idt_paddr; @@ -1443,11 +1443,7 @@ init386(paddr_t first_avail) } pcb->pcb_dbregs = NULL; - - x86_dbregs_setup_initdbstate(); - - pool_init(&x86_dbregspl, sizeof(struct dbreg), 16, 0, 0, "dbregs", - NULL, IPL_NONE); + x86_dbregs_init(); } #include <dev/ic/mc146818reg.h> /* for NVRAM POST */ Index: src/sys/arch/x86/include/dbregs.h diff -u src/sys/arch/x86/include/dbregs.h:1.4 src/sys/arch/x86/include/dbregs.h:1.5 --- src/sys/arch/x86/include/dbregs.h:1.4 Thu Feb 23 03:34:22 2017 +++ src/sys/arch/x86/include/dbregs.h Sun Jul 22 15:02:51 2018 @@ -1,6 +1,6 @@ -/* $NetBSD: dbregs.h,v 1.4 2017/02/23 03:34:22 kamil Exp $ */ +/* $NetBSD: dbregs.h,v 1.5 2018/07/22 15:02:51 maxv Exp $ */ -/*- +/* * Copyright (c) 2016 The NetBSD Foundation, Inc. * All rights reserved. * @@ -26,7 +26,6 @@ * POSSIBILITY OF SUCH DAMAGE. */ - #ifndef _X86_DBREGS_H_ #define _X86_DBREGS_H_ @@ -50,11 +49,11 @@ /* * CPU Debug Control Register (DR7) * - * LOCAL_EXACT_BREAKPOINT and GLOBAL_EXACT_BREAKPOINT are no longer used since - * the P6 processor family - portable code should set these bits - * unconditionally in oder to get exact breakpoints + * LOCAL_EXACT_BREAKPOINT and GLOBAL_EXACT_BREAKPOINT are no longer used + * since the P6 processor family - portable code should set these bits + * unconditionally in order to get exact breakpoints. * - * Reserved bits: 10, 12, 14-15 and on x86_64 32-64 + * Reserved bits: 10, 12, 14-15 and on x86_64 32-64. */ #define X86_DR7_LOCAL_DR0_BREAKPOINT __BIT(0) #define X86_DR7_GLOBAL_DR0_BREAKPOINT __BIT(1) @@ -79,9 +78,9 @@ #define X86_DR7_DR3_LENGTH_MASK __BITS(30, 31) /* - * X86_DR7_CONDITION_IO_READWRITE is currently unused - * it requires DE (debug extension) flag in control register CR4 set - * not all CPUs support it + * X86_DR7_CONDITION_IO_READWRITE is currently unused. It requires DE + * (debug extension) flag in control register CR4 set, and not all CPUs + * support it. */ enum x86_dr7_condition { X86_DR7_CONDITION_EXECUTION = 0x0, @@ -91,7 +90,7 @@ enum x86_dr7_condition { }; /* - * 0x2 is currently unimplemented - it reflects 8 bytes on modern CPUs + * 0x2 is currently unimplemented - it reflects 8 bytes on modern CPUs. */ enum x86_dr7_length { X86_DR7_LENGTH_BYTE = 0x0, @@ -107,46 +106,13 @@ enum x86_dr7_length { */ #define X86_DBREGS 4 -/* - * Store the initial Debug Register state of CPU - * This copy will be used to initialize new debug register state - */ -void x86_dbregs_setup_initdbstate(void); - -/* - * Reset CPU Debug Registers - to be used after returning to user context - */ -void x86_dbregs_clear(struct lwp *l); - -/* - * Retrieve Debug Registers from LWP's PCB and save in regs - * In case of empty register set, initialize it - */ -void x86_dbregs_read(struct lwp *l, struct dbreg *regs); - -/* - * Set CPU Debug Registers - to be used before entering user-land context - */ -void x86_dbregs_set(struct lwp *l); - -/* - * Store DR6 in LWP - to be used in trap function - */ -void x86_dbregs_store_dr6(struct lwp *l); - -/* - * Check if trap is triggered from user-land if so return nonzero value - */ +void x86_dbregs_init(void); +void x86_dbregs_clear(struct lwp *); +void x86_dbregs_read(struct lwp *, struct dbreg *); +void x86_dbregs_set(struct lwp *); +void x86_dbregs_store_dr6(struct lwp *); int x86_dbregs_user_trap(void); - -/* - * Check if trap is triggered from user-land if so return nonzero value - */ -int x86_dbregs_validate(const struct dbreg *regs); - -/* - * Write new Debug Registers from regs into LWP's PCB - */ -void x86_dbregs_write(struct lwp *l, const struct dbreg *regs); +int x86_dbregs_validate(const struct dbreg *); +void x86_dbregs_write(struct lwp *, const struct dbreg *); #endif /* !_X86_DBREGS_H_ */ Index: src/sys/arch/x86/x86/dbregs.c diff -u src/sys/arch/x86/x86/dbregs.c:1.9 src/sys/arch/x86/x86/dbregs.c:1.10 --- src/sys/arch/x86/x86/dbregs.c:1.9 Sun Apr 8 14:21:23 2018 +++ src/sys/arch/x86/x86/dbregs.c Sun Jul 22 15:02:51 2018 @@ -1,6 +1,6 @@ -/* $NetBSD: dbregs.c,v 1.9 2018/04/08 14:21:23 kamil Exp $ */ +/* $NetBSD: dbregs.c,v 1.10 2018/07/22 15:02:51 maxv Exp $ */ -/*- +/* * Copyright (c) 2016 The NetBSD Foundation, Inc. * All rights reserved. * @@ -26,7 +26,6 @@ * POSSIBILITY OF SUCH DAMAGE. */ - #include <sys/param.h> #include <sys/types.h> #include <sys/lwp.h> @@ -39,7 +38,7 @@ #include <machine/pmap.h> -extern struct pool x86_dbregspl; +struct pool x86_dbregspl; static struct dbreg initdbstate; @@ -56,7 +55,7 @@ static struct dbreg initdbstate; X86_DR7_GLOBAL_DR3_BREAKPOINT ) void -x86_dbregs_setup_initdbstate(void) +x86_dbregs_init(void) { /* DR0-DR3 should always be 0 */ initdbstate.dr[0] = rdr0(); @@ -70,14 +69,14 @@ x86_dbregs_setup_initdbstate(void) /* DR8-DR15 are reserved - skip */ /* - * Paranoid case. - * * Explicitly reset some bits just in case they could be * set by brave software/hardware before the kernel boot. */ initdbstate.dr[6] &= ~X86_BREAKPOINT_CONDITION_DETECTED; - initdbstate.dr[7] &= ~X86_DR7_GENERAL_DETECT_ENABLE; + + pool_init(&x86_dbregspl, sizeof(struct dbreg), 16, 0, 0, "dbregs", + NULL, IPL_NONE); } void @@ -88,16 +87,16 @@ x86_dbregs_clear(struct lwp *l) KASSERT(pcb->pcb_dbregs == NULL); /* - * It's sufficient to just disable Debug Control Register (DR7) - * it will deactivate hardware watchpoints + * It's sufficient to just disable Debug Control Register (DR7). + * It will deactivate hardware watchpoints. */ ldr7(0); /* - * However at some point we need to clear Debug Status Registers (DR6) - * CPU will never do it automatically + * However at some point we need to clear Debug Status Registers + * (DR6). The CPU will never do it automatically. * - * Clear BREAKPOINT_CONDITION_DETECTED bits and ignore the rest + * Clear BREAKPOINT_CONDITION_DETECTED bits and ignore the rest. */ ldr6(rdr6() & ~X86_BREAKPOINT_CONDITION_DETECTED); } @@ -135,6 +134,7 @@ x86_dbregs_store_dr6(struct lwp *l) { struct pcb *pcb = lwp_getpcb(l); + KASSERT(l == curlwp); KASSERT(pcb->pcb_dbregs != NULL); pcb->pcb_dbregs->dr[6] = rdr6(); @@ -143,15 +143,14 @@ x86_dbregs_store_dr6(struct lwp *l) int x86_dbregs_user_trap(void) { - register_t dr7, dr6; /* debug registers dr6 and dr7 */ - register_t bp; /* breakpoint bits extracted from dr6 */ + register_t dr7, dr6; + register_t bp; dr7 = rdr7(); if ((dr7 & X86_GLOBAL_BREAKPOINT) == 0) { /* - * all Global Breakpoint bits in the DR7 register are zero, - * thus the trap couldn't have been caused by the - * hardware debug registers + * All Global Breakpoint bits are zero, thus the trap couldn't + * have been caused by the hardware debug registers. */ return 0; } @@ -161,15 +160,15 @@ x86_dbregs_user_trap(void) if (!bp) { /* - * None of the breakpoint bits are set meaning this - * trap was not caused by any of the debug registers + * None of the breakpoint bits are set, meaning this + * trap was not caused by any of the debug registers. */ return 0; } /* - * at least one of the breakpoints were hit, check to see - * which ones and if any of them are user space addresses + * At least one of the breakpoints was hit, check to see + * which ones and if any of them are user space addresses. */ if (bp & X86_DR6_DR0_BREAKPOINT_CONDITION_DETECTED) @@ -197,12 +196,14 @@ x86_dbregs_validate(const struct dbreg * size_t i; /* Check that DR0-DR3 contain user-space address */ - for (i = 0; i < X86_DBREGS; i++) + for (i = 0; i < X86_DBREGS; i++) { if (regs->dr[i] >= (vaddr_t)VM_MAXUSER_ADDRESS) return EINVAL; + } - if (regs->dr[7] & X86_DR7_GENERAL_DETECT_ENABLE) + if (regs->dr[7] & X86_DR7_GENERAL_DETECT_ENABLE) { return EINVAL; + } /* * Skip checks for reserved registers (DR4-DR5, DR8-DR15). @@ -216,8 +217,9 @@ x86_dbregs_write(struct lwp *l, const st { struct pcb *pcb = lwp_getpcb(l); - if (pcb->pcb_dbregs == NULL) + if (pcb->pcb_dbregs == NULL) { pcb->pcb_dbregs = pool_get(&x86_dbregspl, PR_WAITOK); + } memcpy(pcb->pcb_dbregs, regs, sizeof(*regs)); }