summaryrefslogtreecommitdiff
path: root/kernel/include/arch
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/include/arch')
-rw-r--r--kernel/include/arch/x86_64/cpu/data.hpp51
-rw-r--r--kernel/include/arch/x86_64/cpu/gdt.hpp79
-rw-r--r--kernel/include/arch/x86_64/cpu/lapic.hpp68
-rw-r--r--kernel/include/arch/x86_64/cpu/smp.hpp14
-rw-r--r--kernel/include/arch/x86_64/cpu/sse.hpp37
-rw-r--r--kernel/include/arch/x86_64/interrupts/idt.hpp63
-rw-r--r--kernel/include/arch/x86_64/interrupts/irq.hpp28
-rw-r--r--kernel/include/arch/x86_64/interrupts/pic.hpp107
-rw-r--r--kernel/include/arch/x86_64/interrupts/pit.hpp18
-rw-r--r--kernel/include/arch/x86_64/scheduling.hpp460
-rw-r--r--kernel/include/arch/x86_64/syscalls/futex.hpp1
-rw-r--r--kernel/include/arch/x86_64/syscalls/shm.hpp42
-rw-r--r--kernel/include/arch/x86_64/syscalls/signal.hpp288
-rw-r--r--kernel/include/arch/x86_64/syscalls/sockets.hpp156
-rw-r--r--kernel/include/arch/x86_64/syscalls/syscalls.hpp539
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();
- };
- }
-}