# HG changeset patch # User Paul Boddie # Date 1652194221 -7200 # Node ID 6589577799e69a7b82420db0166b5e61dfe3d965 # Parent 73ba6235bd59e119acfa8e153938b0062c8c582a Added ELF payload decoding to obtain the entry point. diff -r 73ba6235bd59 -r 6589577799e6 tests/dstest_exec.cc --- a/tests/dstest_exec.cc Mon May 09 01:00:51 2022 +0200 +++ b/tests/dstest_exec.cc Tue May 10 16:50:21 2022 +0200 @@ -884,6 +884,51 @@ +class PayloadBase +{ +public: + virtual l4_addr_t entry_point() = 0; + virtual offset_t header_size() = 0; +}; + +template +class Payload : public PayloadBase +{ +protected: + HEADER *_header; + +public: + explicit Payload(HEADER *header) + : _header(header) + { + } + + l4_addr_t entry_point() + { + return _header->e_entry; + } + + offset_t header_size() + { + return sizeof(HEADER); + } +}; + +static PayloadBase *get_payload(char *buf) +{ + switch (buf[EI_CLASS]) + { + case (char) 1: + return new Payload((Elf32_Ehdr *) buf); + case (char) 2: + return new Payload((Elf64_Ehdr *) buf); + default: + return NULL; + } +} + + + static ExecPager exec_pager; static void init_pager(ipc_server_config_type *config) @@ -926,10 +971,41 @@ return 1; } + /* Obtain metadata from the file. */ + + char buf[4096]; + offset_t nread; + + nread = client_read(file, buf, EI_NIDENT); + if ((nread < EI_NIDENT) || memcmp(buf, "\x7f" "ELF", 4)) + { + printf("Not an ELF payload: %s\n", argv[1]); + return 1; + } + + PayloadBase *payload = get_payload(buf); + + if (payload == NULL) + { + printf("Unrecognised object size.\n"); + return 1; + } + + client_seek(file, 0, SEEK_SET); + nread = client_read(file, buf, payload->header_size()); + + if (nread < payload->header_size()) + { + printf("Header incomplete.\n"); + return 1; + } + + printf("Program start: %lx\n", payload->entry_point()); + /* Copy the payload regions to new dataspaces. NOTE: This should be directed by the ELF metadata. */ - address_t program_start = 0x1000b43; + address_t program_start = payload->entry_point(); offset_t initial_stack_size = 16 * L4_PAGESIZE; Segment program(0x1000000, 0x28326, L4_FPAGE_RWX, 0, 0x28326);