diff options
Diffstat (limited to 'sys/arm64/cloudabi64/cloudabi64_sysvec.c')
-rw-r--r-- | sys/arm64/cloudabi64/cloudabi64_sysvec.c | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/sys/arm64/cloudabi64/cloudabi64_sysvec.c b/sys/arm64/cloudabi64/cloudabi64_sysvec.c index a26007a..fd13db8 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, |