From 02c2b586b7831a8c74ca4fe0860dff2412733c87 Mon Sep 17 00:00:00 2001 From: Morten Delenk Date: Fri, 5 Aug 2016 22:03:14 +0200 Subject: [PATCH] Did some more testing stuff --- .do.sh.kate-swp | Bin 58 -> 0 bytes boot/3ds/main.c | 13 ++++++++----- do.sh | 2 +- firmlink | 3 +-- kernel/Makefile | 2 +- kernel/init.cpp | 3 +++ kernel/loader-3ds-11.ld | 28 ++++++++++++++++++++++++++++ kernel/loader-3ds-9.ld | 28 ++++++++++++++++++++++++++++ kernel/loader-x86-9.ld | 28 ++++++++++++++++++++++++++++ kernel/loader-x86_64-9.ld | 28 ++++++++++++++++++++++++++++ modules/3ds/Makefile | 5 +++++ modules/3ds/dsp/Makefile | 5 +++++ modules/3ds/link.ld | 26 ++++++++++++++++++++++++++ 13 files changed, 162 insertions(+), 9 deletions(-) delete mode 100644 .do.sh.kate-swp create mode 100644 kernel/loader-3ds-11.ld create mode 100644 kernel/loader-3ds-9.ld create mode 100644 kernel/loader-x86-9.ld create mode 100644 kernel/loader-x86_64-9.ld create mode 100644 modules/3ds/Makefile create mode 100644 modules/3ds/dsp/Makefile create mode 100644 modules/3ds/link.ld diff --git a/.do.sh.kate-swp b/.do.sh.kate-swp deleted file mode 100644 index b1951a43ba95453399805ec46f53517f7fc8a6b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58 zcmZQzU=Z?7EJ;-eE>A2_aLdd|RWQ;sU|?VnI5KOg_QstO-MbvVU5k~u6CUgd6y*eB K9w25ka0LMAO%I0v diff --git a/boot/3ds/main.c b/boot/3ds/main.c index 16d87ca..370661a 100644 --- a/boot/3ds/main.c +++ b/boot/3ds/main.c @@ -22,7 +22,7 @@ struct FIRM_header { char magic[4]; //! Magic "FIRM" string (not-null terminated) int version; //! Version. Currently 1 void(*entrypoint)(void**); //! Address where the processor jumps to after loading - void * arm11entry; + void (*arm11entry)(void**); unsigned int reserved[0xC]; struct FIRM_sect sections[4]; //! The four internal sections unsigned char RSA2048[0x100]; //! Currently unused @@ -38,6 +38,8 @@ void init() { FATFS fs; FIL firm; f_mount(&fs, "0:", 0); + arm9modtable[0]=0; + arm11modtable[0]=0; if(f_open(&firm, "mtgos.firm", FA_READ | FA_OPEN_EXISTING) == FR_OK) { DIAGPXL(1); unsigned int br; @@ -50,16 +52,17 @@ void init() { if(hdr.sections[i].size==0) continue; f_lseek(&firm, hdr.sections[i].offset); - char oldval=*((char*)hdr.sections[i].physical); + *((char*)hdr.sections[i].physical)=0xFF; + char oldval=0xFF; f_read(&firm, (void*)hdr.sections[i].physical, hdr.sections[i].size, &br); if(oldval!=*((char*)hdr.sections[i].physical)) DIAGPXL(i+4); DIAGPXL(i+8); } DIAGPXL(12); + void(**a11fpointer)(void**)=(void(**)(void**))0x1FFFFFF8; + *a11fpointer=hdr.arm11entry; + hdr.entrypoint(0); //Jump to kernel } - DIAGPXL(13); - arm9modtable[0]=0; - arm11modtable[0]=0; for(;;); } \ No newline at end of file diff --git a/do.sh b/do.sh index 35234dc..b0ed809 100755 --- a/do.sh +++ b/do.sh @@ -7,7 +7,7 @@ mv kernel/mtgos.elf . objcopy -O binary mtgos.elf mtgos.bin gmake -C kernel subvar=11 objcopy -O binary kernel/mtgos.elf kernel/mtgos.bin -firmlink -O 8000000 -O 1FF80000 -E $(nm mtgos.elf | egrep ' _start$' | awk '{print $1}') -e $(nm kernel/mtgos.elf | egrep ' _start$' | awk '{print $1}') -o mtgos.firm mtgos.bin kernel/mtgos.bin +firmlink -O 08000000 -O 1FF80000 -E $(nm mtgos.elf | egrep ' _start$' | awk '{print $1}') -e $(nm kernel/mtgos.elf | egrep ' _start$' | awk '{print $1}') -o mtgos.firm mtgos.bin kernel/mtgos.bin rm mtgos.bin kernel/mtgos.* sudo mount_msdosfs /dev/da3s1 mount sudo rm mount/{arm9loaderhax.bin,mtgos.firm} diff --git a/firmlink b/firmlink index 828cc82..716a3ee 100755 --- a/firmlink +++ b/firmlink @@ -1,4 +1,3 @@ #!/usr/bin/env bash echo Entry point: $(nm mtgos.elf | egrep ' _start$' | awk '{print $1}') -firmlink -O 200000 -E $(nm mtgos.elf | egrep ' _start$' | awk '{print $1}') -o $1.firm $1.bin -firmlink -O 1FF80000 -E $(nm mtgos.elf | egrep ' _start$' | awk '{print $1}') -o 3ds-$1.firm $1.bin \ No newline at end of file +firmlink -O 200000 -E $(nm mtgos.elf | egrep ' _start$' | awk '{print $1}') -o $1.firm $1.bin \ No newline at end of file diff --git a/kernel/Makefile b/kernel/Makefile index 744ae03..f4dd6a3 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -8,7 +8,7 @@ LD = $(PREFIX)g++ CFLAGS += -Wall -fno-stack-protector -nostdinc -Ic_include/ -I../c_include -ffreestanding -std=c11 -fno-builtin -Werror -nostdlib -g -fpie CPPFLAGS += -Wall -fno-stack-protector -nostdinc -std=c++14 -Iinclude/ -Ic_include/ -I../c_include -I../include -fno-rtti -fno-exceptions -ffreestanding -fno-builtin -Werror -nostdlib -fno-use-cxa-atexit -Wextra -Wno-unused -g -fno-pie -Wno-reorder -fdump-class-hierarchy -LDFLAGS += -nostdlib -nodefaultlibs -nostdlib -fno-builtin -T loader.ld +LDFLAGS += -nostdlib -nodefaultlibs -nostdlib -fno-builtin -T loader-$(arch)-$(subvar).ld all: $(OBJS) $(LD) $(LDFLAGS) -o mtgos.elf $(OBJS) -lgcc %.o: %.cpp diff --git a/kernel/init.cpp b/kernel/init.cpp index 1b6b55c..c47ad7b 100644 --- a/kernel/init.cpp +++ b/kernel/init.cpp @@ -9,6 +9,8 @@ #define Elf_Ehdr Elf32_Ehdr #define Elf_Phdr Elf32_Phdr #endif +char *lfb=(char*)0x18300000; +#define DIAGPXL(i) (lfb[6*(i)]=lfb[6*(i)+1]=lfb[6*(i)+2]=0xFF) /** \brief beginning of constructor table */ extern "C" void(*start_ctors)(); /** \brief end of constructor table */ @@ -44,6 +46,7 @@ MTGos::Base::Output out; * \brief Initializes the kernel */ extern "C" void _start(void ** modtable) { + DIAGPXL(13); //for(void(**i)()=&start_ctors;i<&end_ctors;i++) // (*i)(); //Calling constructors for(int i=0;i<1024;i++) { diff --git a/kernel/loader-3ds-11.ld b/kernel/loader-3ds-11.ld new file mode 100644 index 0000000..2e4b68e --- /dev/null +++ b/kernel/loader-3ds-11.ld @@ -0,0 +1,28 @@ +ENTRY(_start) +SECTIONS +{ + . = 0x1FF80000; + kernel_start = .; + .text : { + *(.text) + } + .data : { + start_ctors = .; + KEEP(*( .init_array )); + KEEP(*(SORT_BY_INIT_PRIORITY( .init_array.* ))); + *(.ctors) + end_ctors = .; + start_dtors = .; + *(.dtors) + end_dtors = .; + *(.data) + } + .rodata : { + *(.rodata) + } + .bss : { + *(.bss) + *(COMMON) + } + kernel_end = .; +} \ No newline at end of file diff --git a/kernel/loader-3ds-9.ld b/kernel/loader-3ds-9.ld new file mode 100644 index 0000000..3ea3590 --- /dev/null +++ b/kernel/loader-3ds-9.ld @@ -0,0 +1,28 @@ +ENTRY(_start) +SECTIONS +{ + . = 0x08000000; + kernel_start = .; + .text : { + *(.text) + } + .data : { + start_ctors = .; + KEEP(*( .init_array )); + KEEP(*(SORT_BY_INIT_PRIORITY( .init_array.* ))); + *(.ctors) + end_ctors = .; + start_dtors = .; + *(.dtors) + end_dtors = .; + *(.data) + } + .rodata : { + *(.rodata) + } + .bss : { + *(.bss) + *(COMMON) + } + kernel_end = .; +} \ No newline at end of file diff --git a/kernel/loader-x86-9.ld b/kernel/loader-x86-9.ld new file mode 100644 index 0000000..d8d5534 --- /dev/null +++ b/kernel/loader-x86-9.ld @@ -0,0 +1,28 @@ +ENTRY(_start) +SECTIONS +{ + . = 0x200000; + kernel_start = .; + .text : { + *(.text) + } + .data : { + start_ctors = .; + KEEP(*( .init_array )); + KEEP(*(SORT_BY_INIT_PRIORITY( .init_array.* ))); + *(.ctors) + end_ctors = .; + start_dtors = .; + *(.dtors) + end_dtors = .; + *(.data) + } + .rodata : { + *(.rodata) + } + .bss : { + *(.bss) + *(COMMON) + } + kernel_end = .; +} \ No newline at end of file diff --git a/kernel/loader-x86_64-9.ld b/kernel/loader-x86_64-9.ld new file mode 100644 index 0000000..d8d5534 --- /dev/null +++ b/kernel/loader-x86_64-9.ld @@ -0,0 +1,28 @@ +ENTRY(_start) +SECTIONS +{ + . = 0x200000; + kernel_start = .; + .text : { + *(.text) + } + .data : { + start_ctors = .; + KEEP(*( .init_array )); + KEEP(*(SORT_BY_INIT_PRIORITY( .init_array.* ))); + *(.ctors) + end_ctors = .; + start_dtors = .; + *(.dtors) + end_dtors = .; + *(.data) + } + .rodata : { + *(.rodata) + } + .bss : { + *(.bss) + *(COMMON) + } + kernel_end = .; +} \ No newline at end of file diff --git a/modules/3ds/Makefile b/modules/3ds/Makefile new file mode 100644 index 0000000..0e68fa9 --- /dev/null +++ b/modules/3ds/Makefile @@ -0,0 +1,5 @@ +SUBDIRS = dsp +all: + for dir in $(SUBDIRS); do \ + $(MAKE) -C $$dir; \ + done \ No newline at end of file diff --git a/modules/3ds/dsp/Makefile b/modules/3ds/dsp/Makefile new file mode 100644 index 0000000..28f28ca --- /dev/null +++ b/modules/3ds/dsp/Makefile @@ -0,0 +1,5 @@ +SUBDIRS = txt +all: + for dir in $(SUBDIRS); do \ + $(MAKE) -C $$dir; \ + done \ No newline at end of file diff --git a/modules/3ds/link.ld b/modules/3ds/link.ld new file mode 100644 index 0000000..2eb7f58 --- /dev/null +++ b/modules/3ds/link.ld @@ -0,0 +1,26 @@ +ENTRY(getTable) +OUTPUT_FORMAT(elf32-littlearm) +OUTPUT_ARCH(arm) +SECTIONS +{ + . = 0x20000000; + module_start = .; + .text : { + *(.text) + *(.text.*) + start_ctors = .; + KEEP(*( .init_array )); + KEEP(*(SORT_BY_INIT_PRIORITY( .init_array.* ))); + *(.ctors) + end_ctors = .; + start_dtors = .; + *(.dtors) + end_dtors = .; + *(.data) + *(.data.*) + *(.rodata) + *(.bss) + *(COMMON) + } + module_end = .; +} \ No newline at end of file