kernel: add c++ support

This commit is contained in:
2023-03-20 20:41:39 +00:00
parent a4d850cc03
commit 2bfb6bcd78
41 changed files with 333 additions and 38 deletions

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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();
} }

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -14,7 +14,7 @@
- Redistributions in binary form must reproduce the above copyright - Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution. documentation and/or other materials provided with the distribution.
- Neither the name of the copyright holder nor the names of its - Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from this contributors may be used to endorse or promote products derived from this
software without specific prior written permission. software without specific prior written permission.
@@ -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*
@@ -94,8 +98,8 @@
} \ } \
\ \
btree_insert_fixup(tree, &node->container_node_member); \ btree_insert_fixup(tree, &node->container_node_member); \
} }
/* defines a node insertion function. /* defines a node insertion function.
this function should be used for trees with complex node keys that cannot be directly compared. this function should be used for trees with complex node keys that cannot be directly compared.
a comparator for your keys must be supplied. a comparator for your keys must be supplied.
@@ -114,9 +118,9 @@
Which implements the following: Which implements the following:
return -1 if a < b return -1 if a < b
return 0 if a == b return 0 if a == b
return 1 if a > b return 1 if a > b
You would use the following call to generate an insert function for a tree with this node type: You would use the following call to generate an insert function for a tree with this node 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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -14,7 +14,7 @@
- Redistributions in binary form must reproduce the above copyright - Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution. documentation and/or other materials provided with the distribution.
- Neither the name of the copyright holder nor the names of its - Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from this contributors may be used to endorse or promote products derived from this
software without specific prior written permission. software without specific prior written permission.
@@ -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
@@ -50,7 +54,7 @@
if you don't want to use an upper bound, pass UINTPTR_MAX. if you don't want to use an upper bound, pass UINTPTR_MAX.
EXAMPLE: to iterate through all memory regions (with no bounds): EXAMPLE: to iterate through all memory regions (with no bounds):
memblock_iter_t it; memblock_iter_t it;
for_each_mem_region (&it, 0x0, UINTPTR_MAX) { ... } for_each_mem_region (&it, 0x0, UINTPTR_MAX) { ... }
@@ -80,7 +84,7 @@
if you don't want to use an upper bound, pass UINTPTR_MAX. if you don't want to use an upper bound, pass UINTPTR_MAX.
EXAMPLE: to iterate through all reserved memory regions (with no bounds): EXAMPLE: to iterate through all reserved memory regions (with no bounds):
memblock_iter_t it; memblock_iter_t it;
for_each_reserved_mem_region (&it, 0x0, UINTPTR_MAX) { ... } for_each_reserved_mem_region (&it, 0x0, UINTPTR_MAX) { ... }
@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -24,10 +24,10 @@ kern_status_t object_type_register(object_type_t *p)
p->ob_cache.c_name = p->ob_name; p->ob_cache.c_name = p->ob_name;
p->ob_cache.c_obj_size = sizeof(object_t) + p->ob_size; p->ob_cache.c_obj_size = sizeof(object_t) + p->ob_size;
p->ob_cache.c_page_order = VM_PAGE_16K; p->ob_cache.c_page_order = VM_PAGE_16K;
vm_cache_init(&p->ob_cache); vm_cache_init(&p->ob_cache);
p->ob_flags |= OBJTYPE_INIT; p->ob_flags |= OBJTYPE_INIT;
return KERN_OK; return KERN_OK;
} }
@@ -46,7 +46,7 @@ object_t *object_create(object_type_t *type)
if (!(type->ob_flags & OBJTYPE_INIT)) { if (!(type->ob_flags & OBJTYPE_INIT)) {
return NULL; return NULL;
} }
vm_cache_t *cache = &type->ob_cache; vm_cache_t *cache = &type->ob_cache;
object_t *obj = vm_cache_alloc(cache, 0); object_t *obj = vm_cache_alloc(cache, 0);
if (!obj) { if (!obj) {
@@ -58,7 +58,7 @@ object_t *object_create(object_type_t *type)
obj->ob_magic = OBJECT_MAGIC; obj->ob_magic = OBJECT_MAGIC;
obj->ob_refcount = 1; obj->ob_refcount = 1;
obj->ob_handles = 0; obj->ob_handles = 0;
return obj; return obj;
} }
@@ -72,7 +72,7 @@ void object_deref(object_t *obj)
{ {
unsigned long flags; unsigned long flags;
spin_lock_irqsave(&obj->ob_lock, &flags); spin_lock_irqsave(&obj->ob_lock, &flags);
if (obj->ob_refcount == 0) { if (obj->ob_refcount == 0) {
spin_unlock_irqrestore(&obj->ob_lock, flags); spin_unlock_irqrestore(&obj->ob_lock, flags);
return; return;
@@ -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);
@@ -120,7 +120,7 @@ object_t *object_header(void *p)
kern_status_t object_get_child_named(object_t *obj, const char *name, object_t **out) kern_status_t object_get_child_named(object_t *obj, const char *name, object_t **out)
{ {
kern_status_t status = KERN_UNSUPPORTED; kern_status_t status = KERN_UNSUPPORTED;
if (HAS_OP(obj, get_named)) { if (HAS_OP(obj, get_named)) {
status = obj->ob_type->ob_ops.get_named(obj, name, out); status = obj->ob_type->ob_ops.get_named(obj, name, out);
} }
@@ -131,7 +131,7 @@ kern_status_t object_get_child_named(object_t *obj, const char *name, object_t *
kern_status_t object_get_child_at(object_t *obj, size_t at, object_t **out) kern_status_t object_get_child_at(object_t *obj, size_t at, object_t **out)
{ {
kern_status_t status = KERN_UNSUPPORTED; kern_status_t status = KERN_UNSUPPORTED;
if (HAS_OP(obj, get_at)) { if (HAS_OP(obj, get_at)) {
status = obj->ob_type->ob_ops.get_at(obj, at, out); status = obj->ob_type->ob_ops.get_at(obj, at, out);
} }

View File

@@ -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

View File

@@ -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 = ''

View File

@@ -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--;
} }