Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F174176238
D59449.id.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
D59449.id.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D59449: dtrace/arm64: Fix copyout and copyoutstr
Attached
Detach File
Event Timeline
Log In to Comment