x86_64: adjust formatting

This commit is contained in:
2026-02-08 11:36:16 +00:00
parent 4051265876
commit 00ea2b1b3b
7 changed files with 366 additions and 331 deletions

View File

@@ -9,19 +9,19 @@
extern "C" { extern "C" {
#endif #endif
#define NR_GDT_ENTRIES 5 #define NR_GDT_ENTRIES 5
#define GDT_A_PRESENT (1 << 7) #define GDT_A_PRESENT (1 << 7)
#define GDT_A_USER (3 << 5) #define GDT_A_USER (3 << 5)
#define GDT_A_CODE (3 << 3) #define GDT_A_CODE (3 << 3)
#define GDT_A_DATA (8 << 1) #define GDT_A_DATA (8 << 1)
#define GDT_A_RPLK (1 << 5) #define GDT_A_RPLK (1 << 5)
#define GDT_A_CODEREAD (1 << 1) #define GDT_A_CODEREAD (1 << 1)
#define GDT_A_DATAWRITE (1 << 1) #define GDT_A_DATAWRITE (1 << 1)
#define GDT_A_GROWUP (1 << 5) #define GDT_A_GROWUP (1 << 5)
#define GDT_F_64BIT (0x2F) #define GDT_F_64BIT (0x2F)
#define GDT_F_32BIT (0x4F) #define GDT_F_32BIT (0x4F)
#define GDT_F_16BIT (0xF) #define GDT_F_16BIT (0xF)
struct gdt_entry { struct gdt_entry {
uint16_t ge_limit_low; uint16_t ge_limit_low;

View File

@@ -3,16 +3,24 @@
#include <arch/gdt.h> #include <arch/gdt.h>
#include <arch/irq.h> #include <arch/irq.h>
#include <arch/tss.h>
#include <mango/types.h>
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
#define ML_BIG_ENDIAN 0 #define ML_BIG_ENDIAN 0
#define ml_cpu_block_get_id(p) ((p)->c_cpu_id) #define ml_cpu_block_get_id(p) ((p)->c_cpu_id)
#define ml_cpu_block_get_data(p) ((p)->c_data) #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; struct cpu_data;
typedef struct ml_cpu_block { typedef struct ml_cpu_block {

View File

@@ -9,11 +9,12 @@ extern "C" {
#endif #endif
#define __X2(x) #x #define __X2(x) #x
#define __X(x) __X2(x) #define __X(x) __X2(x)
#define __define_initcall(fn, id) \ #define __define_initcall(fn, id) \
static initcall_t __initcall_##fn##id __used \ static initcall_t __initcall_##fn##id __used __section( \
__section(".initcall" __X(id) ".init") = (fn) ".initcall" __X(id) ".init") \
= (fn)
extern int ml_init(uintptr_t arg); extern int ml_init(uintptr_t arg);

View File

@@ -102,16 +102,20 @@ int ml_init(uintptr_t arg)
put_cpu(this_cpu); put_cpu(this_cpu);
struct vm_zone_descriptor vm_zones[] = { struct vm_zone_descriptor vm_zones[] = {
{.zd_id = VM_ZONE_DMA, {
.zd_node = 0, .zd_id = VM_ZONE_DMA,
.zd_name = "dma", .zd_node = 0,
.zd_base = 0x00, .zd_name = "dma",
.zd_limit = 0xffffff}, .zd_base = 0x00,
{.zd_id = VM_ZONE_NORMAL, .zd_limit = 0xffffff,
.zd_node = 0, },
.zd_name = "normal", {
.zd_base = 0x1000000, .zd_id = VM_ZONE_NORMAL,
.zd_limit = UINTPTR_MAX}, .zd_node = 0,
.zd_name = "normal",
.zd_base = 0x1000000,
.zd_limit = UINTPTR_MAX,
},
}; };
vm_bootstrap(vm_zones, sizeof vm_zones / sizeof vm_zones[0]); vm_bootstrap(vm_zones, sizeof vm_zones / sizeof vm_zones[0]);

View File

@@ -194,263 +194,263 @@ void unhook_irq(enum irq_vector vec, struct irq_hook *hook)
queue_delete(hook_queue, &hook->irq_entry); queue_delete(hook_queue, &hook->irq_entry);
} }
extern void _isr0(); extern void _isr0(void);
extern void _isr1(); extern void _isr1(void);
extern void _isr2(); extern void _isr2(void);
extern void _isr3(); extern void _isr3(void);
extern void _isr4(); extern void _isr4(void);
extern void _isr5(); extern void _isr5(void);
extern void _isr6(); extern void _isr6(void);
extern void _isr7(); extern void _isr7(void);
extern void _isr8(); extern void _isr8(void);
extern void _isr9(); extern void _isr9(void);
extern void _isr10(); extern void _isr10(void);
extern void _isr11(); extern void _isr11(void);
extern void _isr12(); extern void _isr12(void);
extern void _isr13(); extern void _isr13(void);
extern void _isr14(); extern void _isr14(void);
extern void _isr15(); extern void _isr15(void);
extern void _isr16(); extern void _isr16(void);
extern void _isr17(); extern void _isr17(void);
extern void _isr18(); extern void _isr18(void);
extern void _isr19(); extern void _isr19(void);
extern void _isr20(); extern void _isr20(void);
extern void _isr21(); extern void _isr21(void);
extern void _isr22(); extern void _isr22(void);
extern void _isr23(); extern void _isr23(void);
extern void _isr24(); extern void _isr24(void);
extern void _isr25(); extern void _isr25(void);
extern void _isr26(); extern void _isr26(void);
extern void _isr27(); extern void _isr27(void);
extern void _isr28(); extern void _isr28(void);
extern void _isr29(); extern void _isr29(void);
extern void _isr30(); extern void _isr30(void);
extern void _isr31(); extern void _isr31(void);
extern void _irq0(); extern void _irq0(void);
extern void _irq1(); extern void _irq1(void);
extern void _irq2(); extern void _irq2(void);
extern void _irq3(); extern void _irq3(void);
extern void _irq4(); extern void _irq4(void);
extern void _irq5(); extern void _irq5(void);
extern void _irq6(); extern void _irq6(void);
extern void _irq7(); extern void _irq7(void);
extern void _irq8(); extern void _irq8(void);
extern void _irq9(); extern void _irq9(void);
extern void _irq10(); extern void _irq10(void);
extern void _irq11(); extern void _irq11(void);
extern void _irq12(); extern void _irq12(void);
extern void _irq13(); extern void _irq13(void);
extern void _irq14(); extern void _irq14(void);
extern void _irq15(); extern void _irq15(void);
extern void _irq16(); extern void _irq16(void);
extern void _irq17(); extern void _irq17(void);
extern void _irq18(); extern void _irq18(void);
extern void _irq19(); extern void _irq19(void);
extern void _irq20(); extern void _irq20(void);
extern void _irq21(); extern void _irq21(void);
extern void _irq22(); extern void _irq22(void);
extern void _irq23(); extern void _irq23(void);
extern void _irq24(); extern void _irq24(void);
extern void _irq25(); extern void _irq25(void);
extern void _irq26(); extern void _irq26(void);
extern void _irq27(); extern void _irq27(void);
extern void _irq28(); extern void _irq28(void);
extern void _irq29(); extern void _irq29(void);
extern void _irq30(); extern void _irq30(void);
extern void _irq31(); extern void _irq31(void);
extern void _irq32(); extern void _irq32(void);
extern void _irq33(); extern void _irq33(void);
extern void _irq34(); extern void _irq34(void);
extern void _irq35(); extern void _irq35(void);
extern void _irq36(); extern void _irq36(void);
extern void _irq37(); extern void _irq37(void);
extern void _irq38(); extern void _irq38(void);
extern void _irq39(); extern void _irq39(void);
extern void _irq40(); extern void _irq40(void);
extern void _irq41(); extern void _irq41(void);
extern void _irq42(); extern void _irq42(void);
extern void _irq43(); extern void _irq43(void);
extern void _irq44(); extern void _irq44(void);
extern void _irq45(); extern void _irq45(void);
extern void _irq46(); extern void _irq46(void);
extern void _irq47(); extern void _irq47(void);
extern void _irq48(); extern void _irq48(void);
extern void _irq49(); extern void _irq49(void);
extern void _irq50(); extern void _irq50(void);
extern void _irq51(); extern void _irq51(void);
extern void _irq52(); extern void _irq52(void);
extern void _irq53(); extern void _irq53(void);
extern void _irq54(); extern void _irq54(void);
extern void _irq55(); extern void _irq55(void);
extern void _irq56(); extern void _irq56(void);
extern void _irq57(); extern void _irq57(void);
extern void _irq58(); extern void _irq58(void);
extern void _irq59(); extern void _irq59(void);
extern void _irq60(); extern void _irq60(void);
extern void _irq61(); extern void _irq61(void);
extern void _irq62(); extern void _irq62(void);
extern void _irq63(); extern void _irq63(void);
extern void _irq64(); extern void _irq64(void);
extern void _irq65(); extern void _irq65(void);
extern void _irq66(); extern void _irq66(void);
extern void _irq67(); extern void _irq67(void);
extern void _irq68(); extern void _irq68(void);
extern void _irq69(); extern void _irq69(void);
extern void _irq70(); extern void _irq70(void);
extern void _irq71(); extern void _irq71(void);
extern void _irq72(); extern void _irq72(void);
extern void _irq73(); extern void _irq73(void);
extern void _irq74(); extern void _irq74(void);
extern void _irq75(); extern void _irq75(void);
extern void _irq76(); extern void _irq76(void);
extern void _irq77(); extern void _irq77(void);
extern void _irq78(); extern void _irq78(void);
extern void _irq79(); extern void _irq79(void);
extern void _irq80(); extern void _irq80(void);
extern void _irq81(); extern void _irq81(void);
extern void _irq82(); extern void _irq82(void);
extern void _irq83(); extern void _irq83(void);
extern void _irq84(); extern void _irq84(void);
extern void _irq85(); extern void _irq85(void);
extern void _irq86(); extern void _irq86(void);
extern void _irq87(); extern void _irq87(void);
extern void _irq88(); extern void _irq88(void);
extern void _irq89(); extern void _irq89(void);
extern void _irq90(); extern void _irq90(void);
extern void _irq91(); extern void _irq91(void);
extern void _irq92(); extern void _irq92(void);
extern void _irq93(); extern void _irq93(void);
extern void _irq94(); extern void _irq94(void);
extern void _irq95(); extern void _irq95(void);
extern void _irq96(); extern void _irq96(void);
extern void _irq97(); extern void _irq97(void);
extern void _irq98(); extern void _irq98(void);
extern void _irq99(); extern void _irq99(void);
extern void _irq100(); extern void _irq100(void);
extern void _irq101(); extern void _irq101(void);
extern void _irq102(); extern void _irq102(void);
extern void _irq103(); extern void _irq103(void);
extern void _irq104(); extern void _irq104(void);
extern void _irq105(); extern void _irq105(void);
extern void _irq106(); extern void _irq106(void);
extern void _irq107(); extern void _irq107(void);
extern void _irq108(); extern void _irq108(void);
extern void _irq109(); extern void _irq109(void);
extern void _irq110(); extern void _irq110(void);
extern void _irq111(); extern void _irq111(void);
extern void _irq112(); extern void _irq112(void);
extern void _irq113(); extern void _irq113(void);
extern void _irq114(); extern void _irq114(void);
extern void _irq115(); extern void _irq115(void);
extern void _irq116(); extern void _irq116(void);
extern void _irq117(); extern void _irq117(void);
extern void _irq118(); extern void _irq118(void);
extern void _irq119(); extern void _irq119(void);
extern void _irq120(); extern void _irq120(void);
extern void _irq121(); extern void _irq121(void);
extern void _irq122(); extern void _irq122(void);
extern void _irq123(); extern void _irq123(void);
extern void _irq124(); extern void _irq124(void);
extern void _irq125(); extern void _irq125(void);
extern void _irq126(); extern void _irq126(void);
extern void _irq127(); extern void _irq127(void);
extern void _irq128(); extern void _irq128(void);
extern void _irq129(); extern void _irq129(void);
extern void _irq130(); extern void _irq130(void);
extern void _irq131(); extern void _irq131(void);
extern void _irq132(); extern void _irq132(void);
extern void _irq133(); extern void _irq133(void);
extern void _irq134(); extern void _irq134(void);
extern void _irq135(); extern void _irq135(void);
extern void _irq136(); extern void _irq136(void);
extern void _irq137(); extern void _irq137(void);
extern void _irq138(); extern void _irq138(void);
extern void _irq139(); extern void _irq139(void);
extern void _irq140(); extern void _irq140(void);
extern void _irq141(); extern void _irq141(void);
extern void _irq142(); extern void _irq142(void);
extern void _irq143(); extern void _irq143(void);
extern void _irq144(); extern void _irq144(void);
extern void _irq145(); extern void _irq145(void);
extern void _irq146(); extern void _irq146(void);
extern void _irq147(); extern void _irq147(void);
extern void _irq148(); extern void _irq148(void);
extern void _irq149(); extern void _irq149(void);
extern void _irq150(); extern void _irq150(void);
extern void _irq151(); extern void _irq151(void);
extern void _irq152(); extern void _irq152(void);
extern void _irq153(); extern void _irq153(void);
extern void _irq154(); extern void _irq154(void);
extern void _irq155(); extern void _irq155(void);
extern void _irq156(); extern void _irq156(void);
extern void _irq157(); extern void _irq157(void);
extern void _irq158(); extern void _irq158(void);
extern void _irq159(); extern void _irq159(void);
extern void _irq160(); extern void _irq160(void);
extern void _irq161(); extern void _irq161(void);
extern void _irq162(); extern void _irq162(void);
extern void _irq163(); extern void _irq163(void);
extern void _irq164(); extern void _irq164(void);
extern void _irq165(); extern void _irq165(void);
extern void _irq166(); extern void _irq166(void);
extern void _irq167(); extern void _irq167(void);
extern void _irq168(); extern void _irq168(void);
extern void _irq169(); extern void _irq169(void);
extern void _irq170(); extern void _irq170(void);
extern void _irq171(); extern void _irq171(void);
extern void _irq172(); extern void _irq172(void);
extern void _irq173(); extern void _irq173(void);
extern void _irq174(); extern void _irq174(void);
extern void _irq175(); extern void _irq175(void);
extern void _irq176(); extern void _irq176(void);
extern void _irq177(); extern void _irq177(void);
extern void _irq178(); extern void _irq178(void);
extern void _irq179(); extern void _irq179(void);
extern void _irq180(); extern void _irq180(void);
extern void _irq181(); extern void _irq181(void);
extern void _irq182(); extern void _irq182(void);
extern void _irq183(); extern void _irq183(void);
extern void _irq184(); extern void _irq184(void);
extern void _irq185(); extern void _irq185(void);
extern void _irq186(); extern void _irq186(void);
extern void _irq187(); extern void _irq187(void);
extern void _irq188(); extern void _irq188(void);
extern void _irq189(); extern void _irq189(void);
extern void _irq190(); extern void _irq190(void);
extern void _irq191(); extern void _irq191(void);
extern void _irq192(); extern void _irq192(void);
extern void _irq193(); extern void _irq193(void);
extern void _irq194(); extern void _irq194(void);
extern void _irq195(); extern void _irq195(void);
extern void _irq196(); extern void _irq196(void);
extern void _irq197(); extern void _irq197(void);
extern void _irq198(); extern void _irq198(void);
extern void _irq199(); extern void _irq199(void);
extern void _irq200(); extern void _irq200(void);
extern void _irq201(); extern void _irq201(void);
extern void _irq202(); extern void _irq202(void);
extern void _irq203(); extern void _irq203(void);
extern void _irq204(); extern void _irq204(void);
extern void _irq205(); extern void _irq205(void);
extern void _irq206(); extern void _irq206(void);
extern void _irq207(); extern void _irq207(void);
extern void _irq208(); extern void _irq208(void);
extern void _irq209(); extern void _irq209(void);
extern void _irq210(); extern void _irq210(void);
extern void _irq211(); extern void _irq211(void);
extern void _irq212(); extern void _irq212(void);
extern void _irq213(); extern void _irq213(void);
extern void _irq214(); extern void _irq214(void);
extern void _irq215(); extern void _irq215(void);
extern void _irq216(); extern void _irq216(void);
extern void _irq217(); extern void _irq217(void);
extern void _irq218(); extern void _irq218(void);
extern void _irq219(); extern void _irq219(void);
extern void _irq220(); extern void _irq220(void);
extern void _irq221(); extern void _irq221(void);
extern void _irq222(); extern void _irq222(void);
extern void _irq223(); extern void _irq223(void);
static uintptr_t int_entry_points[NR_IDT_ENTRIES] = { static uintptr_t int_entry_points[NR_IDT_ENTRIES] = {
[0] = (uintptr_t)_isr0, [1] = (uintptr_t)_isr1, [0] = (uintptr_t)_isr0, [1] = (uintptr_t)_isr1,

View File

@@ -1,24 +1,25 @@
#include "mango/machine/panic.h"
#include "mango/vm.h"
#include <mango/printk.h>
#include <mango/libc/stdio.h>
#include <arch/irq.h> #include <arch/irq.h>
#include <mango/libc/stdio.h>
#include <mango/machine/cpu.h>
#include <mango/machine/panic.h>
#include <mango/printk.h>
#include <mango/vm.h>
#define R_CF 0 #define R_CF 0
#define R_PF 2 #define R_PF 2
#define R_AF 4 #define R_AF 4
#define R_ZF 6 #define R_ZF 6
#define R_SF 7 #define R_SF 7
#define R_TF 8 #define R_TF 8
#define R_IF 9 #define R_IF 9
#define R_DF 10 #define R_DF 10
#define R_OF 11 #define R_OF 11
#define R_NT 14 #define R_NT 14
#define R_VM 17 #define R_VM 17
#define R_AC 18 #define R_AC 18
#define R_VIF 19 #define R_VIF 19
#define R_VIP 20 #define R_VIP 20
#define R_ID 21 #define R_ID 21
#define R_MAX 21 #define R_MAX 21
struct stack_frame { struct stack_frame {
@@ -82,7 +83,11 @@ static void print_rflags(uintptr_t rflags)
if (rflags & (1 << i)) { if (rflags & (1 << i)) {
const char *name = pf_rfl_name(i); const char *name = pf_rfl_name(i);
if (name) { if (name) {
buf_i += snprintf(buf + buf_i, sizeof(buf) - buf_i, " %s", name); buf_i += snprintf(
buf + buf_i,
sizeof(buf) - buf_i,
" %s",
name);
} }
} }
} }
@@ -96,25 +101,38 @@ void ml_print_cpu_state(struct ml_cpu_context *ctx)
printk("cpu state:"); printk("cpu state:");
if (ctx) { if (ctx) {
printk(" rax %016llx rbx %016llx rcx %016llx", printk(" rax %016llx rbx %016llx rcx %016llx",
ctx->rax, ctx->rbx, ctx->rcx); ctx->rax,
ctx->rbx,
ctx->rcx);
printk(" rdx %016llx rsi %016llx rdi %016llx", printk(" rdx %016llx rsi %016llx rdi %016llx",
ctx->rdx, ctx->rsi, ctx->rdi); ctx->rdx,
ctx->rsi,
ctx->rdi);
printk(" rsp %016llx rbp %016llx r8 %016llx", printk(" rsp %016llx rbp %016llx r8 %016llx",
ctx->rsp, ctx->rbp, ctx->r8); ctx->rsp,
ctx->rbp,
ctx->r8);
printk(" r9 %016llx r10 %016llx r11 %016llx", printk(" r9 %016llx r10 %016llx r11 %016llx",
ctx->r9, ctx->r10, ctx->r11); ctx->r9,
ctx->r10,
ctx->r11);
printk(" r12 %016llx r13 %016llx r14 %016llx", printk(" r12 %016llx r13 %016llx r14 %016llx",
ctx->r12, ctx->r13, ctx->r14); ctx->r12,
ctx->r13,
ctx->r14);
printk(" r15 %016llx rip %016llx cs %04x ss %04x", printk(" r15 %016llx rip %016llx cs %04x ss %04x",
ctx->r15, ctx->rip, ctx->cs, ctx->ss); ctx->r15,
ctx->rip,
ctx->cs,
ctx->ss);
print_rflags(ctx->rflags); print_rflags(ctx->rflags);
} }
uintptr_t cr0 = 0, cr2 = 0, cr3 = 0, cr4 = 0; uintptr_t cr0 = 0, cr2 = 0, cr3 = 0, cr4 = 0;
asm volatile("mov %%cr0, %%rax" : "=a" (cr0)); asm volatile("mov %%cr0, %%rax" : "=a"(cr0));
asm volatile("mov %%cr2, %%rax" : "=a" (cr2)); asm volatile("mov %%cr2, %%rax" : "=a"(cr2));
asm volatile("mov %%cr3, %%rax" : "=a" (cr3)); asm volatile("mov %%cr3, %%rax" : "=a"(cr3));
asm volatile("mov %%cr4, %%rax" : "=a" (cr4)); asm volatile("mov %%cr4, %%rax" : "=a"(cr4));
printk(" cr0 %016llx cr2 %016llx", cr0, cr2); printk(" cr0 %016llx cr2 %016llx", cr0, cr2);
printk(" cr3 %016llx cr4 %016llx", cr3, cr4); printk(" cr3 %016llx cr4 %016llx", cr3, cr4);
} }
@@ -135,7 +153,12 @@ static void print_stack_item(uintptr_t addr)
int found = -1; int found = -1;
if (found == 0 && name[0] != '\0') { if (found == 0 && name[0] != '\0') {
i += snprintf(buf + i, sizeof(buf) - i, "%s+0x%lx", name, offset); i += snprintf(
buf + i,
sizeof(buf) - i,
"%s+0x%lx",
name,
offset);
} else { } else {
i += snprintf(buf + i, sizeof(buf) - i, "?"); i += snprintf(buf + i, sizeof(buf) - i, "?");
} }
@@ -152,9 +175,8 @@ static void print_stack_trace(uintptr_t ip, uintptr_t *bp)
int max_frames = 10, current_frame = 0; int max_frames = 10, current_frame = 0;
while (1) { while (1) {
if (!vm_virt_to_phys(stk) || if (!vm_virt_to_phys(stk) || bp == NULL
bp == NULL || || current_frame > max_frames) {
current_frame > max_frames) {
break; break;
} }
@@ -169,7 +191,7 @@ static void print_stack_trace(uintptr_t ip, uintptr_t *bp)
void ml_print_stack_trace(uintptr_t ip) void ml_print_stack_trace(uintptr_t ip)
{ {
uintptr_t *bp; uintptr_t *bp;
asm volatile("mov %%rbp, %0" : "=r" (bp)); asm volatile("mov %%rbp, %0" : "=r"(bp));
print_stack_trace(ip, bp); print_stack_trace(ip, bp);
} }

View File

@@ -1,9 +1,9 @@
.code64 .code64
.extern THREAD_sp .extern THREAD_sp
.global switch_to .global switch_to
.type switch_to, @function .type switch_to, @function
// %rdi = (struct thread *) current thread. // %rdi = (struct thread *) current thread.
// %rsi = (struct thread *) next thread. // %rsi = (struct thread *) next thread.