mirror of
https://github.com/fail0verflow/mini.git
synced 2024-06-04 10:18:52 +02:00
added elfloader. it actually compiles now :)
This commit is contained in:
parent
dfd2ba8069
commit
7b76dbc953
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -3,3 +3,4 @@ git_version.h
|
||||||
*.bin
|
*.bin
|
||||||
*.elf
|
*.elf
|
||||||
*.map
|
*.map
|
||||||
|
*~
|
||||||
|
|
8
Makefile
8
Makefile
|
@ -5,8 +5,8 @@ CFLAGS += -DCAN_HAZ_IRQ -DCAN_HAZ_IPC
|
||||||
LDSCRIPT = mini.ld
|
LDSCRIPT = mini.ld
|
||||||
LIBS = -lgcc
|
LIBS = -lgcc
|
||||||
|
|
||||||
ELFLOADER = ../elfloader/elfloader.bin
|
ELFLOADER = elfloader/elfloader.bin
|
||||||
MAKEBIN = python ../makebin.py
|
MAKEBIN = python makebin.py
|
||||||
|
|
||||||
TARGET = armboot.elf
|
TARGET = armboot.elf
|
||||||
TARGET_BIN = armboot.bin
|
TARGET_BIN = armboot.bin
|
||||||
|
@ -34,6 +34,10 @@ git_version.h:
|
||||||
|
|
||||||
clean: myclean
|
clean: myclean
|
||||||
|
|
||||||
|
$(ELFLOADER):
|
||||||
|
make -C elfloader
|
||||||
|
|
||||||
myclean:
|
myclean:
|
||||||
-rm -f $(TARGET_BIN) git_version.h
|
-rm -f $(TARGET_BIN) git_version.h
|
||||||
|
$(MAKE) -C elfloader clean
|
||||||
|
|
||||||
|
|
6
elfloader/.gitignore
vendored
Normal file
6
elfloader/.gitignore
vendored
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
*.d
|
||||||
|
*.bin
|
||||||
|
*.elf
|
||||||
|
*.o
|
||||||
|
*.map
|
||||||
|
|
23
elfloader/Makefile
Normal file
23
elfloader/Makefile
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
include ../starlet.mk
|
||||||
|
|
||||||
|
CFLAGS += -fpic
|
||||||
|
LDSCRIPT = stub.ld
|
||||||
|
LIBS = -lgcc
|
||||||
|
|
||||||
|
TARGET = elfloader.elf
|
||||||
|
TARGET_BIN = elfloader.bin
|
||||||
|
OBJS = start.o stub.o string.o utils.o
|
||||||
|
|
||||||
|
include ../common.mk
|
||||||
|
|
||||||
|
all: $(TARGET_BIN)
|
||||||
|
|
||||||
|
$(TARGET_BIN): $(TARGET)
|
||||||
|
@echo " OBJCPY $@"
|
||||||
|
@$(OBJCOPY) -O binary $< $@
|
||||||
|
|
||||||
|
clean: myclean
|
||||||
|
|
||||||
|
myclean:
|
||||||
|
-rm -f $(TARGET_BIN)
|
||||||
|
|
66
elfloader/elf.h
Normal file
66
elfloader/elf.h
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
/*
|
||||||
|
mini - a Free Software replacement for the Nintendo/BroadOn IOS.
|
||||||
|
|
||||||
|
ELF loader: ELF structures
|
||||||
|
|
||||||
|
Copyright (C) 2008, 2009 Hector Martin "marcan" <marcan@marcansoft.com>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, version 2.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
*/
|
||||||
|
#ifndef __ELF_H__
|
||||||
|
#define __ELF_H__
|
||||||
|
|
||||||
|
#include "types.h"
|
||||||
|
|
||||||
|
#define EI_NIDENT 16
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
unsigned char e_ident[EI_NIDENT];
|
||||||
|
u16 e_type;
|
||||||
|
u16 e_machine;
|
||||||
|
u32 e_version;
|
||||||
|
void *e_entry;
|
||||||
|
u32 e_phoff;
|
||||||
|
u32 e_shoff;
|
||||||
|
u32 e_flags;
|
||||||
|
u16 e_ehsize;
|
||||||
|
u16 e_phentsize;
|
||||||
|
u16 e_phnum;
|
||||||
|
u16 e_shentsize;
|
||||||
|
u16 e_shnum;
|
||||||
|
u16 e_shtrndx;
|
||||||
|
} Elf32_Ehdr;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
u32 p_type;
|
||||||
|
u32 p_offset;
|
||||||
|
void *p_vaddr;
|
||||||
|
void *p_paddr;
|
||||||
|
u32 p_filesz;
|
||||||
|
u32 p_memsz;
|
||||||
|
u32 p_flags;
|
||||||
|
u32 p_align;
|
||||||
|
} Elf32_Phdr;
|
||||||
|
|
||||||
|
#define PT_NULL 0
|
||||||
|
#define PT_LOAD 1
|
||||||
|
#define PT_DYNAMIC 2
|
||||||
|
#define PT_INTERP 3
|
||||||
|
#define PT_NOTE 4
|
||||||
|
#define PT_SHLIB 5
|
||||||
|
#define PT_PHDR 6
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
31
elfloader/hollywood.h
Normal file
31
elfloader/hollywood.h
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
/*
|
||||||
|
mini - a Free Software replacement for the Nintendo/BroadOn IOS.
|
||||||
|
|
||||||
|
ELF loader: Hollywood register definitions
|
||||||
|
|
||||||
|
Copyright (C) 2008, 2009 Hector Martin "marcan" <marcan@marcansoft.com>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, version 2.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
*/
|
||||||
|
#ifndef __HOLLYWOOD_H__
|
||||||
|
#define __HOLLYWOOD_H__
|
||||||
|
|
||||||
|
#define HW_REG_BASE 0xd800000
|
||||||
|
#define HW_TIMER (HW_REG_BASE + 0x010)
|
||||||
|
#define HW_MEMMIRR (HW_REG_BASE + 0x060)
|
||||||
|
#define HW_BOOT0 (HW_REG_BASE + 0x18c)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
113
elfloader/start.S
Normal file
113
elfloader/start.S
Normal file
|
@ -0,0 +1,113 @@
|
||||||
|
/*
|
||||||
|
mini - a Free Software replacement for the Nintendo/BroadOn IOS.
|
||||||
|
|
||||||
|
ELF loader: system startup
|
||||||
|
|
||||||
|
Copyright (C) 2008, 2009 Hector Martin "marcan" <marcan@marcansoft.com>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, version 2.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
*/
|
||||||
|
.arm
|
||||||
|
|
||||||
|
.extern _main
|
||||||
|
.extern __got_start
|
||||||
|
.extern __got_end
|
||||||
|
.extern __bss_start
|
||||||
|
.extern __bss_end
|
||||||
|
.extern __stack_addr
|
||||||
|
.extern delay
|
||||||
|
.globl _start
|
||||||
|
.globl debug_output
|
||||||
|
|
||||||
|
.section .init
|
||||||
|
|
||||||
|
_start:
|
||||||
|
@ Get real address of _start
|
||||||
|
sub r4, pc, #8
|
||||||
|
@ Subtract offset to get the address that we were loaded at
|
||||||
|
ldr r0, =_start
|
||||||
|
sub r4, r4, r0
|
||||||
|
@ Output 0x42 to the debug port
|
||||||
|
mov r0, #0x42
|
||||||
|
bl debug_output
|
||||||
|
|
||||||
|
@ Set up a stack
|
||||||
|
ldr sp, =__stack_addr
|
||||||
|
add sp, r4
|
||||||
|
|
||||||
|
@ Output 0x43 to the debug port
|
||||||
|
mov r0, #0x43
|
||||||
|
bl debug_output
|
||||||
|
|
||||||
|
@ relocate the GOT entries
|
||||||
|
ldr r1, =__got_start
|
||||||
|
add r1, r4
|
||||||
|
ldr r2, =__got_end
|
||||||
|
add r2, r4
|
||||||
|
got_loop:
|
||||||
|
@ check for the end
|
||||||
|
cmp r1, r2
|
||||||
|
beq done_got
|
||||||
|
@ read the GOT entry
|
||||||
|
ldr r3, [r1]
|
||||||
|
@ add our base address
|
||||||
|
add r3, r4
|
||||||
|
str r3, [r1]
|
||||||
|
@ move on
|
||||||
|
add r1, r1, #4
|
||||||
|
b got_loop
|
||||||
|
|
||||||
|
done_got:
|
||||||
|
@ clear BSS
|
||||||
|
ldr r1, =__bss_start
|
||||||
|
add r1, r4
|
||||||
|
ldr r2, =__bss_end
|
||||||
|
add r2, r4
|
||||||
|
mov r3, #0
|
||||||
|
bss_loop:
|
||||||
|
@ check for the end
|
||||||
|
cmp r1, r2
|
||||||
|
beq done_bss
|
||||||
|
@ clear the word and move on
|
||||||
|
str r3, [r1]
|
||||||
|
add r1, r1, #4
|
||||||
|
b bss_loop
|
||||||
|
|
||||||
|
done_bss:
|
||||||
|
mov r0, #0x44
|
||||||
|
bl debug_output
|
||||||
|
@ take the plunge
|
||||||
|
mov r0, r4
|
||||||
|
bl _main
|
||||||
|
@ _main returned! Go to whatever address it returned...
|
||||||
|
mov r1, r0
|
||||||
|
mov r0, r4
|
||||||
|
mov pc, r1
|
||||||
|
|
||||||
|
.pool
|
||||||
|
|
||||||
|
debug_output:
|
||||||
|
@ load address of port
|
||||||
|
mov r3, #0xd800000
|
||||||
|
@ load old value
|
||||||
|
ldr r2, [r3, #0xe0]
|
||||||
|
@ clear debug byte
|
||||||
|
bic r2, r2, #0xFF0000
|
||||||
|
@ insert new value
|
||||||
|
and r0, r0, #0xFF
|
||||||
|
orr r2, r2, r0, LSL #16
|
||||||
|
@ store back
|
||||||
|
str r2, [r3, #0xe0]
|
||||||
|
mov pc, lr
|
30
elfloader/start.h
Normal file
30
elfloader/start.h
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
/*
|
||||||
|
mini - a Free Software replacement for the Nintendo/BroadOn IOS.
|
||||||
|
|
||||||
|
ELF loader: system startup
|
||||||
|
|
||||||
|
Copyright (C) 2008, 2009 Hector Martin "marcan" <marcan@marcansoft.com>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, version 2.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
*/
|
||||||
|
#ifndef __START_H__
|
||||||
|
#define __START_H__
|
||||||
|
|
||||||
|
#include "types.h"
|
||||||
|
|
||||||
|
void debug_output(u8 byte);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
1
elfloader/string.c
Symbolic link
1
elfloader/string.c
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../string.c
|
1
elfloader/string.h
Symbolic link
1
elfloader/string.h
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../string.h
|
86
elfloader/stub.c
Normal file
86
elfloader/stub.c
Normal file
|
@ -0,0 +1,86 @@
|
||||||
|
/*
|
||||||
|
mini - a Free Software replacement for the Nintendo/BroadOn IOS.
|
||||||
|
|
||||||
|
ELF loader
|
||||||
|
|
||||||
|
Copyright (C) 2008, 2009 Hector Martin "marcan" <marcan@marcansoft.com>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, version 2.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
*/
|
||||||
|
#include "types.h"
|
||||||
|
#include "utils.h"
|
||||||
|
#include "start.h"
|
||||||
|
#include "hollywood.h"
|
||||||
|
#include "string.h"
|
||||||
|
#include "elf.h"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
u32 hdrsize;
|
||||||
|
u32 loadersize;
|
||||||
|
u32 elfsize;
|
||||||
|
u32 argument;
|
||||||
|
} ioshdr;
|
||||||
|
|
||||||
|
void *loadelf(const u8 *elf) {
|
||||||
|
if(memcmp("\x7F" "ELF\x01\x02\x01",elf,7)) {
|
||||||
|
panic(0xE3);
|
||||||
|
}
|
||||||
|
|
||||||
|
Elf32_Ehdr *ehdr = (Elf32_Ehdr*)elf;
|
||||||
|
if(ehdr->e_phoff == 0) {
|
||||||
|
panic(0xE4);
|
||||||
|
}
|
||||||
|
int count = ehdr->e_phnum;
|
||||||
|
Elf32_Phdr *phdr = (Elf32_Phdr*)(elf + ehdr->e_phoff);
|
||||||
|
while(count--)
|
||||||
|
{
|
||||||
|
if(phdr->p_type == PT_LOAD) {
|
||||||
|
const void *src = elf + phdr->p_offset;
|
||||||
|
memcpy(phdr->p_paddr, src, phdr->p_filesz);
|
||||||
|
}
|
||||||
|
phdr++;
|
||||||
|
}
|
||||||
|
return ehdr->e_entry;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void disable_boot0()
|
||||||
|
{
|
||||||
|
set32(HW_BOOT0, 0x1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void mem_setswap()
|
||||||
|
{
|
||||||
|
set32(HW_MEMMIRR, 0x20);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *_main(void *base)
|
||||||
|
{
|
||||||
|
ioshdr *hdr = (ioshdr*)base;
|
||||||
|
u8 *elf;
|
||||||
|
void *entry;
|
||||||
|
|
||||||
|
elf = (u8*) base;
|
||||||
|
elf += hdr->hdrsize + hdr->loadersize;
|
||||||
|
|
||||||
|
debug_output(0xF1);
|
||||||
|
mem_setswap(1);
|
||||||
|
disable_boot0(1);
|
||||||
|
|
||||||
|
entry = loadelf(elf);
|
||||||
|
debug_output(0xC1);
|
||||||
|
return entry;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
117
elfloader/stub.ld
Normal file
117
elfloader/stub.ld
Normal file
|
@ -0,0 +1,117 @@
|
||||||
|
/*
|
||||||
|
elfloader - a Free Software replacement for the Nintendo/BroadOn IOS.
|
||||||
|
|
||||||
|
Copyright (C) 2008, 2009 Hector Martin "marcan" <marcan@marcansoft.com>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, version 2.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
*/
|
||||||
|
OUTPUT_FORMAT("elf32-bigarm")
|
||||||
|
OUTPUT_ARCH(arm)
|
||||||
|
EXTERN(_start)
|
||||||
|
ENTRY(_start)
|
||||||
|
|
||||||
|
__base_addr = 0;
|
||||||
|
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
. = __base_addr;
|
||||||
|
.header :
|
||||||
|
{
|
||||||
|
__header = .;
|
||||||
|
/* Entry point (offset) */
|
||||||
|
LONG(__code_start);
|
||||||
|
/* Loader size */
|
||||||
|
LONG(__loader_size);
|
||||||
|
/* ELF size */
|
||||||
|
LONG(0);
|
||||||
|
/* Boot argument? */
|
||||||
|
LONG(0);
|
||||||
|
. = ALIGN(16);
|
||||||
|
}
|
||||||
|
|
||||||
|
__code_start = .;
|
||||||
|
|
||||||
|
.init :
|
||||||
|
{
|
||||||
|
*(.init)
|
||||||
|
. = ALIGN(4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.got :
|
||||||
|
{
|
||||||
|
__got_start = .;
|
||||||
|
*(.got.*)
|
||||||
|
*(.got)
|
||||||
|
. = ALIGN(4);
|
||||||
|
__got_end = . ;
|
||||||
|
}
|
||||||
|
|
||||||
|
.text :
|
||||||
|
{
|
||||||
|
*(.text.*)
|
||||||
|
*(.gnu.warning)
|
||||||
|
*(.gnu.linkonce.t*)
|
||||||
|
*(.glue_7)
|
||||||
|
*(.glue_7t)
|
||||||
|
. = ALIGN(4);
|
||||||
|
}
|
||||||
|
|
||||||
|
__text_end = . ;
|
||||||
|
|
||||||
|
.rodata :
|
||||||
|
{
|
||||||
|
*(.rodata)
|
||||||
|
*all.rodata*(*)
|
||||||
|
*(.roda)
|
||||||
|
*(.rodata.*)
|
||||||
|
*(.gnu.linkonce.r*)
|
||||||
|
. = ALIGN(4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.data :
|
||||||
|
{
|
||||||
|
*(.data)
|
||||||
|
*(.data.*)
|
||||||
|
*(.gnu.linkonce.d*)
|
||||||
|
. = ALIGN(4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.bss :
|
||||||
|
{
|
||||||
|
__bss_start = . ;
|
||||||
|
*(.dynbss)
|
||||||
|
*(.gnu.linkonce.b*)
|
||||||
|
*(.bss*)
|
||||||
|
*(.sbss*)
|
||||||
|
*(COMMON)
|
||||||
|
. = ALIGN(32);
|
||||||
|
__bss_end = . ;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
__stack_end = (__bss_end);
|
||||||
|
__stack_addr = (__bss_end + 0x100);
|
||||||
|
|
||||||
|
__end = __stack_addr ;
|
||||||
|
__loader_size = __end - __code_start;
|
||||||
|
|
||||||
|
PROVIDE (__stack_end = __stack_end);
|
||||||
|
PROVIDE (__stack_addr = __stack_addr);
|
||||||
|
PROVIDE (__got_start = __got_start);
|
||||||
|
PROVIDE (__got_end = __got_end);
|
||||||
|
PROVIDE (__bss_start = __bss_start);
|
||||||
|
PROVIDE (__bss_end = __bss_end);
|
||||||
|
|
50
elfloader/types.h
Normal file
50
elfloader/types.h
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
/*
|
||||||
|
mini - a Free Software replacement for the Nintendo/BroadOn IOS.
|
||||||
|
|
||||||
|
ELF loader: types
|
||||||
|
|
||||||
|
Copyright (C) 2008, 2009 Hector Martin "marcan" <marcan@marcansoft.com>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, version 2.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
*/
|
||||||
|
#ifndef __TYPES_H__
|
||||||
|
#define __TYPES_H__
|
||||||
|
|
||||||
|
typedef unsigned char u8;
|
||||||
|
typedef unsigned short u16;
|
||||||
|
typedef unsigned int u32;
|
||||||
|
typedef unsigned long long u64;
|
||||||
|
|
||||||
|
typedef signed char s8;
|
||||||
|
typedef signed short s16;
|
||||||
|
typedef signed int s32;
|
||||||
|
typedef signed long long s64;
|
||||||
|
|
||||||
|
typedef volatile unsigned char vu8;
|
||||||
|
typedef volatile unsigned short vu16;
|
||||||
|
typedef volatile unsigned int vu32;
|
||||||
|
typedef volatile unsigned long long vu64;
|
||||||
|
|
||||||
|
typedef volatile signed char vs8;
|
||||||
|
typedef volatile signed short vs16;
|
||||||
|
typedef volatile signed int vs32;
|
||||||
|
typedef volatile signed long long vs64;
|
||||||
|
|
||||||
|
typedef s32 size_t;
|
||||||
|
|
||||||
|
#define NULL ((void *)0)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
45
elfloader/utils.c
Normal file
45
elfloader/utils.c
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
/*
|
||||||
|
mini - a Free Software replacement for the Nintendo/BroadOn IOS.
|
||||||
|
|
||||||
|
ELF loader: random utilities
|
||||||
|
|
||||||
|
Copyright (C) 2008, 2009 Hector Martin "marcan" <marcan@marcansoft.com>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, version 2.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
*/
|
||||||
|
#include "types.h"
|
||||||
|
#include "utils.h"
|
||||||
|
#include "hollywood.h"
|
||||||
|
#include "start.h"
|
||||||
|
|
||||||
|
void udelay(u32 d)
|
||||||
|
{
|
||||||
|
// should be good to max .2% error
|
||||||
|
u32 ticks = d * 19 / 10;
|
||||||
|
|
||||||
|
write32(HW_TIMER, 0);
|
||||||
|
while(read32(HW_TIMER) < ticks);
|
||||||
|
}
|
||||||
|
|
||||||
|
void panic(u8 v)
|
||||||
|
{
|
||||||
|
while(1) {
|
||||||
|
debug_output(v);
|
||||||
|
udelay(500000);
|
||||||
|
debug_output(0);
|
||||||
|
udelay(500000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
188
elfloader/utils.h
Normal file
188
elfloader/utils.h
Normal file
|
@ -0,0 +1,188 @@
|
||||||
|
/*
|
||||||
|
mini - a Free Software replacement for the Nintendo/BroadOn IOS.
|
||||||
|
|
||||||
|
ELF loader: random utilities
|
||||||
|
|
||||||
|
Copyright (C) 2008, 2009 Hector Martin "marcan" <marcan@marcansoft.com>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, version 2.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
*/
|
||||||
|
#ifndef __UTILS_H__
|
||||||
|
#define __UTILS_H__
|
||||||
|
|
||||||
|
static inline u32 read32(u32 addr)
|
||||||
|
{
|
||||||
|
u32 data;
|
||||||
|
__asm__ volatile ("ldr\t%0, [%1]" : "=r" (data) : "r" (addr));
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void write32(u32 addr, u32 data)
|
||||||
|
{
|
||||||
|
__asm__ volatile ("str\t%0, [%1]" : : "r" (data), "r" (addr));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline u32 set32(u32 addr, u32 set)
|
||||||
|
{
|
||||||
|
u32 data;
|
||||||
|
__asm__ volatile (
|
||||||
|
"ldr\t%0, [%1]\n"
|
||||||
|
"\torr\t%0, %2\n"
|
||||||
|
"\tstr\t%0, [%1]"
|
||||||
|
: "=&r" (data)
|
||||||
|
: "r" (addr), "r" (set)
|
||||||
|
);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline u32 clear32(u32 addr, u32 clear)
|
||||||
|
{
|
||||||
|
u32 data;
|
||||||
|
__asm__ volatile (
|
||||||
|
"ldr\t%0, [%1]\n"
|
||||||
|
"\tbic\t%0, %2\n"
|
||||||
|
"\tstr\t%0, [%1]"
|
||||||
|
: "=&r" (data)
|
||||||
|
: "r" (addr), "r" (clear)
|
||||||
|
);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static inline u32 mask32(u32 addr, u32 clear, u32 set)
|
||||||
|
{
|
||||||
|
u32 data;
|
||||||
|
__asm__ volatile (
|
||||||
|
"ldr\t%0, [%1]\n"
|
||||||
|
"\tbic\t%0, %3\n"
|
||||||
|
"\torr\t%0, %2\n"
|
||||||
|
"\tstr\t%0, [%1]"
|
||||||
|
: "=&r" (data)
|
||||||
|
: "r" (addr), "r" (set), "r" (clear)
|
||||||
|
);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline u16 read16(u32 addr)
|
||||||
|
{
|
||||||
|
u32 data;
|
||||||
|
__asm__ volatile ("ldrh\t%0, [%1]" : "=r" (data) : "r" (addr));
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void write16(u32 addr, u16 data)
|
||||||
|
{
|
||||||
|
__asm__ volatile ("strh\t%0, [%1]" : : "r" (data), "r" (addr));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline u16 set16(u32 addr, u16 set)
|
||||||
|
{
|
||||||
|
u16 data;
|
||||||
|
__asm__ volatile (
|
||||||
|
"ldrh\t%0, [%1]\n"
|
||||||
|
"\torr\t%0, %2\n"
|
||||||
|
"\tstrh\t%0, [%1]"
|
||||||
|
: "=&r" (data)
|
||||||
|
: "r" (addr), "r" (set)
|
||||||
|
);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline u16 clear16(u32 addr, u16 clear)
|
||||||
|
{
|
||||||
|
u16 data;
|
||||||
|
__asm__ volatile (
|
||||||
|
"ldrh\t%0, [%1]\n"
|
||||||
|
"\tbic\t%0, %2\n"
|
||||||
|
"\tstrh\t%0, [%1]"
|
||||||
|
: "=&r" (data)
|
||||||
|
: "r" (addr), "r" (clear)
|
||||||
|
);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static inline u16 mask16(u32 addr, u16 clear, u16 set)
|
||||||
|
{
|
||||||
|
u16 data;
|
||||||
|
__asm__ volatile (
|
||||||
|
"ldrh\t%0, [%1]\n"
|
||||||
|
"\tbic\t%0, %3\n"
|
||||||
|
"\torr\t%0, %2\n"
|
||||||
|
"\tstrh\t%0, [%1]"
|
||||||
|
: "=&r" (data)
|
||||||
|
: "r" (addr), "r" (set), "r" (clear)
|
||||||
|
);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline u8 read8(u32 addr)
|
||||||
|
{
|
||||||
|
u32 data;
|
||||||
|
__asm__ volatile ("ldrb\t%0, [%1]" : "=r" (data) : "r" (addr));
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void write8(u32 addr, u8 data)
|
||||||
|
{
|
||||||
|
__asm__ volatile ("strb\t%0, [%1]" : : "r" (data), "r" (addr));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline u8 set8(u32 addr, u8 set)
|
||||||
|
{
|
||||||
|
u8 data;
|
||||||
|
__asm__ volatile (
|
||||||
|
"ldrb\t%0, [%1]\n"
|
||||||
|
"\torr\t%0, %2\n"
|
||||||
|
"\tstrb\t%0, [%1]"
|
||||||
|
: "=&r" (data)
|
||||||
|
: "r" (addr), "r" (set)
|
||||||
|
);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline u8 clear8(u32 addr, u8 clear)
|
||||||
|
{
|
||||||
|
u8 data;
|
||||||
|
__asm__ volatile (
|
||||||
|
"ldrb\t%0, [%1]\n"
|
||||||
|
"\tbic\t%0, %2\n"
|
||||||
|
"\tstrb\t%0, [%1]"
|
||||||
|
: "=&r" (data)
|
||||||
|
: "r" (addr), "r" (clear)
|
||||||
|
);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static inline u8 mask8(u32 addr, u8 clear, u8 set)
|
||||||
|
{
|
||||||
|
u8 data;
|
||||||
|
__asm__ volatile (
|
||||||
|
"ldrb\t%0, [%1]\n"
|
||||||
|
"\tbic\t%0, %3\n"
|
||||||
|
"\torr\t%0, %2\n"
|
||||||
|
"\tstrb\t%0, [%1]"
|
||||||
|
: "=&r" (data)
|
||||||
|
: "r" (addr), "r" (set), "r" (clear)
|
||||||
|
);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
void udelay(u32 d);
|
||||||
|
void panic(u8 v);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
49
makebin.py
Normal file
49
makebin.py
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
#!/bin/env python
|
||||||
|
|
||||||
|
import sys, os, struct, sha
|
||||||
|
|
||||||
|
loaderfile = sys.argv[1]
|
||||||
|
elffile = sys.argv[2]
|
||||||
|
outfile = sys.argv[3]
|
||||||
|
|
||||||
|
data = open(loaderfile,"rb").read()
|
||||||
|
|
||||||
|
hdrlen, loaderlen, elflen, arg = struct.unpack(">IIII",data[:16])
|
||||||
|
|
||||||
|
if hdrlen < 0x10:
|
||||||
|
print "ERROR: header length is 0x%x, expected at least 0x10"%hdrlen
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
loaderoff = hdrlen
|
||||||
|
elfoff = loaderoff + loaderlen
|
||||||
|
elfend = elfoff + elflen
|
||||||
|
|
||||||
|
hdr = data[:hdrlen]
|
||||||
|
loader = data[loaderoff:elfoff]
|
||||||
|
|
||||||
|
elf = open(elffile,"rb").read()
|
||||||
|
|
||||||
|
if elflen > 0:
|
||||||
|
print "WARNING: loader already contains ELF, will replace"
|
||||||
|
|
||||||
|
elflen = len(elf)
|
||||||
|
|
||||||
|
if loaderlen < len(loader):
|
||||||
|
print "ERROR: loader is larger than its reported length"
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
if loaderlen > len(loader):
|
||||||
|
print "Padding loader with 0x%x zeroes"%(loaderlen-len(loader))
|
||||||
|
loader += "\x00"*(loaderlen-len(loader))
|
||||||
|
|
||||||
|
newdata = struct.pack(">IIII", hdrlen, loaderlen, elflen, 0) + hdr[16:]
|
||||||
|
newdata += loader
|
||||||
|
newdata += elf
|
||||||
|
|
||||||
|
print "Header: 0x%x bytes"%(hdrlen)
|
||||||
|
print "Loader: 0x%x bytes"%(loaderlen)
|
||||||
|
print "ELF: 0x%x bytes"%(elflen)
|
||||||
|
|
||||||
|
f = open(outfile,"wb")
|
||||||
|
f.write(newdata)
|
||||||
|
f.close()
|
Loading…
Reference in New Issue
Block a user