summaryrefslogtreecommitdiffstats
path: root/sys/contrib
diff options
context:
space:
mode:
authored <ed@FreeBSD.org>2015-07-16 18:24:06 +0000
committered <ed@FreeBSD.org>2015-07-16 18:24:06 +0000
commite0ca6c5ecbbdd5ade6eea81c075dbda74df27860 (patch)
treefada665f13fac54fc9486651419164b04c219564 /sys/contrib
parent2f5dac4d012df75fe2f54100e90eaf1f50e60cc9 (diff)
downloadFreeBSD-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.h36
-rw-r--r--sys/contrib/cloudabi/syscalldefs_mi.h13
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
OpenPOWER on IntegriCloud