Page MenuHomeFreeBSD

D26378.diff
No OneTemporary

D26378.diff

Index: head/sys/amd64/amd64/vm_machdep.c
===================================================================
--- head/sys/amd64/amd64/vm_machdep.c
+++ head/sys/amd64/amd64/vm_machdep.c
@@ -543,7 +543,7 @@
break;
default:
- frame->tf_rax = SV_ABI_ERRNO(td->td_proc, error);
+ frame->tf_rax = error;
frame->tf_rflags |= PSL_C;
break;
}
Index: head/sys/amd64/linux/linux_sysvec.c
===================================================================
--- head/sys/amd64/linux/linux_sysvec.c
+++ head/sys/amd64/linux/linux_sysvec.c
@@ -219,6 +219,11 @@
cpu_set_syscall_retval(td, error);
+ if (__predict_false(error != 0)) {
+ if (error != ERESTART && error != EJUSTRETURN)
+ frame->tf_rax = SV_ABI_ERRNO(td->td_proc, error);
+ }
+
/* Restore all registers. */
set_pcb_flags(td->td_pcb, PCB_FULL_IRET);
}
Index: head/sys/amd64/linux32/linux32_sysvec.c
===================================================================
--- head/sys/amd64/linux32/linux32_sysvec.c
+++ head/sys/amd64/linux32/linux32_sysvec.c
@@ -112,6 +112,7 @@
static bool linux32_trans_osrel(const Elf_Note *note, int32_t *osrel);
static void linux_vdso_install(void *param);
static void linux_vdso_deinstall(void *param);
+static void linux32_set_syscall_retval(struct thread *td, int error);
#define LINUX_T_UNKNOWN 255
static int _bsd_to_linux_trapcode[] = {
@@ -669,6 +670,19 @@
return (0);
}
+static void
+linux32_set_syscall_retval(struct thread *td, int error)
+{
+ struct trapframe *frame = td->td_frame;
+
+ cpu_set_syscall_retval(td, error);
+
+ if (__predict_false(error != 0)) {
+ if (error != ERESTART && error != EJUSTRETURN)
+ frame->tf_rax = SV_ABI_ERRNO(td->td_proc, error);
+ }
+}
+
/*
* Clear registers on exec
* XXX copied from ia32_signal.c.
@@ -906,7 +920,7 @@
.sv_fixlimit = linux32_fixlimit,
.sv_maxssiz = &linux32_maxssiz,
.sv_flags = SV_ABI_LINUX | SV_ILP32 | SV_IA32 | SV_SHP,
- .sv_set_syscall_retval = cpu_set_syscall_retval,
+ .sv_set_syscall_retval = linux32_set_syscall_retval,
.sv_fetch_syscall_args = linux32_fetch_syscall_args,
.sv_syscallnames = NULL,
.sv_shared_page_base = LINUX32_SHAREDPAGE,
Index: head/sys/arm/arm/vm_machdep.c
===================================================================
--- head/sys/arm/arm/vm_machdep.c
+++ head/sys/arm/arm/vm_machdep.c
@@ -219,7 +219,7 @@
/* nothing to do */
break;
default:
- frame->tf_r0 = SV_ABI_ERRNO(td->td_proc, error);
+ frame->tf_r0 = error;
frame->tf_spsr |= PSR_C; /* carry bit */
break;
}
Index: head/sys/arm64/arm64/vm_machdep.c
===================================================================
--- head/sys/arm64/arm64/vm_machdep.c
+++ head/sys/arm64/arm64/vm_machdep.c
@@ -153,7 +153,7 @@
break;
default:
frame->tf_spsr |= PSR_C; /* carry bit */
- frame->tf_x[0] = SV_ABI_ERRNO(td->td_proc, error);
+ frame->tf_x[0] = error;
break;
}
}
Index: head/sys/arm64/linux/linux_sysvec.c
===================================================================
--- head/sys/arm64/linux/linux_sysvec.c
+++ head/sys/arm64/linux/linux_sysvec.c
@@ -141,6 +141,13 @@
td->td_retval[1] = td->td_frame->tf_x[1];
cpu_set_syscall_retval(td, error);
+
+ if (__predict_false(error != 0)) {
+ if (error != ERESTART && error != EJUSTRETURN) {
+ td->td_frame->tf_x[0] =
+ SV_ABI_ERRNO(td->td_proc, error);
+ }
+ }
}
static int
Index: head/sys/i386/i386/vm_machdep.c
===================================================================
--- head/sys/i386/i386/vm_machdep.c
+++ head/sys/i386/i386/vm_machdep.c
@@ -407,7 +407,7 @@
break;
default:
- td->td_frame->tf_eax = SV_ABI_ERRNO(td->td_proc, error);
+ td->td_frame->tf_eax = error;
td->td_frame->tf_eflags |= PSL_C;
break;
}
Index: head/sys/i386/linux/linux_sysvec.c
===================================================================
--- head/sys/i386/linux/linux_sysvec.c
+++ head/sys/i386/linux/linux_sysvec.c
@@ -792,6 +792,19 @@
return (0);
}
+static void
+linux_set_syscall_retval(struct thread *td, int error)
+{
+ struct trapframe *frame = td->td_frame;
+
+ cpu_set_syscall_retval(td, error);
+
+ if (__predict_false(error != 0)) {
+ if (error != ERESTART && error != EJUSTRETURN)
+ frame->tf_eax = SV_ABI_ERRNO(td->td_proc, error);
+ }
+}
+
/*
* exec_setregs may initialize some registers differently than Linux
* does, thus potentially confusing Linux binaries. If necessary, we
@@ -855,7 +868,7 @@
.sv_fixlimit = NULL,
.sv_maxssiz = NULL,
.sv_flags = SV_ABI_LINUX | SV_AOUT | SV_IA32 | SV_ILP32,
- .sv_set_syscall_retval = cpu_set_syscall_retval,
+ .sv_set_syscall_retval = linux_set_syscall_retval,
.sv_fetch_syscall_args = linux_fetch_syscall_args,
.sv_syscallnames = NULL,
.sv_shared_page_base = LINUX_SHAREDPAGE,
@@ -891,7 +904,7 @@
.sv_fixlimit = NULL,
.sv_maxssiz = NULL,
.sv_flags = SV_ABI_LINUX | SV_IA32 | SV_ILP32 | SV_SHP,
- .sv_set_syscall_retval = cpu_set_syscall_retval,
+ .sv_set_syscall_retval = linux_set_syscall_retval,
.sv_fetch_syscall_args = linux_fetch_syscall_args,
.sv_syscallnames = NULL,
.sv_shared_page_base = LINUX_SHAREDPAGE,
Index: head/sys/powerpc/powerpc/exec_machdep.c
===================================================================
--- head/sys/powerpc/powerpc/exec_machdep.c
+++ head/sys/powerpc/powerpc/exec_machdep.c
@@ -955,7 +955,7 @@
tf->srr0 -= 4;
break;
default:
- tf->fixreg[FIRSTARG] = SV_ABI_ERRNO(p, error);
+ tf->fixreg[FIRSTARG] = error;
tf->cr |= 0x10000000; /* Set summary overflow */
break;
}

File Metadata

Mime Type
text/plain
Expires
Wed, Apr 1, 8:38 PM (1 h, 5 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
30688298
Default Alt Text
D26378.diff (5 KB)

Event Timeline