提交 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 \
-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)
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
LDFLAGS = -m elf_x86_64
......
$(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= \
bench \
......
......@@ -83,6 +83,7 @@ struct proc : public rcu_freed {
int run_cpuid_;
int in_exec_;
int uaccess_;
u8 __cxa_eh_global[16];
static proc* alloc();
void set_state(procstate_t s);
......
......@@ -51,22 +51,42 @@ OBJS = \
wqlib.o \
script.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))
KERN = $(O)/kernel.elf
ALL += $(KERN)
$(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
@echo " LD $@"
$(Q)mkdir -p $(@D)
$(Q)$(LD) $(LDFLAGS) -T kernel/kernel.ld -z max-page-size=4096 -e start \
-o $@ $(O)/kernel/boot.o $(OBJS) -L$(O) $(LFLAGS)
# $(shell $(CC) -print-file-name=libgcc_eh.a) \
# $(shell $(CC) -print-file-name=libsupc++.a)
-o $@ $(O)/kernel/boot.o $(OBJS) -L$(O) $(LFLAGS) \
$(shell $(CC) -print-file-name=libgcc_eh.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
@echo " CXX $@"
......@@ -99,3 +119,5 @@ $(O)/kernel/uaccess.o: $(O)/include/asmdefines.h
.PRECIOUS: $(O)/kernel/%.o
-include $(O)/kernel/*.d
# vim: set noexpandtab:
......@@ -3,21 +3,38 @@
#include "cpputil.hh"
#include "spinlock.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)
{
u64 *x = (u64*) kmalloc(nbytes + sizeof(u64), "array");
*x = nbytes + sizeof(u64);
u64* x = (u64*) kmalloc(nbytes + sizeof(u64), "array");
*x = nbytes;
return x+1;
}
void
operator delete[](void *p)
operator delete[](void* p)
{
u64 *x = (u64*) p;
x--;
kmfree(x, *x);
u64* x = (u64*) p;
kmfree(x-1, x[-1] + sizeof(u64));
}
void
......@@ -26,12 +43,44 @@ __cxa_pure_virtual(void)
panic("__cxa_pure_virtual");
}
// Ugh: libsupc++ calls syscall(SYS_futex, ...)
extern "C" u64 syscall(void);
u64
syscall(void)
int
__cxa_guard_acquire(s64 *guard)
{
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
......@@ -40,11 +89,19 @@ __cxa_atexit(void (*f)(void*), void *p, void *d)
return 0;
}
extern "C" void abort(void);
void
abort(void)
{
panic("abort");
}
void *__dso_handle;
std::ostream std::cout;
namespace std {
std::ostream cout;
template<>
u128
atomic<u128>::load(memory_order __m) const
......@@ -70,12 +127,10 @@ atomic<u128>::compare_exchange_weak(u128 &__i1, u128 i2, memory_order __m)
};
extern "C" void abort(void);
void
abort(void)
{
panic("abort");
}
namespace __cxxabiv1 {
void (*__terminate_handler)() = abort;
void (*__unexpected_handler)() = abort;
};
extern "C" void* malloc(size_t);
void*
......@@ -91,7 +146,7 @@ void
free(void* vp)
{
u64* p = (u64*) vp;
kmfree(vp, p[-1]);
kmfree(p-1, p[-1]+8);
}
extern "C" void* realloc(void*, size_t);
......@@ -165,3 +220,17 @@ fputs(const char* s, int stream)
cprintf("%s", s);
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) :
memset(&runqlink, 0, sizeof(runqlink));
memset(&cv_waiters, 0, sizeof(cv_waiters));
memset(&cv_sleep, 0, sizeof(cv_sleep));
memset(__cxa_eh_global, 0, sizeof(__cxa_eh_global));
}
proc::~proc(void)
......
$(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 \
threads.o crt.o wqlib.o wquser.o perf.o wqalloc.o
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论