Page MenuHomeFreeBSD

D59449.id.diff
No OneTemporary

D59449.id.diff

diff --git a/sys/cddl/contrib/opensolaris/uts/common/sys/dtrace_impl.h b/sys/cddl/contrib/opensolaris/uts/common/sys/dtrace_impl.h
--- a/sys/cddl/contrib/opensolaris/uts/common/sys/dtrace_impl.h
+++ b/sys/cddl/contrib/opensolaris/uts/common/sys/dtrace_impl.h
@@ -1302,8 +1302,15 @@
extern hrtime_t dtrace_gethrestime(void);
#endif
+#if defined(__aarch64__)
+extern void dtrace_copyin_pan(uintptr_t, uintptr_t, size_t);
+extern void dtrace_copyinstr_pan(uintptr_t, uintptr_t, size_t);
+extern void dtrace_copyout_pan(uintptr_t, uintptr_t, size_t, volatile uint16_t *);
+extern void dtrace_copyoutstr_pan(uintptr_t, uintptr_t, size_t, volatile uint16_t *);
+#else
extern void dtrace_copy(uintptr_t, uintptr_t, size_t);
extern void dtrace_copystr(uintptr_t, uintptr_t, size_t, volatile uint16_t *);
+#endif
/*
* DTrace Assertions
diff --git a/sys/cddl/dev/dtrace/aarch64/dtrace_asm.S b/sys/cddl/dev/dtrace/aarch64/dtrace_asm.S
--- a/sys/cddl/dev/dtrace/aarch64/dtrace_asm.S
+++ b/sys/cddl/dev/dtrace/aarch64/dtrace_asm.S
@@ -104,9 +104,9 @@
/*
void
-dtrace_copy(uintptr_t uaddr, uintptr_t kaddr, size_t size)
+dtrace_copyin_pan(uintptr_t uaddr, uintptr_t kaddr, size_t size)
*/
-ENTRY(dtrace_copy)
+ENTRY(dtrace_copyin_pan)
cbz x2, 2f /* If len == 0 then skip loop */
1:
mvn x4, xzr /* Set all bits */
@@ -119,13 +119,13 @@
cbnz x2, 1b
2:
RET
-END(dtrace_copy)
+END(dtrace_copyin_pan)
/*
void
-dtrace_copystr(uintptr_t uaddr, uintptr_t kaddr, size_t size)
+dtrace_copyinstr_pan(uintptr_t uaddr, uintptr_t kaddr, size_t size)
*/
-ENTRY(dtrace_copystr)
+ENTRY(dtrace_copyinstr_pan)
cbz x2, 2f /* If len == 0 then skip loop */
1:
mvn x4, xzr /* Set all bits */
@@ -139,7 +139,63 @@
cbnz x2, 1b
2:
RET
-END(dtrace_copystr)
+END(dtrace_copyinstr_pan)
+
+/*
+void
+dtrace_copyout_pan(uintptr_t kaddr, uintptr_t uaddr, size_t size,
+ volatile uint16_t *flags)
+*/
+ENTRY(dtrace_copyout_pan)
+ cbz x2, 4f /* If len == 0 then skip loop */
+ ldrb w4, [x0], #1 /* Load from kaddr */
+ sttrb w4, [x1] /* Store in uaddr or raise data abort */
+ b 2f /* Check fault */
+1:
+ ldrb w4, [x0], #1 /* Load from kaddr */
+ sttrb w4, [x1] /* Store in uaddr or raise data abort */
+ tst x1, #0xfff /* uaddr & 2^12-1 */
+ bne 3f /* If not 4k aligned then skip check */
+2:
+ ldrh w5, [x3] /* Load cpu flags */
+ tst w5, #CPU_DTRACE_BADADDR
+ bne 4f /* If flags&CPU_DTRACE_BADADDR != 0 then break */
+3:
+ add x1, x1, #1 /* uaddr++ */
+ sub x2, x2, #1 /* len-- */
+ cbnz x2, 1b
+4:
+ RET
+END(dtrace_copyout_pan)
+
+
+/*
+void
+dtrace_copyoutstr_pan(uintptr_t kaddr, uintptr_t uaddr, size_t size,
+ volatile uint16_t *flags)
+*/
+ENTRY(dtrace_copyoutstr_pan)
+ cbz x2, 4f /* If len == 0 then skip loop */
+ ldrb w4, [x0], #1 /* Load from kaddr */
+ sttrb w4, [x1] /* Store in uaddr or raise data abort */
+ b 2f /* Check fault */
+1:
+ ldrb w4, [x0], #1 /* Load from kaddr */
+ sttrb w4, [x1] /* Store in uaddr or raise data abort */
+ tst x1, #0xfff /* uaddr & 2^12-1 */
+ bne 3f /* If not 4k aligned then skip check */
+2:
+ ldrh w5, [x3] /* Load cpu flags */
+ tst w5, #CPU_DTRACE_BADADDR
+ bne 4f /* If flags&CPU_DTRACE_BADADDR != 0 then break */
+3:
+ cbz w4, 4f /* If == 0 then break */
+ add x1, x1, #1 /* uaddr++ */
+ sub x2, x2, #1 /* len-- */
+ cbnz x2, 1b
+4:
+ RET
+END(dtrace_copyoutstr_pan)
/*
uintptr_t
diff --git a/sys/cddl/dev/dtrace/aarch64/dtrace_isa.c b/sys/cddl/dev/dtrace/aarch64/dtrace_isa.c
--- a/sys/cddl/dev/dtrace/aarch64/dtrace_isa.c
+++ b/sys/cddl/dev/dtrace/aarch64/dtrace_isa.c
@@ -351,7 +351,7 @@
{
if (dtrace_copycheck(uaddr, kaddr, size))
- dtrace_copy(uaddr, kaddr, size);
+ dtrace_copyin_pan(uaddr, kaddr, size);
}
void
@@ -360,7 +360,7 @@
{
if (dtrace_copycheck(uaddr, kaddr, size))
- dtrace_copy(kaddr, uaddr, size);
+ dtrace_copyout_pan(kaddr, uaddr, size, flags);
}
void
@@ -369,7 +369,7 @@
{
if (dtrace_copycheck(uaddr, kaddr, size))
- dtrace_copystr(uaddr, kaddr, size, flags);
+ dtrace_copyinstr_pan(uaddr, kaddr, size);
}
void
@@ -378,7 +378,7 @@
{
if (dtrace_copycheck(uaddr, kaddr, size))
- dtrace_copystr(kaddr, uaddr, size, flags);
+ dtrace_copyoutstr_pan(kaddr, uaddr, size, flags);
}
uint8_t

File Metadata

Mime Type
text/plain
Expires
Fri, Oct 2, 4:04 AM (3 h, 21 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
39933658
Default Alt Text
D59449.id.diff (4 KB)

Event Timeline