Page MenuHomeFreeBSD

D3917.id9604.diff
No OneTemporary

D3917.id9604.diff

Index: share/man/man4/cloudabi.4
===================================================================
--- share/man/man4/cloudabi.4
+++ share/man/man4/cloudabi.4
@@ -22,7 +22,7 @@
.\" SUCH DAMAGE.
.\"
.\" $FreeBSD$
-.Dd July 31, 2015
+.Dd October 15, 2015
.Dt CLOUDABI 4
.Os
.Sh NAME
@@ -73,7 +73,7 @@
.Fx ,
the
.Nm cloudabi64
-module is only available for amd64.
+module is only available for amd64 and arm64.
.Pp
A full cross compilation toolchain for CloudABI is available in the
.Pa devel/cloudabi-toolchain
@@ -95,6 +95,9 @@
.Pp
cloudlibc on GitHub:
.Pa https://github.com/NuxiNL/cloudlibc .
+.Pp
+The CloudABI Ports Collection on GitHub:
+.Pa https://github.com/NuxiNL/cloudabi-ports .
.Sh HISTORY
CloudABI support first appeared in
.Fx 11.0 .
Index: sys/arm64/cloudabi64/cloudabi64_sysvec.c
===================================================================
--- sys/arm64/cloudabi64/cloudabi64_sysvec.c
+++ sys/arm64/cloudabi64/cloudabi64_sysvec.c
@@ -24,7 +24,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: head/sys/amd64/cloudabi64/cloudabi64_sysvec.c 289747 2015-10-22 09:07:53Z ed $");
+__FBSDID("$FreeBSD: 286924 2015-08-19 15:18:32Z bapt $");
#include <sys/param.h>
#include <sys/kernel.h>
@@ -51,24 +51,21 @@
cloudabi64_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
{
struct trapframe *frame = td->td_frame;
+ int i;
/* Obtain system call number. */
- sa->code = frame->tf_rax;
+ sa->code = frame->tf_x[8];
if (sa->code >= CLOUDABI64_SYS_MAXSYSCALL)
return (ENOSYS);
sa->callp = &cloudabi64_sysent[sa->code];
/* Fetch system call arguments. */
- sa->args[0] = frame->tf_rdi;
- sa->args[1] = frame->tf_rsi;
- sa->args[2] = frame->tf_rdx;
- sa->args[3] = frame->tf_rcx; /* Actually %r10. */
- sa->args[4] = frame->tf_r8;
- sa->args[5] = frame->tf_r9;
+ for (i = 0; i < MAXARGS; i++)
+ sa->args[i] = frame->tf_x[i];
/* Default system call return values. */
td->td_retval[0] = 0;
- td->td_retval[1] = frame->tf_rdx;
+ td->td_retval[1] = 0;
return (0);
}
@@ -80,22 +77,20 @@
switch (error) {
case 0:
/* System call succeeded. */
- frame->tf_rax = td->td_retval[0];
- frame->tf_rdx = td->td_retval[1];
- frame->tf_rflags &= ~PSL_C;
+ frame->tf_x[0] = td->td_retval[0];
+ frame->tf_x[1] = td->td_retval[1];
+ frame->tf_spsr &= ~PSR_C;
break;
case ERESTART:
/* Restart system call. */
- frame->tf_rip -= frame->tf_err;
- frame->tf_r10 = frame->tf_rcx;
- set_pcb_flags(td->td_pcb, PCB_FULL_IRET);
+ frame->tf_elr -= 4;
break;
case EJUSTRETURN:
break;
default:
/* System call returned an error. */
- frame->tf_rax = cloudabi_convert_errno(error);
- frame->tf_rflags |= PSL_C;
+ frame->tf_x[0] = cloudabi_convert_errno(error);
+ frame->tf_spsr |= PSR_C;
break;
}
}
@@ -105,9 +100,15 @@
{
struct trapframe *frame = td->td_frame;
- /* Initial register values for processes returning from fork. */
- frame->tf_rax = CLOUDABI_PROCESS_CHILD;
- frame->tf_rdx = td->td_tid;
+ /*
+ * Initial register values for processes returning from fork.
+ * Make sure that we only set these values when forking, not
+ * when creating a new thread.
+ */
+ if ((td->td_pflags & TDP_FORKING) != 0) {
+ frame->tf_x[0] = CLOUDABI_PROCESS_CHILD;
+ frame->tf_x[1] = td->td_tid;
+ }
}
void
@@ -128,8 +129,8 @@
* entry point.
*/
frame = td->td_frame;
- frame->tf_rdi = td->td_tid;
- frame->tf_rsi = attr->argument;
+ frame->tf_x[0] = td->td_tid;
+ frame->tf_x[1] = attr->argument;
}
static struct sysentvec cloudabi64_elf_sysvec = {
@@ -155,7 +156,7 @@
Elf64_Brandinfo cloudabi64_brand = {
.brand = ELFOSABI_CLOUDABI,
- .machine = EM_X86_64,
+ .machine = EM_AARCH64,
.sysvec = &cloudabi64_elf_sysvec,
.compat_3_brand = "CloudABI",
};
Index: sys/conf/files.arm64
===================================================================
--- sys/conf/files.arm64
+++ sys/conf/files.arm64
@@ -53,6 +53,7 @@
arm64/cavium/thunder_pcie.c optional soc_cavm_thunderx pci fdt
arm64/cavium/thunder_pcie_pem.c optional soc_cavm_thunderx pci
arm64/cavium/thunder_pcie_common.c optional soc_cavm_thunderx pci
+arm64/cloudabi64/cloudabi64_sysvec.c optional compat_cloudabi64
crypto/blowfish/bf_enc.c optional crypto | ipsec
crypto/des/des_enc.c optional crypto | ipsec | netsmb
dev/acpica/acpi_if.m optional acpi
Index: sys/kern/kern_fork.c
===================================================================
--- sys/kern/kern_fork.c
+++ sys/kern/kern_fork.c
@@ -586,7 +586,7 @@
* been preserved.
*/
p2->p_flag |= p1->p_flag & P_SUGID;
- td2->td_pflags |= td->td_pflags & TDP_ALTSTACK;
+ td2->td_pflags |= (td->td_pflags & TDP_ALTSTACK) | TDP_FORKING;
SESS_LOCK(p1->p_session);
if (p1->p_session->s_ttyvp != NULL && p1->p_flag & P_CONTROLT)
p2->p_flag |= P_CONTROLT;
@@ -1023,6 +1023,7 @@
if (p->p_sysent->sv_schedtail != NULL)
(p->p_sysent->sv_schedtail)(td);
+ td->td_pflags &= ~TDP_FORKING;
}
/*
Index: sys/kern/subr_syscall.c
===================================================================
--- sys/kern/subr_syscall.c
+++ sys/kern/subr_syscall.c
@@ -176,6 +176,9 @@
struct proc *p, *p2;
int traced;
+ KASSERT((td->td_pflags & TDP_FORKING) == 0,
+ ("fork() did not clear TDP_FORKING upon completion"));
+
p = td->td_proc;
/*
Index: sys/modules/Makefile
===================================================================
--- sys/modules/Makefile
+++ sys/modules/Makefile
@@ -633,7 +633,6 @@
.endif
.if ${MACHINE_CPUARCH} == "amd64"
-_cloudabi64= cloudabi64
_ioat= ioat
_ixl= ixl
_ixlv= ixlv
@@ -749,6 +748,10 @@
.endif
.endif
+.if ${MACHINE_CPUARCH} == "aarch64" || ${MACHINE_CPUARCH} == "amd64"
+_cloudabi64= cloudabi64
+.endif
+
.endif
SUBDIR+=${MODULES_EXTRA}
Index: sys/sys/proc.h
===================================================================
--- sys/sys/proc.h
+++ sys/sys/proc.h
@@ -446,7 +446,7 @@
#define TDP_RESETSPUR 0x04000000 /* Reset spurious page fault history. */
#define TDP_NERRNO 0x08000000 /* Last errno is already in td_errno */
#define TDP_UIOHELD 0x10000000 /* Current uio has pages held in td_ma */
-#define TDP_UNUSED29 0x20000000 /* --available-- */
+#define TDP_FORKING 0x20000000 /* Thread is being created through fork() */
#define TDP_EXECVMSPC 0x40000000 /* Execve destroyed old vmspace */
/*

File Metadata

Mime Type
text/plain
Expires
Fri, Feb 28, 6:36 PM (12 h, 18 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
16889356
Default Alt Text
D3917.id9604.diff (6 KB)

Event Timeline