Module Name:    src
Committed By:   matt
Date:           Wed Jul  6 09:27:35 UTC 2011

Modified Files:
        src/sys/arch/mips/include: cpu.h
        src/sys/arch/mips/mips: copy.S

Log Message:
Add

        uint32_t kfetch_32(volatile uint32_t *, uint32_t);

which fetches a 32-bit value from a provided addess or returns
an user supplied value on error.


To generate a diff of this commit:
cvs rdiff -u -r1.102 -r1.103 src/sys/arch/mips/include/cpu.h
cvs rdiff -u -r1.13 -r1.14 src/sys/arch/mips/mips/copy.S

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/mips/include/cpu.h
diff -u src/sys/arch/mips/include/cpu.h:1.102 src/sys/arch/mips/include/cpu.h:1.103
--- src/sys/arch/mips/include/cpu.h:1.102	Mon May  2 00:29:54 2011
+++ src/sys/arch/mips/include/cpu.h	Wed Jul  6 09:27:35 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpu.h,v 1.102 2011/05/02 00:29:54 rmind Exp $	*/
+/*	$NetBSD: cpu.h,v 1.103 2011/07/06 09:27:35 matt Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -539,6 +539,7 @@
 #endif
 
 /* copy.S */
+int32_t kfetch_32(volatile uint32_t *, uint32_t);
 int8_t	ufetch_int8(void *);
 int16_t	ufetch_int16(void *);
 int32_t ufetch_int32(void *);

Index: src/sys/arch/mips/mips/copy.S
diff -u src/sys/arch/mips/mips/copy.S:1.13 src/sys/arch/mips/mips/copy.S:1.14
--- src/sys/arch/mips/mips/copy.S:1.13	Tue Jul  5 08:07:53 2011
+++ src/sys/arch/mips/mips/copy.S	Wed Jul  6 09:27:35 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: copy.S,v 1.13 2011/07/05 08:07:53 matt Exp $	*/
+/*	$NetBSD: copy.S,v 1.14 2011/07/06 09:27:35 matt Exp $	*/
 
 /*
  * Copyright (c) 1992, 1993
@@ -278,6 +278,23 @@
 	 li	v0, EFAULT
 END(copyefault)
 
+LEAF(kfetch_32)
+	PTR_L	v1, L_PCB(MIPS_CURLWP)
+	PTR_LA	v0, _C_LABEL(kfetcherr)
+	bgez	a0, _C_LABEL(kfetcherr)
+	 PTR_S	v0, PCB_ONFAULT(v1)
+	INT_L	v0, 0(a0)			# fetch int
+	/*
+	 * Normally a sync instructions would be used but this has to work on
+	 * MIPS1 which doesn't have a sync.
+	 */
+	nop					# load delay for mips1
+	move	t0, v0				# dependent instruction
+	xor	t0, v0				# make t0 zero
+	j	ra
+	 PTR_S	t0, PCB_ONFAULT(v1)
+END(kfetch_32)
+
 /*
  * int fuswintr(void *)
  * Fetches a short word of data from the user-space address.
@@ -578,8 +595,14 @@
 4:
 	INT_L	v0, (a0)
 5:
-	sync
-	PTR_S	zero, PCB_ONFAULT(v1)
+	/*
+	 * Normally a sync instructions would be used but this has to work on
+	 * MIPS1 which doesn't have a sync.
+	 */
+	nop
+	move	t0, v0			# dependent instruction
+	xor	t0, t0			# zero t0
+	PTR_S	t0, PCB_ONFAULT(v1)	# clear onfault
 	j	ra
 	 move	v0, zero		# made it w/o errors
 END(badaddr)
@@ -597,6 +620,12 @@
 	 li	v0, -1
 END(fswintrberr)
 
+LEAF(kfetcherr)
+	PTR_S	zero, PCB_ONFAULT(v1)
+	j	ra
+	 move	v0, a1
+END(kfetcherr)
+
 LEAF(fswberr)
 XLEAF(baderr)
 	PTR_S	zero, PCB_ONFAULT(v1)

Reply via email to