Hacks to #define PROC_KSTACK_OFFSET and TRAPFRAME_SIZE at build time..

..this turned out to be more complicated than I expected.
上级 829545bc
...@@ -29,14 +29,14 @@ STRIP = $(TOOLPREFIX)strip ...@@ -29,14 +29,14 @@ STRIP = $(TOOLPREFIX)strip
# XXX(sbw) # XXX(sbw)
# -nostdinc -nostdinc++ # -nostdinc -nostdinc++
COMFLAGS = -static -fno-builtin -fno-strict-aliasing -O2 -Wall \ COMFLAGS = -static -g -MD -m64 -O2 -Wall -Werror -DHW_$(HW) -DXV6 \
-g -MD -m64 -Werror -fms-extensions -mno-sse -mcx16 \ -fno-builtin -fno-strict-aliasing -fno-omit-frame-pointer -fms-extensions \
-mno-red-zone -Iinclude -I$(QEMUSRC) -fno-omit-frame-pointer \ -mno-sse -mcx16 -mno-red-zone -Iinclude -I$(QEMUSRC) \
-DHW_$(HW) -include param.h -include include/compiler.h -DXV6 -include param.h -include include/compiler.h
COMFLAGS += $(shell $(CC) -fno-stack-protector -E -x c /dev/null >/dev/null 2>&1 && echo -fno-stack-protector) COMFLAGS += $(shell $(CC) -fno-stack-protector -E -x c /dev/null >/dev/null 2>&1 && echo -fno-stack-protector)
CFLAGS := $(COMFLAGS) -std=c99 $(CFLAGS) CFLAGS := $(COMFLAGS) -std=c99 $(CFLAGS)
CXXFLAGS := $(COMFLAGS) -std=c++0x -Wno-sign-compare -fno-exceptions -fno-rtti -fcheck-new $(CXXFLAGS) CXXFLAGS := $(COMFLAGS) -std=c++0x -Wno-sign-compare -fno-exceptions -fno-rtti -fcheck-new $(CXXFLAGS)
ASFLAGS = -Iinclude -m64 -gdwarf-2 -MD -DHW_$(HW) -include param.h ASFLAGS = -Iinclude -I$(O)/include -m64 -gdwarf-2 -MD -DHW_$(HW) -include param.h
LDFLAGS = -m elf_x86_64 LDFLAGS = -m elf_x86_64
all: all:
......
...@@ -129,6 +129,3 @@ struct taskstate ...@@ -129,6 +129,3 @@ struct taskstate
(u16) ((rip)&0xffff), (cs), 0, bits, (u16) (((rip)>>16)&0xffff), \ (u16) ((rip)&0xffff), (cs), 0, bits, (u16) (((rip)>>16)&0xffff), \
(u32) ((u64)(rip)>>32), 0, \ (u32) ((u64)(rip)>>32), 0, \
} }
#define PROC_KSTACK_OFFSET 48
#define TRAPFRAME_SIZE 192
...@@ -79,5 +79,12 @@ $(O)/kernel/%: kernel/%.S ...@@ -79,5 +79,12 @@ $(O)/kernel/%: kernel/%.S
$(Q)$(LD) $(LDFLAGS) -N -e start -Ttext $(TTEXT) -o $@.out $@.o $(Q)$(LD) $(LDFLAGS) -N -e start -Ttext $(TTEXT) -o $@.out $@.o
$(Q)$(OBJCOPY) -S -O binary $@.out $@ $(Q)$(OBJCOPY) -S -O binary $@.out $@
$(O)/include/asmdefines.h: kernel/asmdefines.c
@echo " GEN $@"
$(Q)mkdir -p $(@D)
$(Q)$(CXX) -S $(CXXFLAGS) -o $(O)/kernel/asmdefines.S kernel/asmdefines.c
$(Q)sed -n 's/remove\$$//p' $(O)/kernel/asmdefines.S > $@
$(O)/kernel/trapasm.o: $(O)/include/asmdefines.h
.PRECIOUS: $(O)/kernel/%.o .PRECIOUS: $(O)/kernel/%.o
-include $(O)/kernel/*.d -include $(O)/kernel/*.d
#include "types.h"
#include "kernel.hh"
#include "spinlock.h"
#include "amd64.h"
#include "condvar.h"
#include "proc.hh"
#define DEFINE(sym, val) \
asm volatile ("\n#define " #sym " remove%0 " : : "i" (val))
void
asmdefines(void)
{
DEFINE(PROC_KSTACK_OFFSET, __offsetof(struct proc, kstack));
DEFINE(TRAPFRAME_SIZE, sizeof(trapframe));
}
...@@ -105,13 +105,6 @@ cmain(u64 mbmagic, u64 mbaddr) ...@@ -105,13 +105,6 @@ cmain(u64 mbmagic, u64 mbaddr)
kpml4.e[0] = 0; // don't need 1 GB identity mapping anymore kpml4.e[0] = 0; // don't need 1 GB identity mapping anymore
lcr3(rcr3()); lcr3(rcr3());
if (PROC_KSTACK_OFFSET != __offsetof(struct proc, kstack))
panic("PROC_KSTACK_OFFSET mismatch: %d %ld\n",
PROC_KSTACK_OFFSET, __offsetof(struct proc, kstack));
if (TRAPFRAME_SIZE != sizeof(trapframe))
panic("TRAPFRAME_SIZE mismatch: %d %ld\n",
TRAPFRAME_SIZE, sizeof(trapframe));
idleloop(); idleloop();
panic("Unreachable"); panic("Unreachable");
......
#include "mmu.h" #include "mmu.h"
#include "asmdefines.h"
#define NOEC pushq $0 #define NOEC pushq $0
#define EC #define EC
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论