Index: branches/meklort/i386/boot2/modules.c =================================================================== --- branches/meklort/i386/boot2/modules.c (revision 638) +++ branches/meklort/i386/boot2/modules.c (revision 639) @@ -1,6 +1,7 @@ /* * Copyright 2010 Evan Lojewski. All rights reserved. * + * TODO: Zero out bss if needed */ #include "boot.h" @@ -9,7 +10,7 @@ #include "modules.h" #ifndef DEBUG_MODULES -#define DEBUG_MODULES 0 +#define DEBUG_MODULES 1 #endif #if DEBUG_MODULES @@ -55,30 +56,37 @@ */ int init_module_system() { + void (*module_start)(void) = NULL; + char* module_data = symbols_module_start + BOOT2_ADDR; // Intialize module system if(symbols_module_start == (void*)0xFFFFFFFF) { printf("Module system not compiled in\n"); + return 0; } + + module_start = parse_mach(module_data, &load_module, &add_symbol); - // TODO: Load embeded module - /* + if(module_start && module_start != (void*)0xFFFFFFFF) + { + // Notify the system that it was laoded + module_loaded(SYMBOLS_MODULE /*moduleName, moduleVersion, moduleCompat*/); + (*module_start)(); // Start the module + DBG("Module %s Loaded.\n", SYMBOLS_MODULE); - if(load_module(SYMBOLS_MODULE)) - { lookup_symbol = (void*)lookup_all_symbols(SYMBOL_LOOKUP_SYMBOL); if((UInt32)lookup_symbol != 0xFFFFFFFF) { return 1; } - } - + else { + // The module does not have a valid start function + printf("Unable to start %s\n", SYMBOLS_MODULE); + getc(); + } return 0; - */ - - return -1; } Index: branches/meklort/i386/boot2/Makefile =================================================================== --- branches/meklort/i386/boot2/Makefile (revision 638) +++ branches/meklort/i386/boot2/Makefile (revision 639) @@ -60,9 +60,9 @@ # SYMBOLS_MODULE = Symbols.dylib SYMBOL_START= _symbols_module_start -SYMBOL_ADDR = $(shell printf "%d" 0x`nm -s __DATA __data $(SYMROOT)/boot.sys | grep " $(SYMBOL_START)$$" | cut -f 1 -d " "`) -DATA_OFFSET = $(shell otool -l $(SYMROOT)/boot.sys | grep __data -A 4 | grep __DATA -A 3 | tail -n 1 | cut -f 6 -d " ") -DATA_ADDR = $(shell printf "%d" `otool -l $(SYMROOT)/boot.sys | grep __data -A 4 | grep __DATA -A 3 | head -n 2 | tail -n 1 | cut -f 8 -d " "`) +SYMBOL_ADDR = $(shell printf "%d" 0x`nm -s __DATA __data $(SYMROOT)/boot_embeded.sys | grep " $(SYMBOL_START)$$" | cut -f 1 -d " "`) +DATA_OFFSET = $(shell otool -l $(SYMROOT)/boot_embeded.sys | grep __data -A 4 | grep __DATA -A 3 | tail -n 1 | cut -f 6 -d " ") +DATA_ADDR = $(shell printf "%d" `otool -l $(SYMROOT)/boot_embeded.sys | grep __data -A 4 | grep __DATA -A 3 | head -n 2 | tail -n 1 | cut -f 8 -d " "`) PATCH_ADDR = $(shell echo ${SYMBOL_ADDR}-${DATA_ADDR}+${DATA_OFFSET} | bc) @@ -70,13 +70,21 @@ all embedtheme optionrom: $(DIRS_NEEDED) boot -boot: embedded.h $(OBJS) $(LIBDEP) +boot: embedded.h machOconv $(OBJS) $(LIBDEP) $(LD) -static -Wl,-preload -Wl,-segaddr,__INIT,$(BOOT2ADDR) \ -nostdlib -arch i386 -Wl,-segalign,20 \ -o $(SYMROOT)/boot.sys $(filter %.o,$^) $(LIBS) -lcc_kext - + @make Symbols.dylib + + $(LD) -static -Wl,-preload -Wl,-segaddr,__INIT,$(BOOT2ADDR) \ + -nostdlib -arch i386 -Wl,-segalign,20 \ + -Wl,-sectcreate,__DATA,__Symbols,$(SYMROOT)/Symbols.dylib \ + -o $(SYMROOT)/boot_embeded.sys $(filter %.o,$^) $(LIBS) -lcc_kext + @make embed_symbols # this is done in a sub process after boot.sys exists so the strings are populated correctly + ${RM} $(SYMROOT)/${SYMBOLS_MODULE} + size $(SYMROOT)/boot.sys ls -l $(SYMROOT)/boot @( size=`ls -l $(SYMROOT)/boot | awk '{ print $$5}'` ; \ @@ -87,17 +95,16 @@ exit 1;\ fi) -embed_symbols: machOconv Symbols.dylib +embed_symbols: machOconv @echo ================= Embedding Symbols.dylib ================= machOconv $(SYMROOT)/boot.sys $(SYMROOT)/boot - stat -f%z $(SYMROOT)/boot | perl -ane "print pack('V',@F[0]);" | dd conv=notrunc of=${SYMROOT}/boot.sys bs=1 count=4 seek=$(PATCH_ADDR) - machOconv $(SYMROOT)/boot.sys $(SYMROOT)/boot - dd if=${SYMROOT}/${SYMBOLS_MODULE} of=${SYMROOT}/boot bs=1 seek=`stat -f%z $(SYMROOT)/boot` - ${RM} $(SYMROOT)/${SYMBOLS_MODULE} - + echo ******* Patching at $(PATCH_ADDR) ****** + stat -f%z $(SYMROOT)/boot | perl -ane "print pack('V',@F[0]);" | dd conv=notrunc of=${SYMROOT}/boot_embeded.sys bs=1 count=4 seek=$(PATCH_ADDR) + machOconv $(SYMROOT)/boot_embeded.sys $(SYMROOT)/boot + prompt.o: vers.h vers.h: @echo "#define I386BOOT_VERSION \"5.0.132\"" > $(SYMROOT)/vers.h