summaryrefslogtreecommitdiffstats
path: root/sys/ia64
diff options
context:
space:
mode:
authormarcel <marcel@FreeBSD.org>2004-08-07 21:55:15 +0000
committermarcel <marcel@FreeBSD.org>2004-08-07 21:55:15 +0000
commit54116ac22718c8b552a600672354ddd3934d2c18 (patch)
treefe0e9be9aca8bd6c632e12a3d6b368ba96f6fa7e /sys/ia64
parentf8baecdedd3fc12a64417d161cc4e42ab9df4771 (diff)
downloadFreeBSD-src-54116ac22718c8b552a600672354ddd3934d2c18.zip
FreeBSD-src-54116ac22718c8b552a600672354ddd3934d2c18.tar.gz
Slightly move labels around to make sure we call ast() on our way out
after a fork(2) in fork_trampoline(). By moving the epc_syscall_return label immediately before the call to do_ast() in epc_syscall(), we not only achieve that but also handle the detour through exception_return when the frame corresponds to an asynchronous kernel entry. Hence, we simplified fork_trampoline() as a side-effect.
Diffstat (limited to 'sys/ia64')
-rw-r--r--sys/ia64/ia64/locore.S13
-rw-r--r--sys/ia64/ia64/syscall.S5
2 files changed, 5 insertions, 13 deletions
diff --git a/sys/ia64/ia64/locore.S b/sys/ia64/ia64/locore.S
index fc83d0c..ef2ad9c 100644
--- a/sys/ia64/ia64/locore.S
+++ b/sys/ia64/ia64/locore.S
@@ -136,17 +136,10 @@ ENTRY(fork_trampoline, 0)
.global enter_userland
.type enter_userland, @function
enter_userland:
-{ .mmi
- add r14=24,sp
- ;;
- ld8 r14=[r14]
+{ .mfb
nop 0
- ;;
-}
-{ .mbb
- cmp.eq p6,p7=r0,r14
-(p6) br.sptk exception_restore
-(p7) br.sptk epc_syscall_return
+ nop 0
+ br.sptk epc_syscall_return
;;
}
END(fork_trampoline)
diff --git a/sys/ia64/ia64/syscall.S b/sys/ia64/ia64/syscall.S
index b009b86..0c0ef5e 100644
--- a/sys/ia64/ia64/syscall.S
+++ b/sys/ia64/ia64/syscall.S
@@ -378,6 +378,8 @@ ENTRY(epc_syscall, 8)
br.call.sptk rp=syscall
;;
}
+ .global epc_syscall_return
+epc_syscall_return:
{ .mfb
add out0=16,sp
nop 0
@@ -402,9 +404,6 @@ ENTRY(epc_syscall, 8)
(p15) br.spnt exception_restore
;;
}
-
- .global epc_syscall_return
-epc_syscall_return:
{ .mmi
alloc r31=ar.pfs,0,0,0,0
add r14=32,sp
OpenPOWER on IntegriCloud