PERFORCE change 54806 for review
Juli Mallett
jmallett at FreeBSD.org
Sun Jun 13 09:49:36 GMT 2004
http://perforce.freebsd.org/chv.cgi?CH=54806
Change 54806 by jmallett at jmallett_oingo on 2004/06/13 09:47:51
Add check_address(), which is an NIHBSD compatible function to NetBSD's
badvaddr(), but it doesn't do alignment. Most things can do that for
themselves. At least ISTR badvaddr() checks int alignment.
Use check_address() in HPC ala NetBSD.
Next year, resolve to ramble less in commit/submit messages.
Affected files ...
.. //depot/projects/mips/sys/mips/include/trap.h#5 edit
.. //depot/projects/mips/sys/mips/mips/trap.c#21 edit
.. //depot/projects/mips/sys/mips/sgimips/hpc/hpc.c#3 edit
Differences ...
==== //depot/projects/mips/sys/mips/include/trap.h#5 (text+ko) ====
@@ -50,6 +50,10 @@
#define TrVCED 31
#ifndef LOCORE /* XXX */
+struct trapframe;
+
+void trap(struct trapframe *, u_int, void *);
+int check_address(void *);
void platform_trap_enter(void);
void platform_trap_exit(void);
#endif
==== //depot/projects/mips/sys/mips/mips/trap.c#21 (text+ko) ====
@@ -34,6 +34,7 @@
#include <vm/vm.h>
#include <vm/pmap.h>
+#include <vm/vm_map.h>
#include <machine/cpu.h>
#include <machine/frame.h>
@@ -86,8 +87,9 @@
};
#define MAXTRAPID 31
-/* XXX belongs in a header some day? */
-void trap(struct trapframe *, u_int, void *);
+/* Protected by critical sections, for checking for bad addresses. */
+static char *trap_addr;
+static int trap_error;
void
trap(struct trapframe *tf, u_int cause, void *badvaddr)
@@ -99,7 +101,7 @@
code = (cause & MIPS_CR_EXC_CODE) >> MIPS_CR_EXC_CODE_SHIFT;
kernelmode = (tf->tf_regs[TF_SR] & MIPS_SR_KSU_USER) == 0;
-
+
if (curthread != NULL)
bcopy(tf, curthread->td_frame, sizeof *tf);
@@ -115,6 +117,13 @@
/*platform_trap_exit();*/
platform_intr(tf);
goto done;
+ case TrAdEL:
+ if (trap_error == -1) {
+ if (trap_addr == badvaddr)
+ trap_error = EINVAL;
+ goto done;
+ }
+ /* fall through */
default:
/* Fatal! */
break;
@@ -173,3 +182,25 @@
if (curthread)
bcopy(curthread->td_frame, tf, sizeof *tf);
}
+
+int
+check_address(void *addr)
+{
+ vm_paddr_t pa;
+ char b;
+ int error;
+
+ critical_enter();
+ pa = pmap_kextract((vm_offset_t)addr);
+ trap_addr = (char *)MIPS_PHYS_TO_KSEG1(pa);
+ trap_error = -1;
+ b = *trap_addr;
+ trap_addr = NULL;
+ error = trap_error;
+ trap_error = 0;
+ critical_exit();
+
+ if (error == -1)
+ return (0);
+ return (error);
+}
==== //depot/projects/mips/sys/mips/sgimips/hpc/hpc.c#3 (text+ko) ====
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $P4: //depot/projects/mips/sys/mips/sgimips/hpc/hpc.c#2 $
+ * $P4: //depot/projects/mips/sys/mips/sgimips/hpc/hpc.c#3 $
*/
#include <sys/cdefs.h>
@@ -36,6 +36,7 @@
#include <sys/bus.h>
#include <machine/bus.h>
+#include <machine/trap.h>
#include <platform/models.h>
static devclass_t hpc_devclass;
@@ -92,6 +93,10 @@
"port", &port);
if (error != 0)
return (ENODEV);
+ /* XXX circumvents resource_long_value() */
+ error = check_address((void *)MIPS_PHYS_TO_KSEG1(port));
+ if (error != 0)
+ return (error);
sc->sc_tag = device_space_tag;
sc->sc_handle = port;
return (0);
More information about the p4-projects
mailing list