diff options
author | Miod Vallat <miod@cvs.openbsd.org> | 2008-04-07 22:37:19 +0000 |
---|---|---|
committer | Miod Vallat <miod@cvs.openbsd.org> | 2008-04-07 22:37:19 +0000 |
commit | 4daaa30806c6bc03f7497d244da68c0006efb101 (patch) | |
tree | 80d99a94a1a5e132acd19ba0916f90dc9971e73b | |
parent | 3b155998b905d3951937b9aa72b3f53c5f07d8e0 (diff) |
Add ``guarded'' word read and write routines, to be used by machine-dependent
code soon. Similar to what ddb does, but does not need ddb to be compiled in.
-rw-r--r-- | sys/arch/mips64/include/cpu.h | 6 | ||||
-rw-r--r-- | sys/arch/mips64/include/trap.h | 3 | ||||
-rw-r--r-- | sys/arch/mips64/mips64/lcore_access.S | 41 |
3 files changed, 46 insertions, 4 deletions
diff --git a/sys/arch/mips64/include/cpu.h b/sys/arch/mips64/include/cpu.h index 629c4bf8766..d320ef5a309 100644 --- a/sys/arch/mips64/include/cpu.h +++ b/sys/arch/mips64/include/cpu.h @@ -1,4 +1,4 @@ -/* $OpenBSD: cpu.h,v 1.23 2008/04/07 22:29:16 miod Exp $ */ +/* $OpenBSD: cpu.h,v 1.24 2008/04/07 22:37:16 miod Exp $ */ /*- * Copyright (c) 1992, 1993 @@ -545,10 +545,12 @@ int tlb_update(vaddr_t, unsigned); void tlb_read(int, struct tlb_entry *); void savectx(struct user *, int); -void switch_exit(struct proc *); void MipsSaveCurFPState(struct proc *); void MipsSaveCurFPState16(struct proc *); +int guarded_read_4(paddr_t, uint32_t *); +int guarded_write_4(paddr_t, uint32_t); + extern u_int32_t cpu_counter_interval; /* Number of counter ticks/tick */ extern u_int32_t cpu_counter_last; /* Last compare value loaded */ diff --git a/sys/arch/mips64/include/trap.h b/sys/arch/mips64/include/trap.h index 2fd793bd754..8095310ad01 100644 --- a/sys/arch/mips64/include/trap.h +++ b/sys/arch/mips64/include/trap.h @@ -1,4 +1,4 @@ -/* $OpenBSD: trap.h,v 1.8 2007/05/20 14:34:21 miod Exp $ */ +/* $OpenBSD: trap.h,v 1.9 2008/04/07 22:37:16 miod Exp $ */ /* * Copyright (c) 1988 University of Utah. @@ -77,6 +77,7 @@ #define KT_COPYERR 1 /* User space copy error */ #define KT_KCOPYERR 2 /* Kernel space copy error */ #define KT_DDBERR 3 /* DDB access error */ +#define KT_GUARDERR 4 /* guarded access error */ #ifndef _LOCORE diff --git a/sys/arch/mips64/mips64/lcore_access.S b/sys/arch/mips64/mips64/lcore_access.S index 9da36ec7b38..a6e2b25cdbc 100644 --- a/sys/arch/mips64/mips64/lcore_access.S +++ b/sys/arch/mips64/mips64/lcore_access.S @@ -1,4 +1,4 @@ -/* $OpenBSD: lcore_access.S,v 1.13 2008/02/20 21:34:19 miod Exp $ */ +/* $OpenBSD: lcore_access.S,v 1.14 2008/04/07 22:37:18 miod Exp $ */ /* * Copyright (c) 2001-2003 Opsycon AB (www.opsycon.se / www.opsycon.com) @@ -64,6 +64,7 @@ onfault_table: #else PTR_VAL 0 #endif + PTR_VAL _guarderr .text /* @@ -330,3 +331,41 @@ _kcopyerr: PTR_ADDU sp, sp, FRAMESZ(CF_SZ + REGSZ) j ra li v0, EFAULT # return error + +/* + * Guarded ``memory'' access routines + * int guarded_read_4(paddr_t address, uint32_t *dest); + * int guarded_write_4(paddr_t address, uint32_t src); + */ + +LEAF(guarded_read_4, 0) + PTR_L t3, curprocpaddr + li v0, KT_GUARDERR + lw v1, PCB_ONFAULT(t3) + sw v0, PCB_ONFAULT(t3) + + lw v0, 0(a0) + sw v0, 0(a1) + + sw v1, PCB_ONFAULT(t3) + j ra + move v0, zero +END(guarded_read_4) + +LEAF(guarded_write_4, 0) + PTR_L t3, curprocpaddr + li v0, KT_GUARDERR + lw v1, PCB_ONFAULT(t3) + sw v0, PCB_ONFAULT(t3) + + sw a1, 0(a0) + + sw v1, PCB_ONFAULT(t3) + j ra + move v0, zero +END(guarded_write_4) + +_guarderr: + sw v1, PCB_ONFAULT(t3) + j ra + li v0, EFAULT # return error |