x86: Rename VPD (XCC)
[akaros.git] / kern / include / elf.h
index d2ac247..ed0515c 100644 (file)
@@ -1,6 +1,6 @@
-#ifndef ROS_INC_ELF_H
-#define ROS_INC_ELF_H
+#pragma once
 
+#include <process.h>
 #include <ros/common.h>
 
 #if defined(LITTLE_ENDIAN)
 #  error I know not my endianness!
 #endif
 
-typedef struct Elf {
+#define ELF_PROT_READ                  0x04
+#define ELF_PROT_WRITE                 0x02
+#define ELF_PROT_EXEC                  0x01
+
+typedef struct Elf32 {
        uint32_t e_magic;       // must equal ELF_MAGIC
-       uint8_t e_elf[12];
+       uint8_t e_ident[12];
        uint16_t e_type;
        uint16_t e_machine;
        uint32_t e_version;
@@ -27,9 +31,9 @@ typedef struct Elf {
        uint16_t e_shentsize;
        uint16_t e_shnum;
        uint16_t e_shstrndx;
-} elf_t;
+} elf32_t;
 
-typedef struct Proghdr {
+typedef struct Proghdr32 {
        uint32_t p_type;
        uint32_t p_offset;
        uint32_t p_va;
@@ -38,9 +42,9 @@ typedef struct Proghdr {
        uint32_t p_memsz;
        uint32_t p_flags;
        uint32_t p_align;
-} proghdr_t;
+} proghdr32_t;
 
-typedef struct Secthdr {
+typedef struct Secthdr32 {
        uint32_t sh_name;
        uint32_t sh_type;
        uint32_t sh_flags;
@@ -51,10 +55,72 @@ typedef struct Secthdr {
        uint32_t sh_info;
        uint32_t sh_addralign;
        uint32_t sh_entsize;
-} secthdr_t;
+} secthdr32_t;
+
+typedef struct Elf64 {
+       uint32_t e_magic;       // must equal ELF_MAGIC
+       uint8_t e_ident[12];
+       uint16_t e_type;
+       uint16_t e_machine;
+       uint32_t e_version;
+       uint64_t e_entry;
+       uint64_t e_phoff;
+       uint64_t e_shoff;
+       uint32_t e_flags;
+       uint16_t e_ehsize;
+       uint16_t e_phentsize;
+       uint16_t e_phnum;
+       uint16_t e_shentsize;
+       uint16_t e_shnum;
+       uint16_t e_shstrndx;
+} elf64_t;
+
+typedef struct Proghdr64 {
+       uint32_t p_type;
+       uint32_t p_flags;
+       uint64_t p_offset;
+       uint64_t p_va;
+       uint64_t p_pa;
+       uint64_t p_filesz;
+       uint64_t p_memsz;
+       uint64_t p_align;
+} proghdr64_t;
+
+typedef struct Secthdr64 {
+       uint32_t sh_name;
+       uint32_t sh_type;
+       uint64_t sh_flags;
+       uint64_t sh_addr;
+       uint64_t sh_offset;
+       uint64_t sh_size;
+       uint32_t sh_link;
+       uint32_t sh_info;
+       uint64_t sh_addralign;
+       uint64_t sh_entsize;
+} secthdr64_t;
+
+typedef struct
+{
+       long entry;
+       long highest_addr;
+       long phdr;
+       int phnum;
+       int dynamic;
+       bool elf64;
+       char interp[256];
+} elf_info_t;
+
+typedef long elf_aux_t[2];
+
+#define ELF_IDENT_CLASS 0
+// Values for Elf::e_ident[ELF_IDENT_CLASS]
+#define ELFCLASS32 1
+#define ELFCLASS64 2
 
 // Values for Proghdr::p_type
 #define ELF_PROG_LOAD          1
+#define ELF_PROG_INTERP                3
+#define ELF_PROG_PHDR          6
 
 // Flag bits for Proghdr::p_flags
 #define ELF_PROG_FLAG_EXEC     1
@@ -70,4 +136,20 @@ typedef struct Secthdr {
 // Values for Secthdr::sh_name
 #define ELF_SHN_UNDEF          0
 
-#endif /* !ROS_INC_ELF_H */
+// Values for auxiliary fields
+#define ELF_AUX_PHDR           3
+#define ELF_AUX_PHENT          4
+#define ELF_AUX_PHNUM          5
+#define ELF_AUX_ENTRY          9
+#define ELF_AUX_HWCAP          16
+
+// Hardware capabilities (for use with ELF_AUX_HWCAP)
+#define ELF_HWCAP_SPARC_FLUSH  1
+
+struct file;
+bool is_valid_elf(struct file *f);
+int load_elf(struct proc* p, struct file* f,
+             int argc, char *argv[], int envc, char *envp[]);
+ssize_t get_startup_argc(struct proc *p);
+char *get_startup_argv(struct proc *p, size_t idx, char *argp,
+                                          size_t max_size);