kernel: add header files
This commit is contained in:
77
arch/x86_64/include/kernel/machine/cpu.h
Normal file
77
arch/x86_64/include/kernel/machine/cpu.h
Normal file
@@ -0,0 +1,77 @@
|
||||
#ifndef KERNEL_X86_64_CPU_H_
|
||||
#define KERNEL_X86_64_CPU_H_
|
||||
|
||||
#include <arch/gdt.h>
|
||||
#include <arch/irq.h>
|
||||
#include <arch/tss.h>
|
||||
#include <kernel/types.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define ML_BIG_ENDIAN 0
|
||||
|
||||
#define ml_cpu_block_get_id(p) ((p)->c_cpu_id)
|
||||
#define ml_cpu_block_get_data(p) ((p)->c_data)
|
||||
|
||||
#if 0
|
||||
#define ml_read_sp(sp, bp) \
|
||||
asm volatile("mov %%rsp, %0" : "=r"(sp)); \
|
||||
asm volatile("mov %%rbp, %0" : "=r"(bp));
|
||||
#endif
|
||||
|
||||
struct cpu_data;
|
||||
|
||||
typedef struct ml_cpu_block {
|
||||
struct ml_cpu_block *c_this;
|
||||
|
||||
struct gdt c_gdt;
|
||||
struct gdt_ptr c_gdt_ptr;
|
||||
|
||||
struct tss c_tss;
|
||||
struct tss_ptr c_tss_ptr;
|
||||
|
||||
struct idt_ptr c_idt_ptr;
|
||||
unsigned int c_cpu_id;
|
||||
|
||||
struct cpu_data *c_data;
|
||||
} ml_cpu_block;
|
||||
|
||||
struct ml_int_context {
|
||||
uint64_t rip, cs, rflags, rsp, ss;
|
||||
};
|
||||
|
||||
struct ml_cpu_context {
|
||||
uint64_t r15, r14, r13, r12, r11, r10, r9, r8;
|
||||
uint64_t rdi, rsi, rbp, unused_rsp, rbx, rdx, rcx, rax;
|
||||
uint64_t int_no, err_no;
|
||||
uint64_t rip, cs, rflags, rsp, ss;
|
||||
} __packed;
|
||||
|
||||
#define ml_cpu_pause() __asm__ __volatile__("hlt")
|
||||
#define ml_cpu_relax() __asm__ __volatile__("pause")
|
||||
|
||||
#define ml_int_disable() __asm__ __volatile__("cli")
|
||||
#define ml_int_enable() __asm__ __volatile__("sti")
|
||||
|
||||
extern int ml_init_bootcpu(void);
|
||||
|
||||
extern int ml_cpu_block_init(ml_cpu_block *p);
|
||||
extern int ml_cpu_block_use(ml_cpu_block *p);
|
||||
|
||||
extern virt_addr_t ml_cpu_block_get_ustack(ml_cpu_block *p);
|
||||
extern virt_addr_t ml_cpu_block_get_kstack(ml_cpu_block *p);
|
||||
|
||||
extern void ml_cpu_block_set_ustack(ml_cpu_block *p, virt_addr_t sp);
|
||||
extern void ml_cpu_block_set_kstack(ml_cpu_block *p, virt_addr_t sp);
|
||||
|
||||
/* defined in cpu_ctrl.S */
|
||||
extern void ml_halt_cpu(void);
|
||||
extern ml_cpu_block *ml_this_cpu(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
22
arch/x86_64/include/kernel/machine/hwlock.h
Normal file
22
arch/x86_64/include/kernel/machine/hwlock.h
Normal file
@@ -0,0 +1,22 @@
|
||||
#ifndef KERNEL_X86_64_HWLOCK_H_
|
||||
#define KERNEL_X86_64_HWLOCK_H_
|
||||
|
||||
#define ML_HWLOCK_INIT (0)
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef int ml_hwlock_t;
|
||||
|
||||
extern void ml_hwlock_lock(ml_hwlock_t *lck);
|
||||
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_unlock_irqrestore(ml_hwlock_t *lck, unsigned long flags);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
28
arch/x86_64/include/kernel/machine/init.h
Normal file
28
arch/x86_64/include/kernel/machine/init.h
Normal file
@@ -0,0 +1,28 @@
|
||||
#ifndef KERNEL_X86_64_INIT_H_
|
||||
#define KERNEL_X86_64_INIT_H_
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define __X2(x) #x
|
||||
#define __X(x) __X2(x)
|
||||
|
||||
#define __define_initcall(fn, id) \
|
||||
static initcall_t __initcall_##fn##id __used __section( \
|
||||
".initcall" __X(id) ".init") \
|
||||
= (fn)
|
||||
|
||||
extern int ml_init(uintptr_t arg);
|
||||
|
||||
extern const struct framebuffer_varinfo *bootfb_varinfo(void);
|
||||
extern const struct framebuffer_fixedinfo *bootfb_fixedinfo(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
5
arch/x86_64/include/kernel/machine/irq.h
Normal file
5
arch/x86_64/include/kernel/machine/irq.h
Normal file
@@ -0,0 +1,5 @@
|
||||
#ifndef KERNEL_X86_64_IRQ_H_
|
||||
#define KERNEL_X86_64_IRQ_H_
|
||||
|
||||
|
||||
#endif
|
||||
12
arch/x86_64/include/kernel/machine/panic.h
Normal file
12
arch/x86_64/include/kernel/machine/panic.h
Normal file
@@ -0,0 +1,12 @@
|
||||
#ifndef KERNEL_X86_64_PANIC_H_
|
||||
#define KERNEL_X86_64_PANIC_H_
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
struct ml_cpu_context;
|
||||
|
||||
extern void ml_print_cpu_state(struct ml_cpu_context *ctx);
|
||||
extern void ml_print_stack_trace(uintptr_t ip);
|
||||
extern void ml_print_stack_trace_irq(struct ml_cpu_context *ctx);
|
||||
|
||||
#endif
|
||||
11
arch/x86_64/include/kernel/machine/pmap.h
Normal file
11
arch/x86_64/include/kernel/machine/pmap.h
Normal file
@@ -0,0 +1,11 @@
|
||||
#ifndef KERNEL_X86_64_PMAP_H_
|
||||
#define KERNEL_X86_64_PMAP_H_
|
||||
|
||||
#include <arch/paging.h>
|
||||
|
||||
#define ML_PMAP_INVALID ((uintptr_t)-1)
|
||||
|
||||
typedef pml4t_ptr_t ml_pmap_t;
|
||||
typedef uint64_t ml_pfn_t;
|
||||
|
||||
#endif
|
||||
31
arch/x86_64/include/kernel/machine/thread.h
Normal file
31
arch/x86_64/include/kernel/machine/thread.h
Normal file
@@ -0,0 +1,31 @@
|
||||
#ifndef KERNEL_X86_64_THREAD_H_
|
||||
#define KERNEL_X86_64_THREAD_H_
|
||||
|
||||
#include <kernel/sched.h>
|
||||
|
||||
struct ml_cpu_context;
|
||||
|
||||
/* switch from one thread to another. the stack of the `to` thread must have
|
||||
* been prepared in one of two ways:
|
||||
* 1) a previous call to ml_thread_switch where it was the `from` thread.
|
||||
* 2) a call to ml_thread_prepare_kernel_context
|
||||
* the switch occurs entirely with kernel mode. a further return from an
|
||||
* interrupt context is then used to return to usermode if necessary.
|
||||
*/
|
||||
extern void ml_thread_switch(struct thread *from, struct thread *to);
|
||||
|
||||
/* perform the initial transition to userspace. the stack must be prepared using
|
||||
* ml_thread_prepare_user_context before this function can be used */
|
||||
extern void ml_thread_switch_user(void);
|
||||
/* prepare the stack so that ml_thread_switch can jump to the specified IP/SP */
|
||||
extern void ml_thread_prepare_kernel_context(uintptr_t ip, uintptr_t *sp);
|
||||
/* prepare the stack so that ml_thread_switch_user can jump to usermode
|
||||
* with the specified IP/user SP */
|
||||
extern kern_status_t ml_thread_prepare_user_context(
|
||||
virt_addr_t ip,
|
||||
virt_addr_t user_sp,
|
||||
virt_addr_t *kernel_sp,
|
||||
const uintptr_t *args,
|
||||
size_t nr_args);
|
||||
|
||||
#endif
|
||||
30
arch/x86_64/include/kernel/machine/vm.h
Normal file
30
arch/x86_64/include/kernel/machine/vm.h
Normal file
@@ -0,0 +1,30 @@
|
||||
#ifndef KERNEL_X86_64_VM_H_
|
||||
#define KERNEL_X86_64_VM_H_
|
||||
|
||||
/* kernel higher-half base virtual address. */
|
||||
#define VM_KERNEL_VOFFSET 0xFFFFFFFF80000000
|
||||
|
||||
/* direct page-mapping region.
|
||||
NOTE that these are the maximum bounds of this region.
|
||||
the actual size depends on the amount of physical
|
||||
memory present. */
|
||||
#define VM_PAGEMAP_BASE 0xFFFF888000000000
|
||||
#define VM_PAGEMAP_LIMIT 0xFFFFC87FFFFFFFFF
|
||||
|
||||
#define VM_PAGE_SIZE 0x1000
|
||||
#define VM_PAGE_MASK (VM_PAGE_SIZE - 1)
|
||||
#define VM_PAGE_SHIFT 12
|
||||
|
||||
#define VM_PAGE_MIN_ORDER VM_PAGE_4K
|
||||
#define VM_PAGE_MAX_ORDER VM_PAGE_8M
|
||||
|
||||
#define VM_ZONE_MIN VM_ZONE_DMA
|
||||
#define VM_ZONE_MAX VM_ZONE_NORMAL
|
||||
|
||||
#define VM_USER_BASE 0x0000000000100000
|
||||
#define VM_USER_LIMIT 0x00007fffffffffff
|
||||
|
||||
#define VM_KERNEL_BASE 0XFFFF800000000000
|
||||
#define VM_KERNEL_LIMIT 0XFFFFFFFFFFFFFFFF
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user