提交 623f09fa 创建 作者: Nickolai Zeldovich's avatar Nickolai Zeldovich

more precisely fish out needed code from libsupc++

上级 23869406
...@@ -32,7 +32,7 @@ COMFLAGS = -static -g -MD -m64 -O3 -Wall -Werror -DHW_$(HW) -DXV6 \ ...@@ -32,7 +32,7 @@ COMFLAGS = -static -g -MD -m64 -O3 -Wall -Werror -DHW_$(HW) -DXV6 \
-mno-sse -mcx16 -mno-red-zone $(INCLUDES) -mno-sse -mcx16 -mno-red-zone $(INCLUDES)
COMFLAGS += $(shell $(CC) -fno-stack-protector -E -x c /dev/null >/dev/null 2>&1 && echo -fno-stack-protector) -nostdinc -I$(shell $(CC) -print-file-name=include) COMFLAGS += $(shell $(CC) -fno-stack-protector -E -x c /dev/null >/dev/null 2>&1 && echo -fno-stack-protector) -nostdinc -I$(shell $(CC) -print-file-name=include)
CFLAGS := $(COMFLAGS) -std=c99 $(CFLAGS) CFLAGS := $(COMFLAGS) -std=c99 $(CFLAGS)
CXXFLAGS := $(COMFLAGS) -std=c++0x -Wno-sign-compare -fno-rtti -fcheck-new -nostdinc++ $(CXXFLAGS) CXXFLAGS := $(COMFLAGS) -std=c++0x -Wno-sign-compare -nostdinc++ $(CXXFLAGS)
ASFLAGS = -Iinclude -I$(O)/include -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
......
$(O)/bin/%.o: CFLAGS:=$(CFLAGS) -DXV6_USER $(O)/bin/%.o: CFLAGS:=$(CFLAGS) -DXV6_USER
$(O)/bin/%.o: CXXFLAGS:=$(CXXFLAGS) -DXV6_USER -fno-exceptions $(O)/bin/%.o: CXXFLAGS:=$(CXXFLAGS) -DXV6_USER -fno-exceptions -fno-rtti
UPROGS= \ UPROGS= \
bench \ bench \
......
...@@ -83,6 +83,7 @@ struct proc : public rcu_freed { ...@@ -83,6 +83,7 @@ struct proc : public rcu_freed {
int run_cpuid_; int run_cpuid_;
int in_exec_; int in_exec_;
int uaccess_; int uaccess_;
u8 __cxa_eh_global[16];
static proc* alloc(); static proc* alloc();
void set_state(procstate_t s); void set_state(procstate_t s);
......
...@@ -51,22 +51,42 @@ OBJS = \ ...@@ -51,22 +51,42 @@ OBJS = \
wqlib.o \ wqlib.o \
script.o \ script.o \
zalloc.o \ zalloc.o \
incbin.o incbin.o \
gccsup/eh_personality.o \
gccsup/eh_catch.o \
gccsup/eh_throw.o \
gccsup/eh_call.o \
gccsup/eh_exception.o \
gccsup/eh_alloc.o \
gccsup/eh_terminate.o \
gccsup/tinfo.o \
gccsup/class_type_info.o \
gccsup/si_class_type_info.o \
gccsup/vmi_class_type_info.o \
gccsup/fundamental_type_info.o \
gccsup/pointer_type_info.o \
gccsup/pbase_type_info.o \
OBJS := $(addprefix $(O)/kernel/, $(OBJS)) OBJS := $(addprefix $(O)/kernel/, $(OBJS))
KERN = $(O)/kernel.elf KERN = $(O)/kernel.elf
ALL += $(KERN) ALL += $(KERN)
$(O)/kernel/%.o: CFLAGS+=-mcmodel=kernel -DXV6_KERNEL $(O)/kernel/%.o: CFLAGS+=-mcmodel=kernel -DXV6_KERNEL
$(O)/kernel/%.o: CXXFLAGS+=-mcmodel=kernel -DXV6_KERNEL -fno-exceptions $(O)/kernel/%.o: CXXFLAGS+=-mcmodel=kernel -DXV6_KERNEL
$(KERN): $(O)/kernel/boot.o $(OBJS) $(LDEPS) kernel/kernel.ld $(KERN): $(O)/kernel/boot.o $(OBJS) $(LDEPS) kernel/kernel.ld
@echo " LD $@" @echo " LD $@"
$(Q)mkdir -p $(@D) $(Q)mkdir -p $(@D)
$(Q)$(LD) $(LDFLAGS) -T kernel/kernel.ld -z max-page-size=4096 -e start \ $(Q)$(LD) $(LDFLAGS) -T kernel/kernel.ld -z max-page-size=4096 -e start \
-o $@ $(O)/kernel/boot.o $(OBJS) -L$(O) $(LFLAGS) -o $@ $(O)/kernel/boot.o $(OBJS) -L$(O) $(LFLAGS) \
# $(shell $(CC) -print-file-name=libgcc_eh.a) \ $(shell $(CC) -print-file-name=libgcc_eh.a)
# $(shell $(CC) -print-file-name=libsupc++.a)
LIBSUPCPP := $(shell $(CC) -print-file-name=libsupc++.a)
$(O)/kernel/gccsup/%: $(LIBSUPCPP)
@echo " AR $@"
$(Q)mkdir -p $(@D)
$(Q)( cd $(O)/kernel/gccsup && ar x $(LIBSUPCPP) $(@F) )
$(O)/kernel/%.o: lib/%.cc $(O)/kernel/%.o: lib/%.cc
@echo " CXX $@" @echo " CXX $@"
...@@ -99,3 +119,5 @@ $(O)/kernel/uaccess.o: $(O)/include/asmdefines.h ...@@ -99,3 +119,5 @@ $(O)/kernel/uaccess.o: $(O)/include/asmdefines.h
.PRECIOUS: $(O)/kernel/%.o .PRECIOUS: $(O)/kernel/%.o
-include $(O)/kernel/*.d -include $(O)/kernel/*.d
# vim: set noexpandtab:
...@@ -3,21 +3,38 @@ ...@@ -3,21 +3,38 @@
#include "cpputil.hh" #include "cpputil.hh"
#include "spinlock.h" #include "spinlock.h"
#include "amd64.h" #include "amd64.h"
#include "condvar.h"
#include "proc.hh"
#include "cpu.hh"
void * void*
operator new(unsigned long nbytes)
{
u64* x = (u64*) kmalloc(nbytes + sizeof(u64), "cpprt new");
*x = nbytes;
return x+1;
}
void
operator delete(void* p)
{
u64* x = (u64*) p;
kmfree(x-1, x[-1] + sizeof(u64));
}
void*
operator new[](unsigned long nbytes) operator new[](unsigned long nbytes)
{ {
u64 *x = (u64*) kmalloc(nbytes + sizeof(u64), "array"); u64* x = (u64*) kmalloc(nbytes + sizeof(u64), "array");
*x = nbytes + sizeof(u64); *x = nbytes;
return x+1; return x+1;
} }
void void
operator delete[](void *p) operator delete[](void* p)
{ {
u64 *x = (u64*) p; u64* x = (u64*) p;
x--; kmfree(x-1, x[-1] + sizeof(u64));
kmfree(x, *x);
} }
void void
...@@ -26,12 +43,44 @@ __cxa_pure_virtual(void) ...@@ -26,12 +43,44 @@ __cxa_pure_virtual(void)
panic("__cxa_pure_virtual"); panic("__cxa_pure_virtual");
} }
// Ugh: libsupc++ calls syscall(SYS_futex, ...) int
extern "C" u64 syscall(void); __cxa_guard_acquire(s64 *guard)
u64
syscall(void)
{ {
return 0; volatile u8 *x = (u8*) guard;
volatile u32 *l = (u32*) (x+4);
pushcli();
while (xchg32(l, 1) != 0)
; /* spin */
if (*x) {
xchg32(l, 0);
popcli();
return 0;
}
return 1;
}
void
__cxa_guard_release(s64 *guard)
{
volatile u8 *x = (u8*) guard;
volatile u32 *l = (u32*) (x+4);
*x = 1;
__sync_synchronize();
xchg32(l, 0);
popcli();
}
void
__cxa_guard_abort(s64 *guard)
{
volatile u8 *x = (u8*) guard;
volatile u32 *l = (u32*) (x+4);
xchg32(l, 0);
popcli();
} }
int int
...@@ -40,11 +89,19 @@ __cxa_atexit(void (*f)(void*), void *p, void *d) ...@@ -40,11 +89,19 @@ __cxa_atexit(void (*f)(void*), void *p, void *d)
return 0; return 0;
} }
extern "C" void abort(void);
void
abort(void)
{
panic("abort");
}
void *__dso_handle; void *__dso_handle;
std::ostream std::cout;
namespace std { namespace std {
std::ostream cout;
template<> template<>
u128 u128
atomic<u128>::load(memory_order __m) const atomic<u128>::load(memory_order __m) const
...@@ -70,12 +127,10 @@ atomic<u128>::compare_exchange_weak(u128 &__i1, u128 i2, memory_order __m) ...@@ -70,12 +127,10 @@ atomic<u128>::compare_exchange_weak(u128 &__i1, u128 i2, memory_order __m)
}; };
extern "C" void abort(void); namespace __cxxabiv1 {
void void (*__terminate_handler)() = abort;
abort(void) void (*__unexpected_handler)() = abort;
{ };
panic("abort");
}
extern "C" void* malloc(size_t); extern "C" void* malloc(size_t);
void* void*
...@@ -91,7 +146,7 @@ void ...@@ -91,7 +146,7 @@ void
free(void* vp) free(void* vp)
{ {
u64* p = (u64*) vp; u64* p = (u64*) vp;
kmfree(vp, p[-1]); kmfree(p-1, p[-1]+8);
} }
extern "C" void* realloc(void*, size_t); extern "C" void* realloc(void*, size_t);
...@@ -165,3 +220,17 @@ fputs(const char* s, int stream) ...@@ -165,3 +220,17 @@ fputs(const char* s, int stream)
cprintf("%s", s); cprintf("%s", s);
return 0; return 0;
} }
extern "C" void* __cxa_get_globals(void);
void*
__cxa_get_globals(void)
{
return myproc()->__cxa_eh_global;
}
extern "C" void* __cxa_get_globals_fast(void);
void*
__cxa_get_globals_fast(void)
{
return myproc()->__cxa_eh_global;
}
...@@ -54,6 +54,7 @@ proc::proc(int npid) : ...@@ -54,6 +54,7 @@ proc::proc(int npid) :
memset(&runqlink, 0, sizeof(runqlink)); memset(&runqlink, 0, sizeof(runqlink));
memset(&cv_waiters, 0, sizeof(cv_waiters)); memset(&cv_waiters, 0, sizeof(cv_waiters));
memset(&cv_sleep, 0, sizeof(cv_sleep)); memset(&cv_sleep, 0, sizeof(cv_sleep));
memset(__cxa_eh_global, 0, sizeof(__cxa_eh_global));
} }
proc::~proc(void) proc::~proc(void)
......
$(O)/lib/%.o: CFLAGS:=$(CFLAGS) -DXV6_USER $(O)/lib/%.o: CFLAGS:=$(CFLAGS) -DXV6_USER
$(O)/lib/%.o: CXXFLAGS:=$(CXXFLAGS) -DXV6_USER -fno-exceptions $(O)/lib/%.o: CXXFLAGS:=$(CXXFLAGS) -DXV6_USER -fno-exceptions -fno-rtti
ULIB = ulib.o usys.o printf.o umalloc.o uthread.o fmt.o stream.o ipc.o \ ULIB = ulib.o usys.o printf.o umalloc.o uthread.o fmt.o stream.o ipc.o \
threads.o crt.o wqlib.o wquser.o perf.o wqalloc.o threads.o crt.o wqlib.o wquser.o perf.o wqalloc.o
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论