2018-12-09 00:40:25 +01:00
|
|
|
/*******************************************************************************/
|
|
|
|
/* COS2000 - Compatible Operating System - LGPL v3 - Hordé Nicolas */
|
|
|
|
/* */
|
|
|
|
|
|
|
|
#include "types.h"
|
|
|
|
#include "interrupts.h"
|
|
|
|
#include "memory.h"
|
|
|
|
|
|
|
|
#define MAXPIDVALUE 0xFFFF
|
|
|
|
#define MAXNUMPROCESS 256
|
|
|
|
|
|
|
|
#define STATUS_FREE 0x0
|
|
|
|
#define STATUS_ZOMBIE 0xFF
|
|
|
|
#define STATUS_READY 0xF0
|
|
|
|
#define STATUS_RUN 0x1
|
|
|
|
#define STATUS_SLEEP 0x2
|
|
|
|
|
|
|
|
/* ELF type */
|
|
|
|
#define ET_NONE 0 //No file type
|
|
|
|
#define ET_REL 1 //Relocatable file
|
|
|
|
#define ET_EXEC 2 //Executable file
|
|
|
|
#define ET_DYN 3 //Shared object file
|
|
|
|
#define ET_CORE 4 //Core file
|
|
|
|
#define ET_LOOS 0xfe00 //Operating system-specific
|
|
|
|
#define ET_HIOS 0xfeff //Operating system-specific
|
|
|
|
#define ET_LOPROC 0xff00 //Processor-specific
|
|
|
|
#define ET_HIPROC 0xffff //Processor-specific
|
|
|
|
|
|
|
|
/* ELF identification */
|
|
|
|
#define EI_MAG0 0 //File identification
|
|
|
|
#define EI_MAG1 1 //File identification
|
|
|
|
#define EI_MAG2 2 //File identification
|
|
|
|
#define EI_MAG3 3 //File identification
|
|
|
|
#define EI_CLASS 4 //File class
|
|
|
|
#define EI_DATA 5 //Data encoding
|
|
|
|
#define EI_VERSION 6 //File version
|
|
|
|
#define EI_OSABI 7 //Operating system/ABI identification
|
|
|
|
#define EI_ABIVERSION 8 //ABI version
|
|
|
|
#define EI_PAD 9 //Start of padding bytes
|
|
|
|
#define EI_NIDENT 16 //Size of e_ident[]
|
|
|
|
|
|
|
|
/* ELF version */
|
|
|
|
#define EV_NONE 0 //Invalid version
|
|
|
|
#define EV_CURRENT 1 //Current version
|
|
|
|
|
|
|
|
/* ELF machine type */
|
|
|
|
|
|
|
|
#define EM_NONE 0 //No machine
|
|
|
|
#define EM_386 3 //Intel 80386
|
|
|
|
#define EM_IA_64 50 //Intel IA-64 processor architecture
|
|
|
|
#define EM_X86_64 62 //AMD x86-64 architecture
|
|
|
|
|
|
|
|
/* EI signature */
|
|
|
|
#define ELFMAG0 0x7f
|
|
|
|
#define ELFMAG1 'E'
|
|
|
|
#define ELFMAG2 'L'
|
|
|
|
#define ELFMAG3 'F'
|
|
|
|
|
|
|
|
/* EI file class */
|
|
|
|
#define ELFCLASSNONE 0 /* invalid class */
|
|
|
|
#define ELFCLASS32 1 /* 32-bit objects */
|
|
|
|
#define ELFCLASS64 2 /* 64-bit objects */
|
|
|
|
|
|
|
|
/* EI data structure */
|
|
|
|
#define ELFDATANONE 0 /* invalide data encoding */
|
|
|
|
#define ELFDATA2LSB 1 /* least significant byte first (0x01020304 is 0x04 0x03 0x02 0x01) */
|
|
|
|
#define ELFDATA2MSB 2 /* most significant byte first (0x01020304 is 0x01 0x02 0x03 0x04) */
|
|
|
|
|
|
|
|
/* p type */
|
|
|
|
#define PT_NULL 0
|
|
|
|
#define PT_LOAD 1
|
|
|
|
#define PT_DYNAMIC 2
|
|
|
|
#define PT_INTERP 3
|
|
|
|
#define PT_NOTE 4
|
|
|
|
#define PT_SHLIB 5
|
|
|
|
#define PT_PHDR 6
|
|
|
|
#define PT_LOPROC 0x70000000
|
|
|
|
#define PT_HIPROC 0x7fffffff
|
|
|
|
|
|
|
|
/* p flags */
|
|
|
|
#define PF_X 0x1
|
|
|
|
#define PF_W 0x2
|
|
|
|
#define PF_R 0x4
|
|
|
|
|
|
|
|
/* OS identification */
|
|
|
|
#define ELFOSABI_NONE 0 //No extensions or unspecified
|
|
|
|
#define ELFOSABI_LINUX 3 //Linux
|
2018-12-09 13:44:32 +01:00
|
|
|
#define ELFOSABI_COS2000 16 //COS2000
|
2018-12-09 00:40:25 +01:00
|
|
|
|
|
|
|
/* ELF header */
|
|
|
|
typedef struct elf32 {
|
|
|
|
u8 e_ident[EI_NIDENT];
|
|
|
|
u16 e_type;
|
|
|
|
u16 e_machine;
|
|
|
|
u32 e_version;
|
|
|
|
u8* e_entry;
|
|
|
|
u32 e_phoff;
|
|
|
|
u32 e_shoff;
|
|
|
|
u32 e_flags;
|
|
|
|
u16 e_ehsize;
|
|
|
|
u16 e_phentsize;
|
|
|
|
u16 e_phnum;
|
|
|
|
u16 e_shentsize;
|
|
|
|
u16 e_shnum;
|
|
|
|
u16 e_shstrndx;
|
|
|
|
} elf32;
|
|
|
|
|
|
|
|
typedef struct elf32p{
|
|
|
|
u32 p_type;
|
|
|
|
u32 p_offset;
|
|
|
|
u8* p_vaddr;
|
|
|
|
u8* p_paddr;
|
|
|
|
u32 p_filesz;
|
|
|
|
u32 p_memsz;
|
|
|
|
u32 p_flags;
|
|
|
|
u32 p_align;
|
|
|
|
} elf32p;
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct stackdef {
|
|
|
|
u32 esp0;
|
|
|
|
u16 ss0;
|
|
|
|
} stackdef __attribute__ ((packed));
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct process {
|
2018-12-12 10:14:31 +01:00
|
|
|
u32 pid;
|
|
|
|
bool kernel;
|
2018-12-09 00:40:25 +01:00
|
|
|
regs dump;
|
2018-12-12 10:14:31 +01:00
|
|
|
stackdef kstack;
|
2018-12-09 11:11:39 +01:00
|
|
|
pd *pdd;
|
2018-12-09 00:40:25 +01:00
|
|
|
u32 result;
|
|
|
|
u8 status;
|
2018-12-09 11:11:39 +01:00
|
|
|
u8 *exec_low;
|
|
|
|
u8 *exec_high;
|
|
|
|
u8 *bss_low;
|
|
|
|
u8 *bss_high;
|
|
|
|
struct process *parent;
|
2018-12-09 00:40:25 +01:00
|
|
|
page_t page_head;
|
|
|
|
u32 entry;
|
|
|
|
} process __attribute__ ((packed));
|
|
|
|
|
|
|
|
void task_init();
|
|
|
|
u32 task_getfreePID ();
|
|
|
|
u32 task_usePID (u32 pid);
|
2018-12-12 10:14:31 +01:00
|
|
|
u32 task_create(u8 *code,bool kerneltask);
|
2018-12-10 17:03:52 +01:00
|
|
|
u32 elf_test(u8 *src);
|
|
|
|
u32 elf_load(u8 *src, u32 pid);
|
2018-12-10 19:12:20 +01:00
|
|
|
void task_switch(u32 pid, bool fromkernelmode);
|
2018-12-10 17:03:52 +01:00
|
|
|
process *getcurrentprocess();
|
|
|
|
void task_run(u32 pid);
|