diff options
author | ed <ed@FreeBSD.org> | 2015-07-16 18:24:06 +0000 |
---|---|---|
committer | ed <ed@FreeBSD.org> | 2015-07-16 18:24:06 +0000 |
commit | e0ca6c5ecbbdd5ade6eea81c075dbda74df27860 (patch) | |
tree | fada665f13fac54fc9486651419164b04c219564 /sys/contrib | |
parent | 2f5dac4d012df75fe2f54100e90eaf1f50e60cc9 (diff) | |
download | FreeBSD-src-e0ca6c5ecbbdd5ade6eea81c075dbda74df27860.zip FreeBSD-src-e0ca6c5ecbbdd5ade6eea81c075dbda74df27860.tar.gz |
Add a sysentvec for CloudABI on x86-64.
Summary:
For CloudABI we need to put two things on the stack of new processes:
the argument data (a binary blob; not strings) and a startup data
structure. The startup data structure contains interesting things such
as a pointer to the ELF program header, the thread ID of the initial
thread, a stack smashing protection canary, and a pointer to the
argument data.
Fetching system call arguments and setting the return value is similar
to FreeBSD. The only differences are that system call 0 does not exist
and that we call into cloudabi_convert_errno() to convert the error
code. We also need this function in a couple of other places, so we'd
better reuse it here.
Reviewers: dchagin, kib
Reviewed By: kib
Subscribers: imp
Differential Revision: https://reviews.freebsd.org/D3098
Diffstat (limited to 'sys/contrib')
-rw-r--r-- | sys/contrib/cloudabi/syscalldefs_md.h | 36 | ||||
-rw-r--r-- | sys/contrib/cloudabi/syscalldefs_mi.h | 13 |
2 files changed, 26 insertions, 23 deletions
diff --git a/sys/contrib/cloudabi/syscalldefs_md.h b/sys/contrib/cloudabi/syscalldefs_md.h index 95dd129..6fc26f1 100644 --- a/sys/contrib/cloudabi/syscalldefs_md.h +++ b/sys/contrib/cloudabi/syscalldefs_md.h @@ -43,6 +43,19 @@ typedef void IDENT(threadentry_t)(cloudabi_tid_t, PTR(void)); +// Auxiliary vector entry, used to provide paramters on startup. +typedef struct { + uint32_t a_type; + union { + MEMBER(IDENT(size_t)) a_val; + MEMBER(PTR(void)) a_ptr; + }; +} IDENT(auxv_t); +ASSERT_OFFSET(auxv_t, a_type, 0, 0); +ASSERT_OFFSET(auxv_t, a_val, 4, 8); +ASSERT_OFFSET(auxv_t, a_ptr, 4, 8); +ASSERT_SIZE(auxv_t, 8, 16); + typedef struct { MEMBER(PTR(const void)) iov_base; MEMBER(IDENT(size_t)) iov_len; @@ -162,29 +175,6 @@ ASSERT_OFFSET(send_out_t, so_datalen, 0, 0); ASSERT_SIZE(send_out_t, 4, 8); typedef struct { - MEMBER(PTR(const void)) sd_arg; // Program argument data. - MEMBER(IDENT(size_t)) sd_arglen; // Program argument data size. - - MEMBER(PTR(void)) sd_elf_phdr; // ELF program header. - MEMBER(IDENT(size_t)) sd_elf_phdrlen; // ELF program header length. - - MEMBER(cloudabi_tid_t) sd_thread_id; // Thread ID. - MEMBER(uint64_t) sd_random_seed; // Random seed, used for SSP. - - MEMBER(uint32_t) sd_ncpus; // Number of CPUs. - MEMBER(uint32_t) sd_pagesize; // Page size. -} IDENT(startup_data_t); -ASSERT_OFFSET(startup_data_t, sd_arg, 0, 0); -ASSERT_OFFSET(startup_data_t, sd_arglen, 4, 8); -ASSERT_OFFSET(startup_data_t, sd_elf_phdr, 8, 16); -ASSERT_OFFSET(startup_data_t, sd_elf_phdrlen, 12, 24); -ASSERT_OFFSET(startup_data_t, sd_thread_id, 16, 32); -ASSERT_OFFSET(startup_data_t, sd_random_seed, 24, 40); -ASSERT_OFFSET(startup_data_t, sd_ncpus, 32, 48); -ASSERT_OFFSET(startup_data_t, sd_pagesize, 36, 52); -ASSERT_SIZE(startup_data_t, 40, 56); - -typedef struct { MEMBER(cloudabi_userdata_t) userdata; MEMBER(uint16_t) flags; MEMBER(cloudabi_eventtype_t) type; diff --git a/sys/contrib/cloudabi/syscalldefs_mi.h b/sys/contrib/cloudabi/syscalldefs_mi.h index 75d79f4..810c0f2 100644 --- a/sys/contrib/cloudabi/syscalldefs_mi.h +++ b/sys/contrib/cloudabi/syscalldefs_mi.h @@ -40,6 +40,19 @@ #define CLOUDABI_ADVICE_SEQUENTIAL 5 #define CLOUDABI_ADVICE_WILLNEED 6 +// Auxiliary vector entries. All entries that are also part of the +// x86-64 ABI use the same number. All extensions start at 256. +#define CLOUDABI_AT_ARGDATA 256 +#define CLOUDABI_AT_ARGDATALEN 257 +#define CLOUDABI_AT_CANARY 258 +#define CLOUDABI_AT_CANARYLEN 259 +#define CLOUDABI_AT_NCPUS 260 +#define CLOUDABI_AT_NULL 0 +#define CLOUDABI_AT_PAGESZ 6 +#define CLOUDABI_AT_PHDR 3 +#define CLOUDABI_AT_PHNUM 4 +#define CLOUDABI_AT_TID 261 + // Clocks. #define CLOUDABI_CLOCK_MONOTONIC 1 #define CLOUDABI_CLOCK_PROCESS_CPUTIME_ID 2 |