kernel: add c++ support
This commit is contained in:
11
Makefile
11
Makefile
@@ -22,7 +22,8 @@ include arch/$(SOCKS_ARCH)/config.mk
|
|||||||
|
|
||||||
KERNEL_SRC_DIRS := init kernel vm ds util obj sched test
|
KERNEL_SRC_DIRS := init kernel vm ds util obj sched test
|
||||||
KERNEL_C_FILES := $(foreach dir,$(KERNEL_SRC_DIRS),$(wildcard $(dir)/*.c))
|
KERNEL_C_FILES := $(foreach dir,$(KERNEL_SRC_DIRS),$(wildcard $(dir)/*.c))
|
||||||
KERNEL_OBJ := $(addprefix $(BUILD_DIR)/,$(KERNEL_C_FILES:.c=.o))
|
KERNEL_CXX_FILES := $(foreach dir,$(KERNEL_SRC_DIRS),$(wildcard $(dir)/*.cpp))
|
||||||
|
KERNEL_OBJ := $(addprefix $(BUILD_DIR)/,$(KERNEL_C_FILES:.c=.o) $(KERNEL_CXX_FILES:.cpp=.o))
|
||||||
|
|
||||||
####################################
|
####################################
|
||||||
# Kernel libc source files
|
# Kernel libc source files
|
||||||
@@ -34,9 +35,10 @@ LIBC_OBJ := $(addprefix $(BUILD_DIR)/,$(LIBC_C_FILES:.c=.o))
|
|||||||
|
|
||||||
BUILD_ID := $(shell tools/generate_build_id.py --arch $(SOCKS_ARCH))
|
BUILD_ID := $(shell tools/generate_build_id.py --arch $(SOCKS_ARCH))
|
||||||
|
|
||||||
CFLAGS := $(CFLAGS) -DBUILD_ID=\"$(BUILD_ID)\" -g -Wall -Werror -pedantic \
|
CFLAGS := $(CFLAGS) -DBUILD_ID=\"$(BUILD_ID)\" -g -Wall -Werror -pedantic -fPIC \
|
||||||
-Iinclude -Iarch/$(SOCKS_ARCH)/include -Ilibc/include -Wno-language-extension-token
|
-Iinclude -Iarch/$(SOCKS_ARCH)/include -Ilibc/include -Wno-language-extension-token
|
||||||
|
|
||||||
|
CXXFLAGS := $(CFLAGS) $(CXXFLAGS)
|
||||||
ASMFLAGS := $(ASMFLAGS) -DBUILD_ID=\"$(BUILD_ID)\"
|
ASMFLAGS := $(ASMFLAGS) -DBUILD_ID=\"$(BUILD_ID)\"
|
||||||
LDFLAGS := $(LDFLAGS) -g -lgcc
|
LDFLAGS := $(LDFLAGS) -g -lgcc
|
||||||
|
|
||||||
@@ -64,6 +66,11 @@ $(BUILD_DIR)/%.o: %.c
|
|||||||
@mkdir -p $(@D)
|
@mkdir -p $(@D)
|
||||||
@$(CC) $< -o $@ -c $(CFLAGS) $(ARCH_CFLAGS) -MMD
|
@$(CC) $< -o $@ -c $(CFLAGS) $(ARCH_CFLAGS) -MMD
|
||||||
|
|
||||||
|
$(BUILD_DIR)/%.o: %.cpp
|
||||||
|
@printf " \033[1;32mCXX\033[0m \033[35m$(KERNEL_EXEC)\033[0m/$<\n"
|
||||||
|
@mkdir -p $(@D)
|
||||||
|
@$(CXX) $< -o $@ -c $(CXXFLAGS) $(ARCH_CXXFLAGS) -MMD
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
@printf " \033[1;93mRM\033[0m Deleting build files.\n"
|
@printf " \033[1;93mRM\033[0m Deleting build files.\n"
|
||||||
@rm -rf $(BUILD_DIR)
|
@rm -rf $(BUILD_DIR)
|
||||||
|
|||||||
@@ -1,6 +1,14 @@
|
|||||||
#ifndef ARCH_STDCON_H_
|
#ifndef ARCH_STDCON_H_
|
||||||
#define ARCH_STDCON_H_
|
#define ARCH_STDCON_H_
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
extern void stdcon_init(void);
|
extern void stdcon_init(void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
#ifndef SOCKS_USER_CPU_H_
|
#ifndef SOCKS_USER_CPU_H_
|
||||||
#define SOCKS_USER_CPU_H_
|
#define SOCKS_USER_CPU_H_
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef struct ml_cpu_block {
|
typedef struct ml_cpu_block {
|
||||||
int cpu_reserved;
|
int cpu_reserved;
|
||||||
} ml_cpu_block;
|
} ml_cpu_block;
|
||||||
@@ -12,4 +16,8 @@ extern int ml_cpu_block_use(ml_cpu_block *p);
|
|||||||
|
|
||||||
extern void ml_halt_cpu(void);
|
extern void ml_halt_cpu(void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -3,6 +3,10 @@
|
|||||||
|
|
||||||
#define ML_HWLOCK_INIT (0)
|
#define ML_HWLOCK_INIT (0)
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef int ml_hwlock_t;
|
typedef int ml_hwlock_t;
|
||||||
|
|
||||||
extern void ml_hwlock_lock(ml_hwlock_t *lck);
|
extern void ml_hwlock_lock(ml_hwlock_t *lck);
|
||||||
@@ -11,4 +15,8 @@ extern void ml_hwlock_unlock(ml_hwlock_t *lck);
|
|||||||
extern void ml_hwlock_lock_irqsave(ml_hwlock_t *lck, unsigned long *flags);
|
extern void ml_hwlock_lock_irqsave(ml_hwlock_t *lck, unsigned long *flags);
|
||||||
extern void ml_hwlock_unlock_irqrestore(ml_hwlock_t *lck, unsigned long flags);
|
extern void ml_hwlock_unlock_irqrestore(ml_hwlock_t *lck, unsigned long flags);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -3,6 +3,10 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
#define __X2(x) #x
|
#define __X2(x) #x
|
||||||
#define __X(x) __X2(x)
|
#define __X(x) __X2(x)
|
||||||
|
|
||||||
@@ -18,4 +22,8 @@
|
|||||||
|
|
||||||
extern int ml_init(uintptr_t arg);
|
extern int ml_init(uintptr_t arg);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -3,6 +3,10 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
extern uintptr_t __pagemap_base(void);
|
extern uintptr_t __pagemap_base(void);
|
||||||
extern uintptr_t __pagemap_limit(void);
|
extern uintptr_t __pagemap_limit(void);
|
||||||
|
|
||||||
@@ -23,4 +27,8 @@ extern uintptr_t __pagemap_limit(void);
|
|||||||
#define VM_PAGE_MIN_ORDER VM_PAGE_4K
|
#define VM_PAGE_MIN_ORDER VM_PAGE_4K
|
||||||
#define VM_PAGE_MAX_ORDER VM_PAGE_8M
|
#define VM_PAGE_MAX_ORDER VM_PAGE_8M
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -15,7 +15,10 @@
|
|||||||
|
|
||||||
static uint32_t *lapic_base;
|
static uint32_t *lapic_base;
|
||||||
|
|
||||||
extern int check_apic(void);
|
extern "C" {
|
||||||
|
/* defined in apic_ctrl.S */
|
||||||
|
extern int check_apic(void);
|
||||||
|
}
|
||||||
|
|
||||||
static uintptr_t apic_get_base(void)
|
static uintptr_t apic_get_base(void)
|
||||||
{
|
{
|
||||||
@@ -78,7 +81,7 @@ kern_status_t local_apic_enable(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
apic_set_base(apic_get_base());
|
apic_set_base(apic_get_base());
|
||||||
lapic_base = find_lapic(madt);
|
lapic_base = (uint32_t *)find_lapic(madt);
|
||||||
|
|
||||||
local_apic_write(0xF0, local_apic_read(0xF0) | 0x100);
|
local_apic_write(0xF0, local_apic_read(0xF0) | 0x100);
|
||||||
|
|
||||||
@@ -104,11 +107,11 @@ static void init_all_ioapic(void)
|
|||||||
|
|
||||||
kern_status_t apic_init(void)
|
kern_status_t apic_init(void)
|
||||||
{
|
{
|
||||||
static int bsp_id = -1;
|
static unsigned int bsp_id = (unsigned int)-1;
|
||||||
|
|
||||||
/* the bootstrap processor will be the first one ro call apic_init().
|
/* the bootstrap processor will be the first one ro call apic_init().
|
||||||
it is responsible for initialising the I/O APICs */
|
it is responsible for initialising the I/O APICs */
|
||||||
if (bsp_id == -1) {
|
if (bsp_id == (unsigned int)-1) {
|
||||||
bsp_id = this_cpu();
|
bsp_id = this_cpu();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5,6 +5,10 @@
|
|||||||
#include <socks/status.h>
|
#include <socks/status.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
#define ACPI_MADT_LAPIC 0x00
|
#define ACPI_MADT_LAPIC 0x00
|
||||||
#define ACPI_MADT_IOAPIC 0x01
|
#define ACPI_MADT_IOAPIC 0x01
|
||||||
#define ACPI_MADT_LAPIC_OVERRIDE 0x05
|
#define ACPI_MADT_LAPIC_OVERRIDE 0x05
|
||||||
@@ -56,12 +60,12 @@ struct acpi_sdt {
|
|||||||
|
|
||||||
struct acpi_rsdt {
|
struct acpi_rsdt {
|
||||||
struct acpi_sdt r_header;
|
struct acpi_sdt r_header;
|
||||||
uint32_t r_tables[];
|
uint32_t r_tables[1];
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
struct acpi_xsdt {
|
struct acpi_xsdt {
|
||||||
struct acpi_sdt x_header;
|
struct acpi_sdt x_header;
|
||||||
uint64_t x_tables[];
|
uint64_t x_tables[1];
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
struct acpi_madt {
|
struct acpi_madt {
|
||||||
@@ -95,4 +99,8 @@ extern kern_status_t smp_init(void);
|
|||||||
|
|
||||||
extern struct acpi_sdt *acpi_find_sdt(uint32_t sig);
|
extern struct acpi_sdt *acpi_find_sdt(uint32_t sig);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -4,6 +4,14 @@
|
|||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <arch/multiboot.h>
|
#include <arch/multiboot.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
extern void e820_scan(multiboot_memory_map_t *mmap, size_t len);
|
extern void e820_scan(multiboot_memory_map_t *mmap, size_t len);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -4,6 +4,10 @@
|
|||||||
#include <socks/compiler.h>
|
#include <socks/compiler.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
#define NR_GDT_ENTRIES 5
|
#define NR_GDT_ENTRIES 5
|
||||||
|
|
||||||
#define GDT_A_PRESENT (1 << 7)
|
#define GDT_A_PRESENT (1 << 7)
|
||||||
@@ -39,4 +43,8 @@ struct gdt_ptr {
|
|||||||
extern int gdt_init(struct gdt *gdt, struct gdt_ptr *gdtp);
|
extern int gdt_init(struct gdt *gdt, struct gdt_ptr *gdtp);
|
||||||
extern int gdt_load(struct gdt_ptr *gdtp);
|
extern int gdt_load(struct gdt_ptr *gdtp);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -5,6 +5,10 @@
|
|||||||
#include <socks/queue.h>
|
#include <socks/queue.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
#define NR_IDT_ENTRIES 48
|
#define NR_IDT_ENTRIES 48
|
||||||
|
|
||||||
typedef enum irq_vector {
|
typedef enum irq_vector {
|
||||||
@@ -68,4 +72,8 @@ extern int idt_load(struct idt_ptr *idtp);
|
|||||||
extern void hook_irq(irq_vector_t vec, irq_hook_t *hook);
|
extern void hook_irq(irq_vector_t vec, irq_hook_t *hook);
|
||||||
extern void unhook_irq(irq_vector_t vec, irq_hook_t *hook);
|
extern void unhook_irq(irq_vector_t vec, irq_hook_t *hook);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -5,8 +5,16 @@
|
|||||||
|
|
||||||
#define MSR_GS_BASE 0xC0000101
|
#define MSR_GS_BASE 0xC0000101
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
/* defined in cpu_ctrl.S */
|
/* defined in cpu_ctrl.S */
|
||||||
extern uint64_t rdmsr(uint32_t id);
|
extern uint64_t rdmsr(uint32_t id);
|
||||||
extern void wrmsr(uint32_t id, uint64_t val);
|
extern void wrmsr(uint32_t id, uint64_t val);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -4,6 +4,10 @@
|
|||||||
#include <socks/types.h>
|
#include <socks/types.h>
|
||||||
#include <socks/compiler.h>
|
#include <socks/compiler.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
#define PTE_PRESENT 0x01ULL
|
#define PTE_PRESENT 0x01ULL
|
||||||
#define PTE_RW 0x02ULL
|
#define PTE_RW 0x02ULL
|
||||||
#define PTE_USR 0x04ULL
|
#define PTE_USR 0x04ULL
|
||||||
@@ -52,4 +56,8 @@ typedef enum page_size {
|
|||||||
extern int gigabyte_pages(void);
|
extern int gigabyte_pages(void);
|
||||||
extern int enable_nx(void);
|
extern int enable_nx(void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,8 +1,16 @@
|
|||||||
#ifndef ARCH_PIT_H_
|
#ifndef ARCH_PIT_H_
|
||||||
#define ARCH_PIT_H_
|
#define ARCH_PIT_H_
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
extern void pit_start(unsigned int hz);
|
extern void pit_start(unsigned int hz);
|
||||||
extern void pit_stop(void);
|
extern void pit_stop(void);
|
||||||
extern void pit_wait(unsigned int ticks);
|
extern void pit_wait(unsigned int ticks);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -3,6 +3,10 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
extern uint8_t inportb(uint16_t port);
|
extern uint8_t inportb(uint16_t port);
|
||||||
extern uint16_t inportw(uint16_t port);
|
extern uint16_t inportw(uint16_t port);
|
||||||
extern uint32_t inportl(uint16_t port);
|
extern uint32_t inportl(uint16_t port);
|
||||||
@@ -12,4 +16,8 @@ extern void outportl(uint16_t port, uint32_t data);
|
|||||||
extern void outportsw(uint16_t port, void *data, uint32_t size);
|
extern void outportsw(uint16_t port, void *data, uint32_t size);
|
||||||
extern void inportsw(uint16_t port, unsigned char *data, unsigned long size);
|
extern void inportsw(uint16_t port, unsigned char *data, unsigned long size);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
#ifndef ARCH_SERIAL_H_
|
#ifndef ARCH_SERIAL_H_
|
||||||
#define ARCH_SERIAL_H_
|
#define ARCH_SERIAL_H_
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
#define SERIAL_PORT_A 0x3F8
|
#define SERIAL_PORT_A 0x3F8
|
||||||
#define SERIAL_PORT_B 0x2F8
|
#define SERIAL_PORT_B 0x2F8
|
||||||
#define SERIAL_PORT_C 0x3E8
|
#define SERIAL_PORT_C 0x3E8
|
||||||
@@ -14,4 +18,8 @@ extern char serial_recv_byte(int device);
|
|||||||
|
|
||||||
extern int serial_rcvd(int device);
|
extern int serial_rcvd(int device);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,6 +1,14 @@
|
|||||||
#ifndef ARCH_VGACON_H_
|
#ifndef ARCH_VGACON_H_
|
||||||
#define ARCH_VGACON_H_
|
#define ARCH_VGACON_H_
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
extern void vgacon_init(void);
|
extern void vgacon_init(void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -4,6 +4,10 @@
|
|||||||
#include <arch/gdt.h>
|
#include <arch/gdt.h>
|
||||||
#include <arch/irq.h>
|
#include <arch/irq.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
#define ml_cpu_block_get_id(p) ((p)->c_cpu_id)
|
#define ml_cpu_block_get_id(p) ((p)->c_cpu_id)
|
||||||
|
|
||||||
typedef struct ml_cpu_block {
|
typedef struct ml_cpu_block {
|
||||||
@@ -28,4 +32,8 @@ extern int ml_cpu_block_use(ml_cpu_block *p);
|
|||||||
extern void ml_halt_cpu(void);
|
extern void ml_halt_cpu(void);
|
||||||
extern ml_cpu_block *ml_this_cpu(void);
|
extern ml_cpu_block *ml_this_cpu(void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -3,6 +3,10 @@
|
|||||||
|
|
||||||
#define ML_HWLOCK_INIT (0)
|
#define ML_HWLOCK_INIT (0)
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef int ml_hwlock_t;
|
typedef int ml_hwlock_t;
|
||||||
|
|
||||||
extern void ml_hwlock_lock(ml_hwlock_t *lck);
|
extern void ml_hwlock_lock(ml_hwlock_t *lck);
|
||||||
@@ -11,4 +15,8 @@ extern void ml_hwlock_unlock(ml_hwlock_t *lck);
|
|||||||
extern void ml_hwlock_lock_irqsave(ml_hwlock_t *lck, unsigned long *flags);
|
extern void ml_hwlock_lock_irqsave(ml_hwlock_t *lck, unsigned long *flags);
|
||||||
extern void ml_hwlock_unlock_irqrestore(ml_hwlock_t *lck, unsigned long flags);
|
extern void ml_hwlock_unlock_irqrestore(ml_hwlock_t *lck, unsigned long flags);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -3,6 +3,10 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
#define __X2(x) #x
|
#define __X2(x) #x
|
||||||
#define __X(x) __X2(x)
|
#define __X(x) __X2(x)
|
||||||
|
|
||||||
@@ -12,4 +16,8 @@
|
|||||||
|
|
||||||
extern int ml_init(uintptr_t arg);
|
extern int ml_init(uintptr_t arg);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -3,6 +3,10 @@
|
|||||||
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
#define BITS_PER_WORD (8 * sizeof(unsigned long))
|
#define BITS_PER_WORD (8 * sizeof(unsigned long))
|
||||||
#define __DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
|
#define __DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
|
||||||
#define BITMAP_WORDS(nbits) __DIV_ROUND_UP(nbits, BITS_PER_WORD)
|
#define BITMAP_WORDS(nbits) __DIV_ROUND_UP(nbits, BITS_PER_WORD)
|
||||||
@@ -23,4 +27,8 @@ extern unsigned int bitmap_highest_clear(unsigned long *map, unsigned long nbits
|
|||||||
extern unsigned int bitmap_lowest_set(unsigned long *map, unsigned long nbits);
|
extern unsigned int bitmap_lowest_set(unsigned long *map, unsigned long nbits);
|
||||||
extern unsigned int bitmap_lowest_clear(unsigned long *map, unsigned long nbits);
|
extern unsigned int bitmap_lowest_clear(unsigned long *map, unsigned long nbits);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -25,6 +25,10 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
/* if your custom structure contains a btree_node_t (i.e. it can be part of a btree),
|
/* if your custom structure contains a btree_node_t (i.e. it can be part of a btree),
|
||||||
you can use this macro to convert a btree_node_t* to a your_type*
|
you can use this macro to convert a btree_node_t* to a your_type*
|
||||||
|
|
||||||
@@ -370,4 +374,8 @@ static inline unsigned short btree_height(btree_node_t *node)
|
|||||||
return node->b_height;
|
return node->b_height;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -18,6 +18,10 @@
|
|||||||
#include <socks/locks.h>
|
#include <socks/locks.h>
|
||||||
#include <socks/status.h>
|
#include <socks/status.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef enum console_flags {
|
typedef enum console_flags {
|
||||||
/* console is only used during the boot process. the console
|
/* console is only used during the boot process. the console
|
||||||
will be automatically de-registered when the first
|
will be automatically de-registered when the first
|
||||||
@@ -42,4 +46,8 @@ extern kern_status_t console_unregister(console_t *con);
|
|||||||
extern void console_write(console_t *con, const char *s, unsigned int len);
|
extern void console_write(console_t *con, const char *s, unsigned int len);
|
||||||
extern int console_read(console_t *con, char *s, unsigned int len);
|
extern int console_read(console_t *con, char *s, unsigned int len);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -4,6 +4,10 @@
|
|||||||
#include <socks/machine/cpu.h>
|
#include <socks/machine/cpu.h>
|
||||||
#include <socks/sched.h>
|
#include <socks/sched.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef enum cpu_flags {
|
typedef enum cpu_flags {
|
||||||
CPU_ONLINE = 0x01u,
|
CPU_ONLINE = 0x01u,
|
||||||
} cpu_flags_t;
|
} cpu_flags_t;
|
||||||
@@ -30,4 +34,8 @@ extern void cpu_set_online(unsigned int cpu_id);
|
|||||||
|
|
||||||
extern unsigned int cpu_get_highest_available(void);
|
extern unsigned int cpu_get_highest_available(void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -4,6 +4,10 @@
|
|||||||
#include <socks/compiler.h>
|
#include <socks/compiler.h>
|
||||||
#include <socks/machine/init.h>
|
#include <socks/machine/init.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef int (*initcall_t)(void);
|
typedef int (*initcall_t)(void);
|
||||||
|
|
||||||
#define INITLEVEL_EARLY 0
|
#define INITLEVEL_EARLY 0
|
||||||
@@ -30,4 +34,8 @@ extern void print_kernel_banner(void);
|
|||||||
extern int do_initcalls(void);
|
extern int do_initcalls(void);
|
||||||
extern int start_initlevel(int level);
|
extern int start_initlevel(int level);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -4,6 +4,10 @@
|
|||||||
#include <socks/compiler.h>
|
#include <socks/compiler.h>
|
||||||
#include <socks/machine/hwlock.h>
|
#include <socks/machine/hwlock.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef __aligned(8) ml_hwlock_t spin_lock_t;
|
typedef __aligned(8) ml_hwlock_t spin_lock_t;
|
||||||
|
|
||||||
#define SPIN_LOCK_INIT ML_HWLOCK_INIT
|
#define SPIN_LOCK_INIT ML_HWLOCK_INIT
|
||||||
@@ -11,4 +15,8 @@ typedef __aligned(8) ml_hwlock_t spin_lock_t;
|
|||||||
#define spin_lock_irqsave(lck, flags) ml_hwlock_lock_irqsave(lck, flags);
|
#define spin_lock_irqsave(lck, flags) ml_hwlock_lock_irqsave(lck, flags);
|
||||||
#define spin_unlock_irqrestore(lck, flags) ml_hwlock_unlock_irqrestore(lck, flags);
|
#define spin_unlock_irqrestore(lck, flags) ml_hwlock_unlock_irqrestore(lck, flags);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -26,6 +26,10 @@
|
|||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <socks/types.h>
|
#include <socks/types.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
#define MEMBLOCK_INIT_MEMORY_REGION_COUNT 128
|
#define MEMBLOCK_INIT_MEMORY_REGION_COUNT 128
|
||||||
#define MEMBLOCK_INIT_RESERVED_REGION_COUNT 128
|
#define MEMBLOCK_INIT_RESERVED_REGION_COUNT 128
|
||||||
|
|
||||||
@@ -319,4 +323,8 @@ extern void __next_memory_region(memblock_iter_t *it, \
|
|||||||
memblock_type_t *type_a, memblock_type_t *type_b,
|
memblock_type_t *type_a, memblock_type_t *type_b,
|
||||||
phys_addr_t start, phys_addr_t end);
|
phys_addr_t start, phys_addr_t end);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -6,6 +6,10 @@
|
|||||||
#include <socks/vm.h>
|
#include <socks/vm.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
#define OBJECT_MAGIC 0xBADDCAFE
|
#define OBJECT_MAGIC 0xBADDCAFE
|
||||||
#define OBJECT_NAME_MAX 64
|
#define OBJECT_NAME_MAX 64
|
||||||
|
|
||||||
@@ -19,7 +23,7 @@ typedef enum object_type_flags {
|
|||||||
typedef struct object_ops {
|
typedef struct object_ops {
|
||||||
kern_status_t(*open)(struct object *obj);
|
kern_status_t(*open)(struct object *obj);
|
||||||
kern_status_t(*close)(struct object *obj);
|
kern_status_t(*close)(struct object *obj);
|
||||||
kern_status_t(*delete)(struct object *obj);
|
kern_status_t(*destroy)(struct object *obj);
|
||||||
kern_status_t(*query_name)(struct object *obj, char out[OBJECT_NAME_MAX]);
|
kern_status_t(*query_name)(struct object *obj, char out[OBJECT_NAME_MAX]);
|
||||||
kern_status_t(*parse)(struct object *obj, const char *path, struct object **out);
|
kern_status_t(*parse)(struct object *obj, const char *path, struct object **out);
|
||||||
kern_status_t(*get_named)(struct object *obj, const char *name, struct object **out);
|
kern_status_t(*get_named)(struct object *obj, const char *name, struct object **out);
|
||||||
@@ -89,4 +93,8 @@ extern bool object_is_set(object_t *obj);
|
|||||||
extern void init_set_objects(void);
|
extern void init_set_objects(void);
|
||||||
extern void init_global_namespace(void);
|
extern void init_global_namespace(void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -4,6 +4,10 @@
|
|||||||
#include <socks/status.h>
|
#include <socks/status.h>
|
||||||
#include <socks/compiler.h>
|
#include <socks/compiler.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
#define DEFINE_PERCPU_VAR(type, name) \
|
#define DEFINE_PERCPU_VAR(type, name) \
|
||||||
__section(".data.percpu") type name
|
__section(".data.percpu") type name
|
||||||
|
|
||||||
@@ -14,4 +18,8 @@
|
|||||||
extern kern_status_t init_per_cpu_areas(void);
|
extern kern_status_t init_per_cpu_areas(void);
|
||||||
extern void *__percpu_get(void *var);
|
extern void *__percpu_get(void *var);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -10,6 +10,10 @@
|
|||||||
|
|
||||||
#define PFN(x) ((x) >> VM_PAGE_SHIFT)
|
#define PFN(x) ((x) >> VM_PAGE_SHIFT)
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef ml_pmap_t pmap_t;
|
typedef ml_pmap_t pmap_t;
|
||||||
typedef ml_pfn_t pfn_t;
|
typedef ml_pfn_t pfn_t;
|
||||||
|
|
||||||
@@ -30,4 +34,8 @@ extern kern_status_t pmap_add_block(pmap_t pmap, void *p, pfn_t pfn, size_t len,
|
|||||||
extern kern_status_t pmap_remove(pmap_t pmap, void *p);
|
extern kern_status_t pmap_remove(pmap_t pmap, void *p);
|
||||||
extern kern_status_t pmap_remove_range(pmap_t pmap, void *p, size_t len);
|
extern kern_status_t pmap_remove_range(pmap_t pmap, void *p, size_t len);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -3,7 +3,15 @@
|
|||||||
|
|
||||||
#include <socks/console.h>
|
#include <socks/console.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
extern void early_printk_init(console_t *con);
|
extern void early_printk_init(console_t *con);
|
||||||
extern int printk(const char *format, ...);
|
extern int printk(const char *format, ...);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -4,6 +4,10 @@
|
|||||||
#include <socks/libc/string.h>
|
#include <socks/libc/string.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
#define QUEUE_CONTAINER(t, m, v) ((void *)((v) ? (uintptr_t)(v) - (offsetof(t, m)) : 0))
|
#define QUEUE_CONTAINER(t, m, v) ((void *)((v) ? (uintptr_t)(v) - (offsetof(t, m)) : 0))
|
||||||
|
|
||||||
#define QUEUE_INIT ((queue_t){ .q_first = NULL, .q_last = NULL })
|
#define QUEUE_INIT ((queue_t){ .q_first = NULL, .q_last = NULL })
|
||||||
@@ -51,4 +55,8 @@ extern queue_entry_t *queue_pop_back(queue_t *q);
|
|||||||
extern void queue_delete(queue_t *q, queue_entry_t *entry);
|
extern void queue_delete(queue_t *q, queue_entry_t *entry);
|
||||||
extern void queue_delete_all(queue_t *q);
|
extern void queue_delete_all(queue_t *q);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -11,6 +11,10 @@
|
|||||||
#define TASK_NAME_MAX 64
|
#define TASK_NAME_MAX 64
|
||||||
#define PRIO_MAX 32
|
#define PRIO_MAX 32
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef enum task_state {
|
typedef enum task_state {
|
||||||
TASK_RUNNING,
|
TASK_RUNNING,
|
||||||
TASK_STOPPED,
|
TASK_STOPPED,
|
||||||
@@ -73,7 +77,7 @@ extern kern_status_t sched_init(void);
|
|||||||
extern void runqueue_init(runqueue_t *rq);
|
extern void runqueue_init(runqueue_t *rq);
|
||||||
|
|
||||||
extern task_t *task_alloc(void);
|
extern task_t *task_alloc(void);
|
||||||
static inline task_t *task_ref(task_t *task) { return object_data(object_ref(object_header(task))); }
|
static inline task_t *task_ref(task_t *task) { return (task_t *)object_data(object_ref(object_header(task))); }
|
||||||
static inline void task_deref(task_t *task) { object_deref(object_header(task)); }
|
static inline void task_deref(task_t *task) { object_deref(object_header(task)); }
|
||||||
extern task_t *task_from_pid(unsigned int pid);
|
extern task_t *task_from_pid(unsigned int pid);
|
||||||
extern task_t *kernel_task(void);
|
extern task_t *kernel_task(void);
|
||||||
@@ -90,4 +94,8 @@ static inline void task_unlock_irqrestore(task_t *task, unsigned long flags)
|
|||||||
|
|
||||||
extern thread_t *thread_alloc(void);
|
extern thread_t *thread_alloc(void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,6 +1,14 @@
|
|||||||
#ifndef SOCKS_TEST_H_
|
#ifndef SOCKS_TEST_H_
|
||||||
#define SOCKS_TEST_H_
|
#define SOCKS_TEST_H_
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
extern int run_all_tests(void);
|
extern int run_all_tests(void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -20,6 +20,10 @@
|
|||||||
device, a serial port, etc.
|
device, a serial port, etc.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
/* opaque context pointer for use by the tty driver */
|
/* opaque context pointer for use by the tty driver */
|
||||||
typedef void *tty_driver_ctx_t;
|
typedef void *tty_driver_ctx_t;
|
||||||
|
|
||||||
@@ -84,4 +88,8 @@ extern void tty_destroy(tty_t *tty);
|
|||||||
extern int tty_read(tty_t *tty, char *s, unsigned long len);
|
extern int tty_read(tty_t *tty, char *s, unsigned long len);
|
||||||
extern int tty_write(tty_t *tty, const char *s, unsigned long len);
|
extern int tty_write(tty_t *tty, const char *s, unsigned long len);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -5,6 +5,10 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
extern void data_size_to_string(size_t value, char *out, size_t outsz);
|
extern void data_size_to_string(size_t value, char *out, size_t outsz);
|
||||||
static inline bool power_of_2(size_t x) { return (x > 0 && (x & (x - 1)) == 0); }
|
static inline bool power_of_2(size_t x) { return (x > 0 && (x & (x - 1)) == 0); }
|
||||||
static inline unsigned long long div64_pow2(unsigned long long x, unsigned long long y)
|
static inline unsigned long long div64_pow2(unsigned long long x, unsigned long long y)
|
||||||
@@ -17,4 +21,8 @@ static inline unsigned long long absdiff64(unsigned long long x, unsigned long l
|
|||||||
return x > y ? y - x : x - y;
|
return x > y ? y - x : x - y;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -8,6 +8,10 @@
|
|||||||
#include <socks/locks.h>
|
#include <socks/locks.h>
|
||||||
#include <socks/machine/vm.h>
|
#include <socks/machine/vm.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
/* maximum number of NUMA nodes */
|
/* maximum number of NUMA nodes */
|
||||||
#define VM_MAX_NODES 64
|
#define VM_MAX_NODES 64
|
||||||
/* maximum number of memory zones per node */
|
/* maximum number of memory zones per node */
|
||||||
@@ -185,8 +189,9 @@ typedef struct vm_slab {
|
|||||||
when freeing:
|
when freeing:
|
||||||
- s_free should be set to the index of the object being freed.
|
- s_free should be set to the index of the object being freed.
|
||||||
- s_freelist[s_free] should be set to the previous value of s_free.
|
- s_freelist[s_free] should be set to the previous value of s_free.
|
||||||
|
this is commented as it as flexible arrays are not supported in c++.
|
||||||
*/
|
*/
|
||||||
unsigned int s_freelist[];
|
//unsigned int s_freelist[];
|
||||||
} vm_slab_t;
|
} vm_slab_t;
|
||||||
|
|
||||||
typedef struct vm_page {
|
typedef struct vm_page {
|
||||||
@@ -212,9 +217,7 @@ typedef struct vm_page {
|
|||||||
|
|
||||||
/* owner-specific data */
|
/* owner-specific data */
|
||||||
union {
|
union {
|
||||||
struct {
|
vm_slab_t *p_slab;
|
||||||
vm_slab_t *p_slab;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} __attribute__((aligned(2 * sizeof(unsigned long)))) vm_page_t;
|
} __attribute__((aligned(2 * sizeof(unsigned long)))) vm_page_t;
|
||||||
@@ -287,4 +290,8 @@ extern void vm_sparse_init(void);
|
|||||||
extern vm_page_t *vm_page_get_sparse(phys_addr_t addr);
|
extern vm_page_t *vm_page_get_sparse(phys_addr_t addr);
|
||||||
extern size_t vm_page_get_pfn_sparse(vm_page_t *pg);
|
extern size_t vm_page_get_pfn_sparse(vm_page_t *pg);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -85,8 +85,8 @@ void object_deref(object_t *obj)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (HAS_OP(obj, delete)) {
|
if (HAS_OP(obj, destroy)) {
|
||||||
obj->ob_type->ob_ops.delete(obj);
|
obj->ob_type->ob_ops.destroy(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
vm_cache_free(&obj->ob_type->ob_cache, obj);
|
vm_cache_free(&obj->ob_type->ob_cache, obj);
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
LD := gcc
|
LD := gcc
|
||||||
CC := gcc
|
CC := gcc
|
||||||
|
CXX := g++
|
||||||
ASM := gcc
|
ASM := gcc
|
||||||
|
|
||||||
CFLAGS := -Wall -Werror -pedantic
|
CFLAGS := -Wall -Werror -pedantic
|
||||||
|
CXXFLAGS := $(CFLAGS)
|
||||||
ASMFLAGS := $(CFLAGS)
|
ASMFLAGS := $(CFLAGS)
|
||||||
LDFLAGS := -O2
|
LDFLAGS := -O2
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import os
|
|||||||
|
|
||||||
|
|
||||||
def is_source_file(filepath):
|
def is_source_file(filepath):
|
||||||
return filepath.endswith('.c') or filepath.endswith('.h') or filepath.endswith('.S')
|
return filepath.endswith('.c') or filepath.endswith('.cpp') or filepath.endswith('.h') or filepath.endswith('.S')
|
||||||
|
|
||||||
dir_stack = []
|
dir_stack = []
|
||||||
rootdir = os.getcwd()
|
rootdir = os.getcwd()
|
||||||
@@ -30,7 +30,7 @@ for line in make_output_lines:
|
|||||||
dir_stack.pop()
|
dir_stack.pop()
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if 'gcc' not in line_parts[0]:
|
if 'gcc' not in line_parts[0] and 'g++' not in line_parts[0]:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
src_file = ''
|
src_file = ''
|
||||||
|
|||||||
12
vm/cache.c
12
vm/cache.c
@@ -106,11 +106,12 @@ static vm_slab_t *alloc_slab(vm_cache_t *cache, vm_flags_t flags)
|
|||||||
slab_hdr->s_obj_allocated = 0;
|
slab_hdr->s_obj_allocated = 0;
|
||||||
slab_hdr->s_free = 0;
|
slab_hdr->s_free = 0;
|
||||||
|
|
||||||
|
unsigned int *freelist = (unsigned int *)(slab_hdr + 1);
|
||||||
for (unsigned int i = 0; i < cache->c_obj_count; i++) {
|
for (unsigned int i = 0; i < cache->c_obj_count; i++) {
|
||||||
slab_hdr->s_freelist[i] = i + 1;
|
freelist[i] = i + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
slab_hdr->s_freelist[cache->c_obj_count - 1] = FREELIST_END;
|
freelist[cache->c_obj_count - 1] = FREELIST_END;
|
||||||
|
|
||||||
vm_page_foreach (slab_page, i) {
|
vm_page_foreach (slab_page, i) {
|
||||||
i->p_slab = slab_hdr;
|
i->p_slab = slab_hdr;
|
||||||
@@ -131,7 +132,8 @@ static unsigned int slab_allocate_slot(vm_slab_t *slab)
|
|||||||
}
|
}
|
||||||
|
|
||||||
unsigned int slot = slab->s_free;
|
unsigned int slot = slab->s_free;
|
||||||
slab->s_free = slab->s_freelist[slab->s_free];
|
unsigned int *freelist = (unsigned int *)(slab + 1);
|
||||||
|
slab->s_free = freelist[slab->s_free];
|
||||||
slab->s_obj_allocated++;
|
slab->s_obj_allocated++;
|
||||||
|
|
||||||
return slot;
|
return slot;
|
||||||
@@ -140,8 +142,10 @@ static unsigned int slab_allocate_slot(vm_slab_t *slab)
|
|||||||
static void slab_free_slot(vm_slab_t *slab, unsigned int slot)
|
static void slab_free_slot(vm_slab_t *slab, unsigned int slot)
|
||||||
{
|
{
|
||||||
unsigned int next = slab->s_free;
|
unsigned int next = slab->s_free;
|
||||||
|
unsigned int *freelist = (unsigned int *)(slab + 1);
|
||||||
|
|
||||||
slab->s_free = slot;
|
slab->s_free = slot;
|
||||||
slab->s_freelist[slot] = next;
|
freelist[slot] = next;
|
||||||
slab->s_obj_allocated--;
|
slab->s_obj_allocated--;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user