From: Tormod Volden Date: Sun, 17 May 2015 16:38:34 +0000 (+0200) Subject: lowlevel-6809: Do not clobber CC on syscall SWI exit X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=ad2737755ec6e37e3f060eced77b44b7254bb4a1;p=FUZIX.git lowlevel-6809: Do not clobber CC on syscall SWI exit In particular the interrupt masks were overwritten and in some cases interrupts were disabled after returning from a syscall. Rewrite the SWI interface to only report error through D and X. Signed-off-by: Tormod Volden --- diff --git a/Kernel/lowlevel-6809.s b/Kernel/lowlevel-6809.s index 899b20d8..a4d8ace5 100644 --- a/Kernel/lowlevel-6809.s +++ b/Kernel/lowlevel-6809.s @@ -140,14 +140,11 @@ unix_syscall_entry: not_error: ; no error to signal! return syscall return value instead of error code ldx U_DATA__U_RETVAL - ldd #0 ; just for setting Z flag unix_return: ; we never make a syscall from in kernel space SAM_USER stx 4,s ; replace stacked values before rti std 1,s - tfr cc,a ; Z determined by D - sta ,s ; replace stacked CC to signal error rti ; diff --git a/Library/libs/fuzix6809/syscall6809.s b/Library/libs/fuzix6809/syscall6809.s index 0f284d37..55100424 100644 --- a/Library/libs/fuzix6809/syscall6809.s +++ b/Library/libs/fuzix6809/syscall6809.s @@ -6,19 +6,20 @@ __syscall: swi - bne error - rts -error: - std _errno ; X is -1 + cmpd #0 ; D holds errno, if any + beq @noerr + std _errno ; X is -1 in this case +@noerr: rts ; for variadic functions: ; compensate for the 1st argument that we removed __syscall_mangled: swi - beq noerr - std _errno -noerr: + cmpd #0 + beq @noerr + std _errno +@noerr: puls d ; get return address - pshs d,x ; inject a word on stack + pshs d,x ; inject a word on stack, e.g. X rts