diff options
Diffstat (limited to 'kernel/include/arch')
| -rw-r--r-- | kernel/include/arch/x86_64/cpu/data.hpp | 51 | ||||
| -rw-r--r-- | kernel/include/arch/x86_64/cpu/gdt.hpp | 79 | ||||
| -rw-r--r-- | kernel/include/arch/x86_64/cpu/lapic.hpp | 68 | ||||
| -rw-r--r-- | kernel/include/arch/x86_64/cpu/smp.hpp | 14 | ||||
| -rw-r--r-- | kernel/include/arch/x86_64/cpu/sse.hpp | 37 | ||||
| -rw-r--r-- | kernel/include/arch/x86_64/interrupts/idt.hpp | 63 | ||||
| -rw-r--r-- | kernel/include/arch/x86_64/interrupts/irq.hpp | 28 | ||||
| -rw-r--r-- | kernel/include/arch/x86_64/interrupts/pic.hpp | 107 | ||||
| -rw-r--r-- | kernel/include/arch/x86_64/interrupts/pit.hpp | 18 | ||||
| -rw-r--r-- | kernel/include/arch/x86_64/scheduling.hpp | 460 | ||||
| -rw-r--r-- | kernel/include/arch/x86_64/syscalls/futex.hpp | 1 | ||||
| -rw-r--r-- | kernel/include/arch/x86_64/syscalls/shm.hpp | 42 | ||||
| -rw-r--r-- | kernel/include/arch/x86_64/syscalls/signal.hpp | 288 | ||||
| -rw-r--r-- | kernel/include/arch/x86_64/syscalls/sockets.hpp | 156 | ||||
| -rw-r--r-- | kernel/include/arch/x86_64/syscalls/syscalls.hpp | 539 |
15 files changed, 0 insertions, 1951 deletions
diff --git a/kernel/include/arch/x86_64/cpu/data.hpp b/kernel/include/arch/x86_64/cpu/data.hpp deleted file mode 100644 index c803468..0000000 --- a/kernel/include/arch/x86_64/cpu/data.hpp +++ /dev/null @@ -1,51 +0,0 @@ - -#include <cstdint> - -#pragma once - -#include <etc/assembly.hpp> -#include <etc/libc.hpp> - -#include <arch/x86_64/interrupts/idt.hpp> -#include <arch/x86_64/scheduling.hpp> - -typedef struct { - std::uint64_t user_stack; - std::uint64_t kernel_stack; - std::uint64_t timer_ist_stack; - int last_sys; - std::uint64_t lapic_block; - struct { - std::uint16_t cpu_id; - } smp; - struct { - std::uint64_t freq; - } tsc; - struct { - int_frame_t* temp_ctx; - int_frame_t sys_ctx; - arch::x86_64::process_t* proc; - arch::x86_64::process_queue_run_list_t* next; - } temp; -} cpudata_t; - -namespace arch { - namespace x86_64 { - namespace cpu { - - inline static cpudata_t* fixdata() { - std::uint64_t cpudata = __rdmsr(0xC0000101); - } - - inline static cpudata_t* data() { - std::uint64_t cpudata = __rdmsr(0xC0000101); - if(!cpudata) { - cpudata = (std::uint64_t)new cpudata_t; - memset((void*)cpudata,0,sizeof(cpudata_t)); - __wrmsr(0xC0000101,cpudata); - } - return (cpudata_t*)cpudata; - } - }; - }; -};
\ No newline at end of file diff --git a/kernel/include/arch/x86_64/cpu/gdt.hpp b/kernel/include/arch/x86_64/cpu/gdt.hpp deleted file mode 100644 index 4ffe780..0000000 --- a/kernel/include/arch/x86_64/cpu/gdt.hpp +++ /dev/null @@ -1,79 +0,0 @@ - -#include <cstdint> - -#pragma once - -typedef struct __attribute__((packed)) { - std::uint16_t size; - std::uint64_t base; -} gdt_pointer_t; - -typedef struct __attribute__((packed)) { - std::uint16_t limit; - std::uint16_t baselow16; - std::uint8_t basemid8; - std::uint8_t access; - std::uint8_t granularity; - std::uint8_t basehigh8; -} gdt_entry_t; - -typedef struct __attribute__((packed)) { - std::uint16_t length; - std::uint16_t baselow16; - std::uint8_t basemid8; - std::uint8_t flags0; - std::uint8_t flags1; - std::uint8_t basehigh8; - std::uint32_t baseup32; - std::uint32_t reserved; -} tss_entry_t; - -typedef struct __attribute__((packed)) { - std::uint32_t reserved0; - std::uint64_t rsp[3]; - std::uint64_t reserved1; - std::uint64_t ist[7]; - std::uint32_t reserved2; - std::uint32_t reserved3; - std::uint16_t reserved4; - std::uint16_t iopb_offsset; -} tss_t; - -typedef struct __attribute__((packed)) { - gdt_entry_t zero; - gdt_entry_t _64bitcode; - gdt_entry_t _64bitdata; - gdt_entry_t usercode; - gdt_entry_t userdata; - tss_entry_t tss; -} gdt_t; - -extern "C" void loadtss(); -extern "C" void loadgdt(void* gdtr); - -namespace arch { - namespace x86_64 { - namespace cpu { - class gdt { - private: - gdt_t gdt_obj; - gdt_pointer_t gdtr; - public: - - void LoadTSS() { - loadtss(); - } - - void LoadGDT() { - loadgdt(&gdtr); - } - - static void init(); - - gdt() { - init(); - } - }; - }; - }; -};
\ No newline at end of file diff --git a/kernel/include/arch/x86_64/cpu/lapic.hpp b/kernel/include/arch/x86_64/cpu/lapic.hpp deleted file mode 100644 index 350edac..0000000 --- a/kernel/include/arch/x86_64/cpu/lapic.hpp +++ /dev/null @@ -1,68 +0,0 @@ - -#include <cstdint> - -#pragma once - -#include <generic/mm/paging.hpp> -#include <drivers/tsc.hpp> - -#include <drivers/hpet.hpp> - -#include <generic/time.hpp> - -#include <etc/logging.hpp> - -#include <etc/assembly.hpp> -#include <etc/etc.hpp> - -extern "C" void setwp(); - -namespace arch { - namespace x86_64 { - namespace cpu { - class lapic { - - static inline std::uint64_t base() { - return (std::uint64_t)Other::toVirt(__rdmsr(0x1B) & 0xFFFFF000); - } - - static inline std::uint32_t read(std::uint32_t reg) { - return *(volatile std::uint32_t*)(base() + reg); - } - - static inline void write(std::uint32_t reg,std::uint32_t value) { - *(volatile std::uint32_t*)(base() + reg) = value; - } - - public: - - static inline std::uint32_t id() { - return read(0x20) >> 24; - } - - static inline void eoi() { - write(0xB0,0); - } - - static inline void tick(std::uint64_t tick) { - write(0x380,tick); - } - - static inline std::uint64_t init(std::uint32_t us) { - __wrmsr(0x1B,__rdmsr(0x1B)); - memory::paging::kernelmap(0,__rdmsr(0x1B) & 0xFFFFF000); - write(0xf0,0xff | 0x100); - write(0x3e0,1); - write(0x320,32 | (1 << 16)); - write(0x380,0xFFFFFFFF); - time::sleep(us); - std::uint64_t ticks = 0xFFFFFFFF - read(0x390); - write(0x320, 32 | (1 << 17)); - write(0x3e0,1); - write(0x380,0); - return ticks; - } - }; - }; - }; -};
\ No newline at end of file diff --git a/kernel/include/arch/x86_64/cpu/smp.hpp b/kernel/include/arch/x86_64/cpu/smp.hpp deleted file mode 100644 index e98992a..0000000 --- a/kernel/include/arch/x86_64/cpu/smp.hpp +++ /dev/null @@ -1,14 +0,0 @@ - -#include <cstdint> - -namespace arch { - namespace x86_64 { - namespace cpu { - class mp { - public: - static void init(); - static void sync(std::uint8_t id); - }; - } - } -}
\ No newline at end of file diff --git a/kernel/include/arch/x86_64/cpu/sse.hpp b/kernel/include/arch/x86_64/cpu/sse.hpp deleted file mode 100644 index 6b21d60..0000000 --- a/kernel/include/arch/x86_64/cpu/sse.hpp +++ /dev/null @@ -1,37 +0,0 @@ - -#include <cstdint> - -#pragma once - -#define DEFAULT_SSE_FLAGS ((1 << 9) | (1 << 10) | (1 << 1)) -#define SSE_XSAVE_SUPPORT (1 << 26) -#define SSE_XSAVE_CR4 (1 << 18) - -#define SSE_CONTROL_DEFAULT ((1 << 0) | (1 << 1)) - -#define SSE_CHECK_AND_SET(bit) \ -if(a & bit) \ - sse_control |= bit; - -typedef struct { - std::uint16_t dumb0; - std::uint32_t dumb1; - std::uint16_t dumb2; - std::uint64_t dumb3; - std::uint64_t dumb4; - std::uint32_t dumb5; -} __attribute__((packed)) fpu_head_t; - -namespace arch { - namespace x86_64 { - namespace cpu { - class sse { - public: - static void init(); - static std::uint64_t size(); - static void save(std::uint8_t* buf); - static void load(std::uint8_t* buf); - }; - } - } -}
\ No newline at end of file diff --git a/kernel/include/arch/x86_64/interrupts/idt.hpp b/kernel/include/arch/x86_64/interrupts/idt.hpp deleted file mode 100644 index 529913f..0000000 --- a/kernel/include/arch/x86_64/interrupts/idt.hpp +++ /dev/null @@ -1,63 +0,0 @@ - -#include <cstdint> - -#pragma once - -typedef struct { - std::uint16_t low; - std::uint16_t cs; - std::uint8_t ist; - std::uint8_t attr; - std::uint16_t mid; - std::uint32_t high; - std::uint32_t reserved0; -} __attribute__((packed)) idt_entry_t; - -typedef struct { - std::uint16_t limit; - std::uint64_t base; -} __attribute__((packed)) idtr_t; - -typedef struct { - std::uint64_t cr3; - std::uint64_t rax; - std::uint64_t rbx; - std::uint64_t rcx; - std::uint64_t rdx; - std::uint64_t rsi; - std::uint64_t rdi; - std::uint64_t rbp; - std::uint64_t r8; - std::uint64_t r9; - std::uint64_t r10; - std::uint64_t r11; - std::uint64_t r12; - std::uint64_t r13; - std::uint64_t r14; - std::uint64_t r15; - std::uint64_t vec; - std::uint64_t err_code; - std::uint64_t rip; - std::uint64_t cs; - std::uint64_t rflags; - std::uint64_t rsp; - std::uint64_t ss; -} int_frame_t; - -extern "C" void ignoreStub(); - -namespace arch { - namespace x86_64 { - namespace interrupts { - class idt { - public: - static void init(); - static void set_entry(std::uint64_t base,std::uint8_t vec,std::uint8_t flags,std::uint8_t ist); - static std::uint8_t alloc(); - - static void load(); - }; - }; - }; -}; - diff --git a/kernel/include/arch/x86_64/interrupts/irq.hpp b/kernel/include/arch/x86_64/interrupts/irq.hpp deleted file mode 100644 index 4003184..0000000 --- a/kernel/include/arch/x86_64/interrupts/irq.hpp +++ /dev/null @@ -1,28 +0,0 @@ - -#include <cstdint> - -#pragma once - -#define IRQ_TYPE_OTHER 0 -#define IRQ_TYPE_LEGACY 1 -#define IRQ_TYPE_MSI 2 -#define IRQ_TYPE_LEGACY_USERSPACE 3 - -typedef struct { - void (*func)(void* arg); - void* arg; - int irq; - char is_userspace; -} irq_t; - -namespace arch { - namespace x86_64 { - namespace interrupts { - class irq { - public: - static std::uint8_t create(std::uint16_t irq,std::uint8_t type,void (*func)(void* arg),void* arg,std::uint64_t flags); - static void reset(); - }; - }; - }; -};
\ No newline at end of file diff --git a/kernel/include/arch/x86_64/interrupts/pic.hpp b/kernel/include/arch/x86_64/interrupts/pic.hpp deleted file mode 100644 index 81d65ed..0000000 --- a/kernel/include/arch/x86_64/interrupts/pic.hpp +++ /dev/null @@ -1,107 +0,0 @@ - -#include <etc/assembly.hpp> -#include <drivers/io.hpp> -#include <cstdint> - -#include <arch/x86_64/interrupts/irq.hpp> - -#pragma once - -#define PIC1 0x20 -#define PIC2 0xA0 -#define PIC1_COMMAND PIC1 -#define PIC1_DATA (PIC1+1) -#define PIC2_COMMAND PIC2 -#define PIC2_DATA (PIC2+1) -#define ICW1_ICW4 0x01 -#define ICW1_SINGLE 0x02 -#define ICW1_INTERVAL4 0x04 -#define ICW1_LEVEL 0x08 -#define ICW1_INIT 0x10 - -#define ICW4_8086 0x01 -#define ICW4_AUTO 0x02 -#define ICW4_BUF_SLAVE 0x08 -#define ICW4_BUF_MASTER 0x0C -#define ICW4_SFNM 0x10 - -#define CASCADE_IRQ 2 - -namespace arch { - namespace x86_64 { - namespace interrupts { - class pic { - public: - static inline void eoi(std::uint8_t irq) { - drivers::io io; - if(irq >= 8) - io.outb(PIC2_COMMAND,0x20); - io.outb(PIC1_COMMAND,0x20); - - } - - static inline void disable() { - drivers::io io; - io.outb(PIC1_DATA, 0xff); - io.outb(PIC2_DATA, 0xff); - arch::x86_64::interrupts::irq::reset(); - } - - static inline void init() { - drivers::io io; - io.outb(PIC1_COMMAND, ICW1_INIT | ICW1_ICW4); - io.wait(); - io.outb(PIC2_COMMAND, ICW1_INIT | ICW1_ICW4); - io.wait(); - io.outb(PIC1_DATA, 0x20); - io.wait(); - io.outb(PIC2_DATA, 0x28); - io.wait(); - io.outb(PIC1_DATA, 1 << CASCADE_IRQ); - io.wait(); - io.outb(PIC2_DATA, 2); - io.wait(); - - io.outb(PIC1_DATA, ICW4_8086); - io.wait(); - io.outb(PIC2_DATA, ICW4_8086); - io.wait(); - - io.outb(PIC1_DATA, 0); - io.outb(PIC2_DATA, 0); - } - - static inline void mask(std::uint8_t irq) { - drivers::io io; - std::uint16_t port; - std::uint8_t value; - - if(irq < 8) { - port = PIC1_DATA; - } else { - port = PIC2_DATA; - irq -= 8; - } - value = io.inb(port) | (1 << irq); - io.outb(port, value); - } - - static inline void clear(std::uint8_t irq) { - drivers::io io; - std::uint16_t port; - std::uint8_t value; - - if(irq < 8) { - port = PIC1_DATA; - } else { - port = PIC2_DATA; - irq -= 8; - } - value = io.inb(port) & ~(1 << irq); - io.outb(port, value); - } - - }; - }; - }; -};
\ No newline at end of file diff --git a/kernel/include/arch/x86_64/interrupts/pit.hpp b/kernel/include/arch/x86_64/interrupts/pit.hpp deleted file mode 100644 index 1fc7377..0000000 --- a/kernel/include/arch/x86_64/interrupts/pit.hpp +++ /dev/null @@ -1,18 +0,0 @@ - -#include <cstdint> - -#pragma once - -#define PIT_FREQUENCY 1193182 - -namespace arch { - namespace x86_64 { - namespace interrupts { - class pit { - public: - static void init(); - static void sleep(std::uint32_t ms); - }; - }; - }; -};
\ No newline at end of file diff --git a/kernel/include/arch/x86_64/scheduling.hpp b/kernel/include/arch/x86_64/scheduling.hpp deleted file mode 100644 index 90e0336..0000000 --- a/kernel/include/arch/x86_64/scheduling.hpp +++ /dev/null @@ -1,460 +0,0 @@ - -#include <cstdint> - -#pragma once - -#include <arch/x86_64/syscalls/signal.hpp> - -#include <arch/x86_64/interrupts/idt.hpp> -#include <generic/vfs/vfs.hpp> - -#include <etc/logging.hpp> - -#include <generic/locks/spinlock.hpp> - -#include <atomic> - -#define PROCESS_STATE_NONE 0 -#define PROCESS_STATE_KILLED 1 -#define PROCESS_STATE_RUNNING 2 -#define PROCESS_STATE_ZOMBIE 3 - -#define WNOHANG 1 /* Don't block waiting. */ -#define WUNTRACED 2 /* Report status of stopped children. */ - -#define MIN2(a, b) ((a) < (b) ? (a) : (b)) -#define MAX2(a, b) ((a) > (b) ? (a) : (b)) - -extern "C" void yield(); - -#define PREPARE_SIGNAL(proc) if(proc->sig->is_not_empty_sigset(&proc->current_sigset) && 1) -#define PROCESS_SIGNAL(proc) yield(); - -typedef struct { - unsigned char e_ident[16]; - 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; -} __attribute__((packed)) elfheader_t; - -typedef struct { - uint32_t p_type; - uint32_t p_flags; - uint64_t p_offset; - uint64_t p_vaddr; - uint64_t p_paddr; - uint64_t p_filesz; - uint64_t p_memsz; - uint64_t p_align; -} __attribute__((packed)) elfprogramheader_t; - -typedef struct { - std::uint64_t interp_entry; - std::uint64_t real_entry; - std::uint64_t phdr; - std::uint64_t phnum; - std::uint64_t phentsize; - int status; - std::uint64_t interp_base; - std::uint64_t base; -} elfloadresult_t; - -#define REG_R8 0 -#define REG_R9 1 -#define REG_R10 2 -#define REG_R11 3 -#define REG_R12 4 -#define REG_R13 5 -#define REG_R14 6 -#define REG_R15 7 -#define REG_RDI 8 -#define REG_RSI 9 -#define REG_RBP 10 -#define REG_RBX 11 -#define REG_RDX 12 -#define REG_RAX 13 -#define REG_RCX 14 -#define REG_RSP 15 -#define REG_RIP 16 -#define REG_EFL 17 -#define REG_CSGSFS 18 -#define REG_ERR 19 -#define REG_TRAPNO 20 -#define REG_OLDMASK 21 -#define REG_CR2 22 - -inline void mcontext_to_int_frame(mcontext_t* out, int_frame_t* src) { - src->r8 = out->gregs[REG_R8]; - src->r9 = out->gregs[REG_R9]; - src->r10 = out->gregs[REG_R10]; - src->r11 = out->gregs[REG_R11]; - src->r12 = out->gregs[REG_R12]; - src->r13 = out->gregs[REG_R13]; - src->r14 = out->gregs[REG_R14]; - src->r15 = out->gregs[REG_R15]; - src->rdi = out->gregs[REG_RDI]; - src->rsi = out->gregs[REG_RSI]; - src->rbp = out->gregs[REG_RBP]; - src->rbx = out->gregs[REG_RBX]; - src->rdx = out->gregs[REG_RDX]; - src->rax = out->gregs[REG_RAX]; - src->rcx = out->gregs[REG_RCX]; - src->rsp = out->gregs[REG_RSP]; - src->rip = out->gregs[REG_RIP]; - src->rflags = out->gregs[REG_EFL]; - src->cs = out->gregs[REG_CSGSFS]; // todo: implement SMEP - src->ss = out->gregs[REG_ERR]; // why not - if(src->cs > 0x30) { - Log::SerialDisplay(LEVEL_MESSAGE_FAIL,"broken src->cs for mcontext to int frame"); - asm volatile("hlt"); - } -} - -inline void int_frame_to_mcontext(int_frame_t* src, mcontext_t* out) { - out->gregs[REG_R8] = src->r8; - out->gregs[REG_R9] = src->r9; - out->gregs[REG_R10] = src->r10; - out->gregs[REG_R11] = src->r11; - out->gregs[REG_R12] = src->r12; - out->gregs[REG_R13] = src->r13; - out->gregs[REG_R14] = src->r14; - out->gregs[REG_R15] = src->r15; - out->gregs[REG_RDI] = src->rdi; - out->gregs[REG_RSI] = src->rsi; - out->gregs[REG_RBP] = src->rbp; - out->gregs[REG_RBX] = src->rbx; - out->gregs[REG_RDX] = src->rdx; - out->gregs[REG_RAX] = src->rax; - out->gregs[REG_RCX] = src->rcx; - out->gregs[REG_RSP] = src->rsp; - out->gregs[REG_RIP] = src->rip; - out->gregs[REG_EFL] = src->rflags; - out->gregs[REG_CSGSFS] = src->cs; - out->gregs[REG_ERR] = src->ss; - if(!src->cs > 0x30) { - Log::SerialDisplay(LEVEL_MESSAGE_FAIL,"broken src->cs for int frame to mcontext"); - asm volatile("hlt"); - } - - /* Other registers must be untouched (not implemented) */ -} - -enum ELF_Type { - PT_NULL, - PT_LOAD, - PT_DYNAMIC, - PT_INTERP, - PT_NOTE, - PT_SHLIB, - PT_PHDR, - PT_LOPROC=0x70000000, //reserved - PT_HIPROC=0x7FFFFFFF //reserved -}; - -typedef enum { - ET_NONE = 0, - ET_REL = 1, - ET_EXEC = 2, - ET_DYN = 3, - ET_CORE = 4, - ET_LOPROC = 0xff00, - ET_HIPROC = 0xffff -} obj_type_t; - -typedef enum { - AT_NULL = 0, - AT_IGNORE = 1, - AT_EXECFD = 2, - AT_PHDR = 3, - AT_PHENT = 4, - AT_PHNUM = 5, - AT_PAGESZ = 6, - AT_BASE = 7, - AT_FLAGS = 8, - AT_ENTRY = 9, - AT_NOTELF = 10, - AT_UID = 11, - AT_EUID = 12, - AT_GID = 13, - AT_EGID = 14, - AT_PLATFORM = 15, - AT_HWCAP = 16, - AT_CLKTCK = 17, - AT_SECURE = 23, - AT_BASE_PLATFORM = 24, - AT_RANDOM = 25, - AT_HWCAP2 = 26, - AT_RSEQ_FEATURE_SIZE = 27, - AT_RSEQ_ALIGN = 28, - AT_HWCAP3 = 29, - AT_HWCAP4 = 30, - AT_EXECFN = 31 -} auxv_t; - -extern "C" void schedulingScheduleAndChangeStack(std::uint64_t stack, int_frame_t* ctx); -extern "C" void schedulingSchedule(int_frame_t* ctx); -extern "C" void schedulingEnter(); -extern "C" void schedulingEnd(int_frame_t* ctx); - -typedef struct { - int64_t d_tag; - union { - uint64_t d_val; - uint64_t d_ptr; - } d_un; -} Elf64_Dyn; - -#define DT_NULL 0 -#define DT_NEEDED 1 -#define DT_STRTAB 5 -#define DT_SYMTAB 6 -#define DT_STRSZ 10 - -typedef uint64_t u64; - -# define CSIGNAL 0x000000ff /* Signal mask to be sent at exit. */ -# define CLONE_VM 0x00000100 /* Set if VM shared between processes. */ -# define CLONE_FS 0x00000200 /* Set if fs info shared between processes. */ -# define CLONE_FILES 0x00000400 /* Set if open files shared between processes. */ -# define CLONE_SIGHAND 0x00000800 /* Set if signal handlers shared. */ -# define CLONE_PIDFD 0x00001000 /* Set if a pidfd should be placed - in parent. */ -# define CLONE_PTRACE 0x00002000 /* Set if tracing continues on the child. */ -# define CLONE_VFORK 0x00004000 /* Set if the parent wants the child to - wake it up on mm_release. */ -# define CLONE_PARENT 0x00008000 /* Set if we want to have the same - parent as the cloner. */ -# define CLONE_THREAD 0x00010000 /* Set to add to same thread group. */ -# define CLONE_NEWNS 0x00020000 /* Set to create new namespace. */ -# define CLONE_SYSVSEM 0x00040000 /* Set to shared SVID SEM_UNDO semantics. */ -# define CLONE_SETTLS 0x00080000 /* Set TLS info. */ -# define CLONE_PARENT_SETTID 0x00100000 /* Store TID in userlevel buffer - before MM copy. */ -# define CLONE_CHILD_CLEARTID 0x00200000 /* Register exit futex and memory - location to clear. */ -# define CLONE_DETACHED 0x00400000 /* Create clone detached. */ -# define CLONE_UNTRACED 0x00800000 /* Set if the tracing process can't - force CLONE_PTRACE on this clone. */ -# define CLONE_CHILD_SETTID 0x01000000 /* Store TID in userlevel buffer in - the child. */ -# define CLONE_NEWCGROUP 0x02000000 /* New cgroup namespace. */ -# define CLONE_NEWUTS 0x04000000 /* New utsname group. */ -# define CLONE_NEWIPC 0x08000000 /* New ipcs. */ -# define CLONE_NEWUSER 0x10000000 /* New user namespace. */ -# define CLONE_NEWPID 0x20000000 /* New pid namespace. */ -# define CLONE_NEWNET 0x40000000 /* New network namespace. */ -# define CLONE_IO 0x80000000 /* Clone I/O context. */ - -struct clone_args { - u64 flags; /* Flags bit mask */ - u64 pidfd; /* Where to store PID file descriptor - (int *) */ - u64 child_tid; /* Where to store child TID, - in child's memory (pid_t *) */ - u64 parent_tid; /* Where to store child TID, - in parent's memory (pid_t *) */ - u64 exit_signal; /* Signal to deliver to parent on - child termination */ - u64 stack; /* Pointer to lowest byte of stack */ - u64 stack_size; /* Size of stack */ - u64 tls; /* Location of new TLS */ - u64 set_tid; /* Pointer to a pid_t array - (since Linux 5.5) */ - u64 set_tid_size; /* Number of elements in set_tid - (since Linux 5.5) */ - u64 cgroup; /* File descriptor for target cgroup - of child (since Linux 5.7) */ -}; - -struct stimeval { - long long tv_sec; /* seconds */ - long long tv_usec; /* microseconds */ -}; - - -struct itimerval { - struct stimeval it_interval; /* следующее значение */ - struct stimeval it_value; /* текущее значение */ -}; - -#define ITIMER_REAL 0 -#define ITIMER_VIRTUAL 1 -#define ITIMER_PROF 2 - -namespace arch { - namespace x86_64 { - - struct sigset_list { - int sig; - sigset_t sigset; - sigset_list* next; - }; - - typedef struct process { - std::uint32_t id; - std::uint8_t status; - std::uint8_t waitpid_state; - - std::uint64_t original_cr3; - int_frame_t ctx; - int_frame_t sig_ctx; - - int_frame_t* sys_ctx; - - std::atomic<int> target_cpu; - - std::uint64_t fs_base; - - locks::spinlock lock; - locks::spinlock kill_lock; /* Never should be setup by not kill() function */ - - locks::spinlock _3rd_kill_lock; - locks::spinlock futex_lock; - - locks::spinlock fd_lock; - - itimerval itimer; - std::int64_t next_alarm; - - itimerval vitimer; - std::int64_t virt_timer; - - itimerval proftimer; - std::int64_t prof_timer; - - sigset_t current_sigset; - sigset_t temp_sigset; - int is_restore_sigset; - - void* sig_handlers[36]; - void* ret_handlers[36]; - int sig_flags[36]; - - std::atomic<int> is_execd; - - sigset_t sigsets[36]; - stack_t altstack; - - std::uint8_t is_sig_real; - std::uint32_t alloc_fd; - std::uint32_t* fd_ptr; - - std::uint64_t old_stack; - - int is_shared_fd; - - std::uint32_t reversedforid; - std::uint32_t* vmm_id; - - userspace_fd_t* fd_pool; - vfs::passingfd_manager* pass_fd; - signalmanager* sig; - - sigtrace* sigtrace_obj; - - int is_cloexec; - - void* fd; - - char* vmm_start; - char* vmm_end; - - char* sse_ctx; - char* cwd; - char* name; - - int sys; - - int prio; - - std::uint64_t ts; - - int exit_code; - int is_cloned; - std::uint64_t* original_cr3_pointer; - - std::uint64_t time_start; - - std::uint64_t futex; - std::uint64_t syscall_stack; - std::uint64_t user_stack; - - std::uint64_t create_timestamp; - std::uint64_t exit_timestamp; - - std::uint64_t thread_group; // just parent pid - - std::uint32_t parent_id; - std::uint32_t exit_signal; - - int* tidptr; - int uid; - - int debug0; - int debug1; - - int is_debug; - - int sex_abort; - - struct process* next; - - } process_t; - - inline void update_time(itimerval* itimer, std::int64_t* output, int is_tsc) { - if(itimer->it_value.tv_sec != 0 || itimer->it_value.tv_usec != 0) { - *output = (itimer->it_value.tv_usec) + (itimer->it_value.tv_sec * (1000*1000)) + (is_tsc ? drivers::tsc::currentus() : 0); - } else if(itimer->it_interval.tv_sec != 0 || itimer->it_interval.tv_usec != 0) { - *output = (itimer->it_interval.tv_usec) + (itimer->it_interval.tv_sec * (1000*1000)) + (is_tsc ? drivers::tsc::currentus() : 0); - } - } - - inline sigset_t* get_sigset_from_list(process_t* proc, int sig) { - - return 0; - } - - inline void free_sigset_from_list(process_t* proc) { - return; - } - -static_assert(sizeof(process_t) < 4096,"process_t is bigger than page size"); - - typedef struct process_queue_run_list { - struct process_queue_run_list* next; - process_t* proc; - char is_used; - } process_queue_run_list_t; - - class scheduling { - public: - static void init(); - static process_t* create(); - static process_t* fork(process_t* proc,int_frame_t* ctx); - static process_t* clone(process_t* proc,int_frame_t* ctx); - static process_t* clone3(process_t* proc, clone_args* clarg, int_frame_t* ctx); - static process_t* by_pid(int pid); - static void create_kernel_thread(void (*func)(void*),void* arg); - static void kill(process_t* proc); - static void wakeup(process_t* proc); - static int futexwake(process_t* proc, int* lock, int num_to_wake); - static void futexwait(process_t* proc, int* lock, int val, int* original_lock, std::uint64_t ts); - static int loadelf(process_t* proc,char* path,char** argv,char** envp,int free_mem); - static process_t* head_proc_(); - - static void sigreturn(process_t* proc); - - }; - } -} - diff --git a/kernel/include/arch/x86_64/syscalls/futex.hpp b/kernel/include/arch/x86_64/syscalls/futex.hpp deleted file mode 100644 index 8b13789..0000000 --- a/kernel/include/arch/x86_64/syscalls/futex.hpp +++ /dev/null @@ -1 +0,0 @@ - diff --git a/kernel/include/arch/x86_64/syscalls/shm.hpp b/kernel/include/arch/x86_64/syscalls/shm.hpp deleted file mode 100644 index af7bc7f..0000000 --- a/kernel/include/arch/x86_64/syscalls/shm.hpp +++ /dev/null @@ -1,42 +0,0 @@ - -#include <cstdint> - -typedef long time_t; -typedef unsigned short ushort; - -#define IPC_RMID 0 -#define IPC_SET 1 -#define IPC_STAT 2 -#define IPC_INFO 3 - -struct ipc_perm { - std::uint32_t key; - ushort uid; - ushort gid; - ushort cuid; - ushort cgid; - ushort mode; - ushort seq; -}; - - -struct shmid_ds { - struct ipc_perm shm_perm; - int shm_segsz; - time_t shm_atime; - time_t shm_dtime; - time_t shm_ctime; - unsigned short shm_cpid; - unsigned short shm_lpid; - short shm_nattch; -}; - -typedef struct shm_seg { - std::uint32_t key; - std::uint32_t id; - std::uint64_t phys; - std::uint64_t len; - int is_pending_rm; - struct shmid_ds ctl; - struct shm_seg* next; -} shm_seg_t;
\ No newline at end of file diff --git a/kernel/include/arch/x86_64/syscalls/signal.hpp b/kernel/include/arch/x86_64/syscalls/signal.hpp deleted file mode 100644 index 26589c7..0000000 --- a/kernel/include/arch/x86_64/syscalls/signal.hpp +++ /dev/null @@ -1,288 +0,0 @@ - -#include <arch/x86_64/interrupts/idt.hpp> -#include <cstdint> - -#include <etc/list.hpp> - -#pragma once - -void signal_ret(); - -typedef long clock_t; - -union sigval { - int sival_int; - void *sival_ptr; -}; - -typedef uint32_t __uint32_t; -typedef uint64_t __uint64_t; -typedef uint16_t __uint16_t; -typedef int pid_t; -typedef int uid_t; - - - - -#define _SIGSET_NWORDS (1024 / (8 * sizeof (unsigned long int))) -typedef struct -{ - unsigned long long __val; -} __sigset_t; - -typedef __sigset_t sigset_t; - -void signal_ret_sigmask(sigset_t* sigmask); - -#define __sigmask(sig) \ - (1UL << (((sig) - 1) % 64)) - -/* Return the word index for SIG. */ -static inline int -__sigword (int sig) -{ - return (sig - 1) / 64; -} - -static inline int -__sigismember (sigset_t *set, int sig) -{ - return (set->__val & (1 << (sig - 1))) ? 1 : 0; -} - - -struct siginfo_t { - int si_signo; /* Номер сигнала */ - int si_errno; /* Значение errno */ - int si_code; /* Код сигнала */ - pid_t si_pid; /* Идентификатор процесса, пославшего сигнал */ - uid_t si_uid; /* Реальный идентификатор пользователя процесса, пославшего сигнал */ - int si_status; /* Выходное значение или номер сигнала */ - clock_t si_utime; /* Занятое пользователем время */ - clock_t si_stime; /* Использованное системное время */ - sigval si_value; /* Значение сигнала */ - int si_int; /* Сигнал POSIX.1b */ - void * si_ptr; /* Сигнал POSIX.1b */ - void * si_addr; /* Адрес в памяти, приводящий к ошибке */ - int si_band; /* Общее событие */ - int si_fd; /* Описатель файла */ -}; - -# define __ctx(fld) fld - -struct _libc_fpxreg -{ - unsigned short int __ctx(significand)[4]; - unsigned short int __ctx(exponent); - unsigned short int __glibc_reserved1[3]; -}; - -typedef struct { - void *ss_sp; /* Base address of stack */ - int ss_flags; /* Flags */ - size_t ss_size; /* Number of bytes in stack */ - } stack_t; - - -struct _libc_xmmreg -{ - __uint32_t __ctx(element)[4]; -}; - -struct _libc_fpstate -{ - /* 64-bit FXSAVE format. */ - __uint16_t __ctx(cwd); - __uint16_t __ctx(swd); - __uint16_t __ctx(ftw); - __uint16_t __ctx(fop); - __uint64_t __ctx(rip); - __uint64_t __ctx(rdp); - __uint32_t __ctx(mxcsr); - __uint32_t __ctx(mxcr_mask); - struct _libc_fpxreg _st[8]; - struct _libc_xmmreg _xmm[16]; - __uint32_t __glibc_reserved1[24]; -}; - -#define __NGREG 23 - -#define __pollution(n) n - -struct _fpxreg { - unsigned short __pollution(significand)[4]; - unsigned short __pollution(exponent); - unsigned short __padding[3]; -}; - -struct _xmmreg { - uint32_t __pollution(element)[4]; -}; - -struct _fpstate { - uint16_t __pollution(cwd); - uint16_t __pollution(swd); - uint16_t __pollution(ftw); - uint16_t __pollution(fop); - uint64_t __pollution(rip); - uint64_t __pollution(rdp); - uint32_t __pollution(mxcsr); - uint32_t __pollution(mxcr_mask); - struct _fpxreg _st[8]; - struct _xmmreg _xmm[16]; - uint32_t __padding[24]; -}; - -typedef struct { - unsigned long __pollution(gregs)[__NGREG]; - struct _fpstate *__pollution(fpregs); - unsigned long __reserved1[8]; -} mcontext_t; - -/* Structure to describe FPU registers. */ -typedef struct _libc_fpstate *fpregset_t; - -struct sigtrace { - mcontext_t* mctx; - sigset_t sigset; - void* fpu_state; - struct sigtrace* next; -}; - -struct sigaction - { - /* Signal handler. */ -#if 1 - union - { - /* Used if SA_SIGINFO is not set. */ - void (*sa_handler)(int); - /* Used if SA_SIGINFO is set. */ - void (*sa_sigaction) (int, siginfo_t *, void *); - } - __sigaction_handler; -# define sa_handler __sigaction_handler.sa_handler -# define sa_sigaction __sigaction_handler.sa_sigaction -#else - __sighandler_t sa_handler; -#endif - - /* Additional set of signals to be blocked. */ - sigset_t sa_mask; - - /* Special flags. */ - int sa_flags; - - /* Restore handler. */ - void (*sa_restorer) (void); - }; - -typedef struct { - std::uint16_t sig; -} pending_signal_t; - -class signalmanager { -private: - pending_signal_t* sigs = 0; - Lists::Bitmap* bitmap = 0; - int size = 0; - int total_size = 0; - locks::spinlock lock; - - int allocate() { - for(int i = 0; i < 128; i++) { - if(!this->bitmap->test(i)) - return i; - } - return -1; - } - - int find_free() { - for(int i = 0; i < 128; i++) { - if(this->bitmap->test(i)) - return i; - } - return -1; - } - -public: - - signalmanager() { - this->total_size = 128; - sigs = new pending_signal_t[this->total_size]; - memset(sigs,0,sizeof(pending_signal_t) * this->total_size); - bitmap = new Lists::Bitmap(this->total_size); - } - - ~signalmanager() { - delete (void*)this->sigs; - delete (void*)this->bitmap; - } - - int pop(pending_signal_t* out) { - this->lock.lock(); - int idx = find_free(); - if(idx == -1) { this->lock.unlock(); - return -1; } - memcpy(out,&sigs[idx],sizeof(pending_signal_t)); - this->bitmap->clear(idx); - this->lock.unlock(); - return 0; - } - - int push(pending_signal_t* src) { - this->lock.lock(); - int idx = allocate(); - if(idx == -1) { this->lock.unlock(); - return -1; } - memcpy(&sigs[idx],src,sizeof(pending_signal_t)); - this->bitmap->set(idx); - this->lock.unlock(); - return 0; - } - - int is_not_empty_sigset(sigset_t* sigsetz) { - this->lock.lock(); - - // ban sigset signals :p - for(int i = 0; i < 128; i++) { - if(this->bitmap->test(i) && !__sigismember(sigsetz,sigs[i].sig)) { - this->lock.unlock(); // great there's unbanned pending signal - return 1; - } - } - - this->lock.unlock(); - return 0; - } - - int popsigset(pending_signal_t* out, sigset_t* sigsetz) { - this->lock.lock(); - int idx = -1; - for(int i = 0; i < 128; i++) { - if(this->bitmap->test(i) && (sigs[i].sig == 9 || !__sigismember(sigsetz,sigs[i].sig))) { - idx = i; - break; - } - } - if(idx == -1) { - this->lock.unlock(); - return -1; - } - - memcpy(out,&sigs[idx],sizeof(pending_signal_t)); - this->bitmap->clear(idx); - this->lock.unlock(); - return 0; - } - - int is_not_empty() { - this->lock.lock(); - int idx = find_free(); - if(idx == -1) { this->lock.unlock(); - return 0; } - this->lock.unlock(); - return 1; - } - -};
\ No newline at end of file diff --git a/kernel/include/arch/x86_64/syscalls/sockets.hpp b/kernel/include/arch/x86_64/syscalls/sockets.hpp deleted file mode 100644 index 9da8461..0000000 --- a/kernel/include/arch/x86_64/syscalls/sockets.hpp +++ /dev/null @@ -1,156 +0,0 @@ - -#include <cstdint> - -#include <generic/vfs/vfs.hpp> -#include <generic/locks/spinlock.hpp> - -#pragma once - -typedef unsigned short sa_family_t; - -#define PF_UNSPEC 0 -#define PF_LOCAL 1 -#define PF_UNIX PF_LOCAL -#define PF_FILE PF_LOCAL -#define PF_INET 2 -#define PF_AX25 3 -#define PF_IPX 4 -#define PF_APPLETALK 5 -#define PF_NETROM 6 -#define PF_BRIDGE 7 -#define PF_ATMPVC 8 -#define PF_X25 9 -#define PF_INET6 10 -#define PF_ROSE 11 -#define PF_DECnet 12 -#define PF_NETBEUI 13 -#define PF_SECURITY 14 -#define PF_KEY 15 -#define PF_NETLINK 16 -#define PF_ROUTE PF_NETLINK -#define PF_PACKET 17 -#define PF_ASH 18 -#define PF_ECONET 19 -#define PF_ATMSVC 20 -#define PF_RDS 21 -#define PF_SNA 22 -#define PF_IRDA 23 -#define PF_PPPOX 24 -#define PF_WANPIPE 25 -#define PF_LLC 26 -#define PF_IB 27 -#define PF_MPLS 28 -#define PF_CAN 29 -#define PF_TIPC 30 -#define PF_BLUETOOTH 31 -#define PF_IUCV 32 -#define PF_RXRPC 33 -#define PF_ISDN 34 -#define PF_PHONET 35 -#define PF_IEEE802154 36 -#define PF_CAIF 37 -#define PF_ALG 38 -#define PF_NFC 39 -#define PF_VSOCK 40 -#define PF_KCM 41 -#define PF_QIPCRTR 42 -#define PF_SMC 43 -#define PF_XDP 44 -#define PF_MAX 45 - -#define AF_UNSPEC PF_UNSPEC -#define AF_LOCAL PF_LOCAL -#define AF_UNIX AF_LOCAL -#define AF_FILE AF_LOCAL -#define AF_INET PF_INET -#define AF_AX25 PF_AX25 -#define AF_IPX PF_IPX -#define AF_APPLETALK PF_APPLETALK -#define AF_NETROM PF_NETROM -#define AF_BRIDGE PF_BRIDGE -#define AF_ATMPVC PF_ATMPVC -#define AF_X25 PF_X25 -#define AF_INET6 PF_INET6 -#define AF_ROSE PF_ROSE -#define AF_DECnet PF_DECnet -#define AF_NETBEUI PF_NETBEUI -#define AF_SECURITY PF_SECURITY -#define AF_KEY PF_KEY -#define AF_NETLINK PF_NETLINK -#define AF_ROUTE PF_ROUTE -#define AF_PACKET PF_PACKET -#define AF_ASH PF_ASH -#define AF_ECONET PF_ECONET -#define AF_ATMSVC PF_ATMSVC -#define AF_RDS PF_RDS -#define AF_SNA PF_SNA -#define AF_IRDA PF_IRDA -#define AF_PPPOX PF_PPPOX -#define AF_WANPIPE PF_WANPIPE -#define AF_LLC PF_LLC -#define AF_IB PF_IB -#define AF_MPLS PF_MPLS -#define AF_CAN PF_CAN -#define AF_TIPC PF_TIPC -#define AF_BLUETOOTH PF_BLUETOOTH -#define AF_IUCV PF_IUCV -#define AF_RXRPC PF_RXRPC -#define AF_ISDN PF_ISDN -#define AF_PHONET PF_PHONET -#define AF_IEEE802154 PF_IEEE802154 -#define AF_CAIF PF_CAIF -#define AF_ALG PF_ALG -#define AF_NFC PF_NFC -#define AF_VSOCK PF_VSOCK -#define AF_KCM PF_KCM -#define AF_QIPCRTR PF_QIPCRTR -#define AF_SMC PF_SMC -#define AF_XDP PF_XDP -#define AF_MAX PF_MAX - -struct sockaddr { - sa_family_t sa_family; - char sa_data[14]; -}; - -struct sockaddr_un { - sa_family_t sun_family; - char sun_path[108]; -}; - -typedef struct socket_pending_obj { - locks::spinlock is_accepted; - userspace_fd_t* son; - struct socket_pending_obj* next; -} socket_pending_obj_t; - -class socket_controller { -private: - -public: - socket_controller() { - - } -}; - -typedef struct socket_node { - char path[128]; - uint64_t vars[8]; - char is_used; - std::atomic<uint64_t> socket_counter; - socket_pending_obj_t* pending_list; - struct socket_node* next; -} socket_node_t; - -class sockets { -public: - static char is_exists(char* path); - static int bind(userspace_fd_t* fd, struct sockaddr_un* path); - static int connect(userspace_fd_t* fd, struct sockaddr_un* path); - static int accept(userspace_fd_t* fd, struct sockaddr_un* path); - static void init(); - - static socket_node_t* find(char* path); - - -};
\ No newline at end of file diff --git a/kernel/include/arch/x86_64/syscalls/syscalls.hpp b/kernel/include/arch/x86_64/syscalls/syscalls.hpp deleted file mode 100644 index 1cfd6bb..0000000 --- a/kernel/include/arch/x86_64/syscalls/syscalls.hpp +++ /dev/null @@ -1,539 +0,0 @@ - -#include <cstdint> - -#pragma once - -#include <generic/mm/paging.hpp> - -#include <arch/x86_64/interrupts/idt.hpp> -#include <arch/x86_64/scheduling.hpp> -#include <etc/bootloaderinfo.hpp> -#include <etc/libc.hpp> - -#include <generic/mm/vmm.hpp> -#include <etc/etc.hpp> - -#include <arch/x86_64/cpu/data.hpp> - -inline void copy_in_userspace(arch::x86_64::process_t* proc,void* dest, void* src, std::uint64_t size) { - - void* ddest = 0; - void* ssrc = 0; - - ddest = dest; - ssrc = src; - - memcpy(ddest,ssrc,size); -} - -inline void copy_in_userspace_string(arch::x86_64::process_t* proc,void* dest, void* src, std::uint64_t size) { - - void* ddest = 0; - void* ssrc = 0; - - ddest = dest; - ssrc = src; - - memcpy(ddest,ssrc,strlen((char*)ssrc) > size ? size : strlen((char*)ssrc)); -} - -inline void zero_in_userspace(arch::x86_64::process_t* proc,void* buf, std::uint64_t size) { - - void* bbuf; - - bbuf = buf; - - memset(bbuf,0,size); -} - -class syscall_safe { -public: - - static inline int is_safe(std::uint64_t ptr) { - if(ptr >= BootloaderInfo::AccessHHDM()) - return 0; - return 1; - } - - static inline int is_safe(void* ptr) { - if((std::uint64_t)ptr >= BootloaderInfo::AccessHHDM()) - return 0; - return 1; - } - - static inline int is_safe(std::uint64_t ptr,std::uint64_t size) { - if(ptr + size >= BootloaderInfo::AccessHHDM()) - return 0; - return 1; - } - - static inline int is_safe(void* ptr,std::uint64_t size) { - if((std::uint64_t)ptr + size >= BootloaderInfo::AccessHHDM()) - return 0; - return 1; - } - -}; - -#define SYSCALL_IS_SAFEA(x,sz) \ - if(!syscall_safe::is_safe(x,sz)) \ - return {0,EFAULT,0}; - -#define SYSCALL_IS_SAFEZ(x,sz) \ - if(!syscall_safe::is_safe(x,sz)) \ - return -EFAULT; - -#define SYSCALL_IS_SAFEB(x,sz) \ - if(!syscall_safe::is_safe(x,sz)) \ - return {0,EFAULT,0}; - -inline arch::x86_64::process_t* __proc_get() { - arch::x86_64::process_t* proc = arch::x86_64::cpu::data()->temp.proc; - return proc; -} - -#define CURRENT_PROC __proc_get() -#define FIND_FD(x) vfs::fdmanager::search(proc,x) - -#define SYSCALL_DISABLE_PREEMPT() asm volatile("cli"); -#define SYSCALL_ENABLE_PREEMPT() asm volatile("sti"); - -typedef struct { - std::int8_t is_rdx_ret; - std::int32_t ret; - std::int64_t ret_val; -} syscall_ret_t; - -#define STAR_MSR 0xC0000081 -#define LSTAR 0xC0000082 -#define STAR_MASK 0xC0000084 -#define EFER 0xC0000080 - -#define MAP_FAILED ((void *)(-1)) -#define MAP_FILE 0x00 -#define MAP_SHARED 0x01 -#define MAP_PRIVATE 0x02 -#define MAP_FIXED 0x10 -#define MAP_ANON 0x20 -#define MAP_ANONYMOUS 0x20 - -#define F_DUPFD 0 -#define F_GETFD 1 -#define F_SETFD 2 -#define F_GETFL 3 -#define F_SETFL 4 - -extern "C" void syscall_handler(); - -struct wiovec { -void *iov_base; -size_t iov_len; -}; - -#define FUTEX_WAIT 0 -#define FUTEX_WAKE 1 -#define FUTEX_FD 2 -#define FUTEX_REQUEUE 3 -#define FUTEX_CMP_REQUEUE 4 -#define FUTEX_WAKE_OP 5 -#define FUTEX_LOCK_PI 6 -#define FUTEX_UNLOCK_PI 7 -#define FUTEX_TRYLOCK_PI 8 -#define FUTEX_WAIT_BITSET 9 -#define FUTEX_WAKE_BITSET 10 -#define FUTEX_WAIT_REQUEUE_PI 11 -#define FUTEX_CMP_REQUEUE_PI 12 -#define FUTEX_LOCK_PI2 13 - -#define FUTEX_PRIVATE_FLAG 128 -#define FUTEX_CLOCK_REALTIME 256 - -#define FUTEX_CMD_MASK ~(FUTEX_PRIVATE_FLAG | FUTEX_CLOCK_REALTIME) - -extern "C" { - -/* File,Pipes and etc. */ -long long sys_access(char* path, int mode); -long long sys_faccessat(int dirfd, char* path, int mode, int flags); -long long sys_openat(int dirfd, const char* path, int flags, int_frame_t* ctx); -long long sys_fstat(int fd, void* out); -long long sys_ioctl(int fd, unsigned long request, void *arg); -long long sys_write(int fd, const void *buf, size_t count); -long long sys_writev(int fd, wiovec* vec, unsigned long vlen); -long long sys_read(int fd, void *buf, size_t count); -long long sys_lseek(int fd, long offset, int whence); -long long sys_dup2(int fd, int newfd); -long long sys_newfstatat(int fd, char* path, void* out, int_frame_t* ctx); -long long sys_dup(int fd); -long long sys_pipe2(int* fildes, int flags); -long long sys_pipe(int* fildes); -long long sys_close(int fd); - -long long sys_umask(int mask); - -long long sys_symlink(char* old, char* path); -long long sys_symlinkat(char* old, int dirfd, char* path); - -long long sys_pread(int fd, void *buf, size_t count, int_frame_t* ctx); - -long long sys_getdents64(int fd, char* buf, size_t count); - -#define __FD_SETSIZE 1024 - -typedef long int __fd_mask; - -/* Some versions of <linux/posix_types.h> define this macros. */ -#undef __NFDBITS -/* It's easier to assume 8-bit bytes than to get CHAR_BIT. */ -#define __NFDBITS (8 * (int) sizeof (__fd_mask)) -#define __FD_ELT(d) ((d) / __NFDBITS) -#define __FD_MASK(d) ((__fd_mask) (1UL << ((d) % __NFDBITS))) - -/* fd_set for select and pselect. */ -typedef struct - { - /* XPG4.2 requires this member name. Otherwise avoid the name - from the global namespace. */ -#ifdef __USE_XOPEN - __fd_mask fds_bits[__FD_SETSIZE / __NFDBITS]; -# define __FDS_BITS(set) ((set)->fds_bits) -#else - __fd_mask __fds_bits[__FD_SETSIZE / __NFDBITS]; -# define __FDS_BITS(set) ((set)->__fds_bits) -#endif - } fd_set; - -/* We don't use `memset' because this would require a prototype and - the array isn't too big. */ -#define __FD_ZERO(s) \ - do { \ - unsigned int __i; \ - fd_set *__arr = (s); \ - for (__i = 0; __i < sizeof (fd_set) / sizeof (__fd_mask); ++__i) \ - __FDS_BITS (__arr)[__i] = 0; \ - } while (0) -#define __FD_SET(d, s) \ - ((void) (__FDS_BITS (s)[__FD_ELT(d)] |= __FD_MASK(d))) -#define __FD_CLR(d, s) \ - ((void) (__FDS_BITS (s)[__FD_ELT(d)] &= ~__FD_MASK(d))) -#define __FD_ISSET(d, s) \ - ((__FDS_BITS (s)[__FD_ELT (d)] & __FD_MASK (d)) != 0) - - -#define FD_SET(fd, fdsetp) __FD_SET (fd, fdsetp) -#define FD_CLR(fd, fdsetp) __FD_CLR (fd, fdsetp) -#define FD_ISSET(fd, fdsetp) __FD_ISSET (fd, fdsetp) -#define FD_ZERO(fdsetp) __FD_ZERO (fdsetp) - -long long sys_pselect6(int num_fds, fd_set* read_set, fd_set* write_set, int_frame_t* ctx); -syscall_ret_t sys_create_dev(std::uint64_t requestandnum, char* slave_path, char* master_path); -syscall_ret_t sys_create_ioctl(char* path, std::uint64_t write_and_read_req, std::uint32_t size); -syscall_ret_t sys_setupmmap(char* path, std::uint64_t addr, std::uint64_t size, int_frame_t* ctx); - -syscall_ret_t sys_setup_tty(char* path); -syscall_ret_t sys_isatty(int fd); - -syscall_ret_t sys_ptsname(int fd, void* out, int max_size); - -syscall_ret_t sys_setup_ring_bytelen(char* path, int bytelen); -syscall_ret_t sys_read_dir(int fd, void* buffer); - -long long sys_fcntl(int fd, int request, std::uint64_t arg, int_frame_t* ctx); - -long long sys_chdir(char* path); -long long sys_fchdir(int fd); - -long long sys_poll(struct pollfd *fds, int count, int timeout, int_frame_t* ctx); -long long sys_readlinkat(int dirfd, const char* path, void* buffer, int_frame_t* ctx); - -long long sys_readlink(char* path, void* buffer, int max_size); - -long long sys_link(char* old_path, char* new_path); -long long sys_linkat(int oldfd, char* old_path, int newfd, int_frame_t* ctx); - -long long sys_mkdirat(int dirfd, char* path, int mode); -long long sys_mkdir(char* path, int mode); - -long long sys_chmod(char* path, int mode); - -syscall_ret_t sys_ttyname(int fd, char *buf, size_t size); -long long sys_rename(char* old, char* newp); - -syscall_ret_t sys_eventfd_create(unsigned int initval, int flags); -syscall_ret_t sys_getentropy(char* buffer, std::uint64_t len); - -long long sys_pwrite(int fd, void* buf, std::uint64_t n, int_frame_t* ctx); -long long sys_fstatfs(int fd, struct statfs *buf); - -long long sys_statfs(char* path, struct statfs* buf); - -long long sys_fchmod(int fd, int mode); -long long sys_fchmodat(int dirfd, const char* path, int mode, int_frame_t* ctx); -long long sys_fchmodat2(int dirfd, const char* path, int mode, int_frame_t* ctx); - -long long sys_renameat(int olddir, char* old, int newdir, int_frame_t* ctx); -long long sys_statx(int dirfd, const char *path, int flag, int_frame_t* ctx); - -/* Process */ - -long long sys_mmap(std::uint64_t hint, std::uint64_t size, unsigned long prot, int_frame_t* ctx); -long long sys_free(void *pointer, size_t size); -long long sys_exit(int status); - -long long sys_exit_group(int status); - -long long sys_set_tid_address(int* tidptr); - -long long sys_arch_prctl(int option, unsigned long* addr); -long long sys_brk(); - -long long sys_mprotect(std::uint64_t start, size_t len, std::uint64_t prot); -long long sys_futex(int* uaddr, int op, uint32_t val, int_frame_t* ctx); - -#define RLIMIT_CPU 0 /* CPU time in sec */ -#define RLIMIT_FSIZE 1 /* Maximum filesize */ -#define RLIMIT_DATA 2 /* max data size */ -#define RLIMIT_STACK 3 /* max stack size */ -#define RLIMIT_CORE 4 /* max core file size */ - -#ifndef RLIMIT_RSS -# define RLIMIT_RSS 5 /* max resident set size */ -#endif - -#ifndef RLIMIT_NPROC -# define RLIMIT_NPROC 6 /* max number of processes */ -#endif - -#ifndef RLIMIT_NOFILE -# define RLIMIT_NOFILE 7 /* max number of open files */ -#endif - -#ifndef RLIMIT_MEMLOCK -# define RLIMIT_MEMLOCK 8 /* max locked-in-memory address space */ -#endif - -#ifndef RLIMIT_AS -# define RLIMIT_AS 9 /* address space limit */ -#endif - -#define RLIMIT_LOCKS 10 /* maximum file locks held */ -#define RLIMIT_SIGPENDING 11 /* max number of pending signals */ -#define RLIMIT_MSGQUEUE 12 /* maximum bytes in POSIX mqueues */ -#define RLIMIT_NICE 13 /* max nice prio allowed to raise to - 0-39 for nice level 19 .. -20 */ -#define RLIMIT_RTPRIO 14 /* maximum realtime priority */ -#define RLIMIT_RTTIME 15 /* timeout for RT tasks in us */ -#define RLIM_NLIMITS 16 - -/* - * SuS says limits have to be unsigned. - * Which makes a ton more sense anyway. - * - * Some architectures override this (for compatibility reasons): - */ -#ifndef RLIM_INFINITY -# define RLIM_INFINITY (~0UL) -#endif - -struct rlimit64 { - std::uint64_t rlim_cur; - std::uint64_t rlim_max; -}; - -long long sys_clone3(clone_args* clargs, size_t size, int c, int_frame_t* ctx); -long long sys_prlimit64(int pid, int res, rlimit64* new_rlimit, int_frame_t* ctx); - -syscall_ret_t sys_iopl(int a, int b ,int c , int_frame_t* ctx); - -syscall_ret_t sys_fork(int D, int S, int d, int_frame_t* ctx); - -syscall_ret_t sys_access_framebuffer(void* out); - -long long sys_exec(char* path, char** argv, char** envp, int_frame_t* ctx); - -long long sys_getpid(); -long long sys_getppid(); -long long sys_getpgrp(); - -long long sys_setpgid(int pid, int pgid); -long long sys_getpgid(int pid); - -syscall_ret_t sys_gethostname(void* buffer, std::uint64_t bufsize); - -long long sys_getcwd(void* buffer, std::uint64_t bufsize); - -long long sys_wait4(int pid,int* status,int flags); - -syscall_ret_t sys_sleep(long us); - -syscall_ret_t sys_alloc_dma(std::uint64_t size); -syscall_ret_t sys_free_dma(std::uint64_t phys); - -syscall_ret_t sys_map_phys(std::uint64_t phys, std::uint64_t flags, std::uint64_t size); - -syscall_ret_t sys_timestamp(); - -syscall_ret_t sys_mkfifoat(int dirfd, const char *path, int mode); - -syscall_ret_t sys_enabledebugmode(); - -long long sys_clone(unsigned long clone_flags, unsigned long newsp, int *parent_tidptr, int_frame_t* ctx); -syscall_ret_t sys_breakpoint(int num, int b, int c, int_frame_t* ctx); - -long long sys_getpriority(int which, int who); -long long sys_setpriority(int which, int who, int prio); - -syscall_ret_t sys_yield(); -syscall_ret_t sys_printdebuginfo(int pid); -syscall_ret_t sys_enabledebugmodepid(int pid); - -syscall_ret_t sys_dmesg(char* buf,std::uint64_t count); - -long long sys_getuid(); - -long long sys_getresuid(int* ruid, int* euid, int *suid); - -long long sys_setuid(int uid); - -long long sys_kill(int pid, int sig); -long long sys_tgkill(int tgid, int tid, int sig); - -/* Futex */ -syscall_ret_t sys_futex_wait(int* pointer, int excepted, struct timespec* ts); -syscall_ret_t sys_futex_wake(int* pointer); - -/* Socket */ -long long sys_socket(int family, int type, int protocol); - -long long sys_bind(int fd, struct sockaddr_un* path, int len); -long long sys_accept(int fd, struct sockaddr_un* path, int* zlen); -long long sys_connect(int fd, struct sockaddr_un* path, int len); - -long long sys_listen(int fd, int backlog); -long long sys_sendto(int s, void* msg, size_t len); - -syscall_ret_t sys_copymemory(void* src, void* dest, int len); - -syscall_ret_t sys_socketpair(int domain, int type_and_flags, int proto); -long long sys_getsockname(int fd, struct sockaddr_un* path, int* len); - -long long sys_getsockopt(int fd, int layer, int number, int_frame_t* ctx); - -long long sys_msg_recv(int fd, struct msghdr *hdr, int flags); -syscall_ret_t sys_msg_send(int fd, struct msghdr* hdr, int flags); - -long long sys_shutdown(int sockfd, int how); - -/* Shm stuff */ - -syscall_ret_t sys_shmctl(int shmid, int cmd, struct shmid_ds *buf); -syscall_ret_t sys_shmat(int shmid, std::uint64_t hint, int shmflg); -syscall_ret_t sys_shmget(int key, size_t size, int shmflg); -syscall_ret_t sys_shmdt(std::uint64_t base); - -/* Signals */ - -typedef unsigned long __cpu_mask; - -#define __CPU_SETSIZE 1024 -#define __NCPUBITS (8 * sizeof(__cpu_mask)) - -typedef struct { - __cpu_mask __bits[__CPU_SETSIZE / __NCPUBITS]; -} cpu_set_t; - -long long sys_pause(); - -long long sys_sigaction(int signum, struct sigaction* hnd, struct sigaction* old, int_frame_t* ctx); -long long sys_sigprocmask(int how, const sigset_t *set, sigset_t *oldset, int_frame_t* ctx); - -typedef int pid_t; - -syscall_ret_t sys_getaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask); - -syscall_ret_t sys_cpucount(); - -syscall_ret_t sys_pathstat(char* path, void* out, int flags, int_frame_t* ctx); - -long long sys_alarm(int seconds); -long long sys_setitimer(int which, itimerval* val, itimerval* old); -long long sys_getitimer(int which, itimerval* val); - -long long sys_sigsuspend(sigset_t* sigset, size_t size); -long long sys_sigaltstack(stack_t* new_stack, stack_t* old); - -long long sys_unlink(char* path); -long long sys_unlinkat(int dirfd, const char* path, int flags); - -/* Misc */ - -struct __kernel_timespec { - std::uint64_t tv_sec; /* seconds */ - long long tv_nsec; /* nanoseconds */ -}; - -typedef int clockid_t; - -struct timeval { - long long tv_sec; /* seconds */ - long long tv_usec; /* microseconds */ -}; - - -long long sys_getrandom(char *buf, size_t count, unsigned int flags); -long long sys_clock_gettime(clockid_t which_clock, struct __kernel_timespec *tp); -long long sys_gettimeofday(timeval* tv, void* tz); -long long sys_time(std::uint64_t* t); - -long long sys_nanosleep(int clock, int flags, timespec* rqtp, int_frame_t* ctx); - -#define TIMER_ABSTIME 0x01 - -struct old_utsname { - char sysname[65]; - char nodename[65]; - char release[65]; - char version[65]; - char machine[65]; -}; - -long long sys_uname(old_utsname* uname); - -struct sysinfo { - long uptime; /* Количество секунд, прошедшее с загрузки системы */ - unsigned long loads[3]; /* средняя одно-, пяти-, и пятнадцатиминутная загруженность системы */ - unsigned long totalram; /* Общий объем доступной оперативной памяти */ - unsigned long freeram; /* Объем свободной памяти */ - unsigned long sharedram; /* Объем разделяемой памяти */ - unsigned long bufferram; /* Объем памяти, использованной под буферы */ - unsigned long totalswap; /* Общий объем области подкачки */ - unsigned long freeswap; /* Объем свободного пространства в области подкачки */ - unsigned short procs; /* Текущее количество процессов */ - unsigned long totalhigh; /* Общий объем верхней памяти */ - unsigned long freehigh; /* Объем свободной верхней памяти */ - unsigned int mem_unit; /* Объем единицы памяти в байтах */ - char _f[20-2*sizeof(long)-sizeof(int)]; /* Дополнение структуры для libc5 */ -}; - -long long sys_sysinfo(sysinfo* info); - -} - -struct pollfd { - int fd; - short events; - short revents; -}; - -namespace arch { - namespace x86_64 { - typedef struct { - int syscall_num; - void* syscall_func; - } syscall_item_t; - class syscall { - public: - static void init(); - }; - } -} |
