aboutsummaryrefslogtreecommitdiff
path: root/sys/arm64/cloudabi64/cloudabi64_sysvec.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/arm64/cloudabi64/cloudabi64_sysvec.c')
-rw-r--r--sys/arm64/cloudabi64/cloudabi64_sysvec.c28
1 files changed, 26 insertions, 2 deletions
diff --git a/sys/arm64/cloudabi64/cloudabi64_sysvec.c b/sys/arm64/cloudabi64/cloudabi64_sysvec.c
index a26007a254c4..fd13db89ce76 100644
--- a/sys/arm64/cloudabi64/cloudabi64_sysvec.c
+++ b/sys/arm64/cloudabi64/cloudabi64_sysvec.c
@@ -27,6 +27,7 @@
__FBSDID("$FreeBSD$");
#include <sys/param.h>
+#include <sys/imgact.h>
#include <sys/kernel.h>
#include <sys/proc.h>
#include <sys/sysent.h>
@@ -46,6 +47,25 @@ __FBSDID("$FreeBSD$");
extern const char *cloudabi64_syscallnames[];
extern struct sysent cloudabi64_sysent[];
+static void
+cloudabi64_proc_setregs(struct thread *td, struct image_params *imgp,
+ unsigned long stack)
+{
+ struct trapframe *regs;
+
+ exec_setregs(td, imgp, stack);
+
+ /*
+ * The stack now contains a pointer to the TCB and the auxiliary
+ * vector. Let x0 point to the auxiliary vector, and set
+ * tpidr_el0 to the TCB.
+ */
+ regs = td->td_frame;
+ regs->tf_x[0] = td->td_retval[0] =
+ stack + roundup(sizeof(cloudabi64_tcb_t), sizeof(register_t));
+ (void)cpu_set_user_tls(td, (void *)stack);
+}
+
static int
cloudabi64_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
{
@@ -110,9 +130,9 @@ cloudabi64_schedtail(struct thread *td)
}
}
-void
+int
cloudabi64_thread_setregs(struct thread *td,
- const cloudabi64_threadattr_t *attr)
+ const cloudabi64_threadattr_t *attr, uint64_t tcb)
{
struct trapframe *frame;
stack_t stack;
@@ -130,6 +150,9 @@ cloudabi64_thread_setregs(struct thread *td,
frame = td->td_frame;
frame->tf_x[0] = td->td_tid;
frame->tf_x[1] = attr->argument;
+
+ /* Set up TLS. */
+ return (cpu_set_user_tls(td, (void *)tcb));
}
static struct sysentvec cloudabi64_elf_sysvec = {
@@ -144,6 +167,7 @@ static struct sysentvec cloudabi64_elf_sysvec = {
.sv_usrstack = USRSTACK,
.sv_stackprot = VM_PROT_READ | VM_PROT_WRITE,
.sv_copyout_strings = cloudabi64_copyout_strings,
+ .sv_setregs = cloudabi64_proc_setregs,
.sv_flags = SV_ABI_CLOUDABI | SV_CAPSICUM | SV_LP64,
.sv_set_syscall_retval = cloudabi64_set_syscall_retval,
.sv_fetch_syscall_args = cloudabi64_fetch_syscall_args,