├── bytecode └── bytecode ├── src ├── arm │ ├── exceptions.s │ ├── linker.ld │ ├── arm_code.s │ ├── native_instrs.s │ ├── instr_handlers.s │ └── table.s ├── main.c ├── jazelle.c └── arm.c ├── include ├── jazelle.h └── arm.h ├── .gitignore ├── README.md ├── COPYING └── Makefile /bytecode/bytecode: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thamugadi/jazelle-wii/HEAD/bytecode/bytecode -------------------------------------------------------------------------------- /src/arm/exceptions.s: -------------------------------------------------------------------------------- 1 | NULL_PTR_EXCEPTION: 2 | //TODO 3 | ARRAY_INDEX_OOB_EXCEPTION: 4 | //TODO 5 | JE_ZERO: 6 | //TODO 7 | INVALID_CONFIG: 8 | //TODO 9 | PREFETCH_ABORT_MIDDLE_INST: 10 | //TODO 11 | -------------------------------------------------------------------------------- /include/jazelle.h: -------------------------------------------------------------------------------- 1 | 2 | #include 3 | #include 4 | // 512 KiB of stack 5 | 6 | #define STACK_BASE 0x90000000 7 | #define LOCAL_VARS (STACK_BASE + 0x80000) 8 | 9 | void exec_jazelle(); 10 | -------------------------------------------------------------------------------- /src/arm/linker.ld: -------------------------------------------------------------------------------- 1 | ENTRY(_start) 2 | OUTPUT_FORMAT("elf32-bigarm") 3 | OUTPUT_ARCH(arm) 4 | SECTIONS 5 | { 6 | . = 0x12000000; 7 | .text : { 8 | _start = .; 9 | } 10 | 11 | .data : { 12 | *(.data) 13 | *(.data.*) 14 | } 15 | 16 | .bss : { 17 | *(.bss) 18 | *(.bss.*) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Prerequisites 2 | *.d 3 | 4 | # Object files 5 | *.o 6 | *.ko 7 | *.obj 8 | *.elf 9 | 10 | # Linker output 11 | *.ilk 12 | *.map 13 | *.exp 14 | 15 | # Precompiled Headers 16 | *.gch 17 | *.pch 18 | 19 | # Libraries 20 | *.lib 21 | *.a 22 | *.la 23 | *.lo 24 | 25 | # Shared objects (inc. Windows DLLs) 26 | *.dll 27 | *.so 28 | *.so.* 29 | *.dylib 30 | 31 | # Executables 32 | *.exe 33 | *.out 34 | *.app 35 | *.i*86 36 | *.x86_64 37 | *.hex 38 | 39 | # Debug files 40 | *.dSYM/ 41 | *.su 42 | *.idb 43 | *.pdb 44 | 45 | # Kernel Module Compile Results 46 | *.mod* 47 | *.cmd 48 | .tmp_versions/ 49 | modules.order 50 | Module.symvers 51 | Mkfile.old 52 | dkms.conf 53 | 54 | *.json 55 | *.elf 56 | *.o 57 | *.bin 58 | *.map 59 | build 60 | bin 61 | *.dol 62 | .cache 63 | -------------------------------------------------------------------------------- /src/main.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | #include 11 | #include 12 | 13 | static void* xfb = NULL; 14 | static GXRModeObj* rmode = NULL; 15 | 16 | int main(int argc, char** argv) { 17 | VIDEO_Init(); 18 | WPAD_Init(); 19 | rmode = VIDEO_GetPreferredMode(NULL); 20 | xfb = MEM_K0_TO_K1(SYS_AllocateFramebuffer(rmode)); 21 | 22 | console_init(xfb,20,20,rmode->fbWidth,rmode->xfbHeight,rmode->fbWidth*VI_DISPLAY_PIX_SZ); 23 | VIDEO_Configure(rmode); 24 | VIDEO_SetNextFramebuffer(xfb); 25 | VIDEO_SetBlack(false); 26 | VIDEO_Flush(); 27 | VIDEO_WaitVSync(); 28 | if(rmode->viTVMode&VI_NON_INTERLACE) VIDEO_WaitVSync(); 29 | printf("\x1b[2;0H"); 30 | printf("aramya's jazelle experiments\n"); 31 | 32 | exec_jazelle(); 33 | 34 | while(1) { 35 | VIDEO_WaitVSync(); 36 | sleep(0x40); 37 | SYS_ResetSystem(SYS_RESTART,0,0); 38 | } 39 | return 0; 40 | } 41 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # jazelle-wii 2 | 3 | This Wii homebrew executes ARM code on the Starlet with [Palapeli's exploit](https://github.com/mkwcat/saoirse/blob/master/channel/Main/IOSBoot.cpp#L86), and uses it to set the Starlet in Jazelle mode. It then jumps to the JVM bytecode specified in [bytecode/bytecode](bytecode/bytecode). In the included example, it is: 4 | 5 | ``` 6 | bipush 19 7 | istore_0 8 | iload_0 9 | ireturn 10 | ``` 11 | 12 | After the execution, it prints the state of the stack, and the 8 first local variables. 13 | 14 | **NOTE: A large number of instructions is not natively supported by Jazelle and must be handled by predefined ARM code. As except ``ireturn`` none has been implemented here, it will fail to run most programs. Placeholders for the handlers are available in [src/arm/instr\_handlers.s](src/arm/instr_handlers.s). This repository can then serve as a basis for a broader implementation.** 15 | 16 | # References 17 | - https://github.com/mkwcat/saoirse/blob/master/channel/Main/IOSBoot.cpp (IOSBoot::Entry) (Palapeli's exploit) 18 | - https://mariokartwii.com/showthread.php?tid=1994 19 | - https://hackspire.org/index.php/Jazelle 20 | - https://github.com/SonoSooS/libjz 21 | - https://github.com/neuschaefer/jzvm 22 | - https://github.com/devkitPro/libogc 23 | -------------------------------------------------------------------------------- /COPYING: -------------------------------------------------------------------------------- 1 | BSD 2-Clause License 2 | 3 | Copyright (c) 2024, aramya 4 | 5 | Redistribution and use in source and binary forms, with or without 6 | modification, are permitted provided that the following conditions are met: 7 | 8 | 1. Redistributions of source code must retain the above copyright notice, this 9 | list of conditions and the following disclaimer. 10 | 11 | 2. Redistributions in binary form must reproduce the above copyright notice, 12 | this list of conditions and the following disclaimer in the documentation 13 | and/or other materials provided with the distribution. 14 | 15 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 16 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 18 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 19 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 21 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 22 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 23 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 24 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 | -------------------------------------------------------------------------------- /src/arm/arm_code.s: -------------------------------------------------------------------------------- 1 | .syntax unified 2 | .arch armv7-a 3 | 4 | .equ STACK, 0x10000000 5 | 6 | jmp_mem2: 7 | mov r0, #0x12 8 | lsl r0, r0, #24 9 | add r0, r0, #0x10 10 | bx r0 11 | 12 | _start: 13 | push {r4-r11, lr} 14 | 15 | mov r0, #2 16 | mcr p14, 7, r0, c1, c0, 0 17 | mov r0, #1 18 | mcr p14, 7, r0, c2, c0, 0 19 | 20 | mov r6, #STACK 21 | mov r0, #8 22 | lsl r0, r0, 16 23 | add r7, r6, r0 // local vars 24 | 25 | ldr r5, =addr_handler_table 26 | ldr r5, [r5] 27 | 28 | ldr r12, =addr_exit_jazelle 29 | ldr r12, [r12] 30 | 31 | ldr lr, =addr_jvm_bytecode 32 | ldr lr, [lr] 33 | 34 | // entering jazelle mode 35 | 36 | bxj r12 37 | 38 | .align 4 39 | 40 | addr_handler_table: 41 | .4byte handler_table 42 | addr_exit_jazelle: 43 | .4byte exit_jazelle 44 | addr_jvm_bytecode: 45 | .4byte jvm_bytecode 46 | 47 | exit_jazelle: 48 | mov r0, #0 49 | mcr p14, 7, r0, c1, c0, 0 50 | mcr p14, 7, r0, c2, c0, 0 51 | 52 | mov r0, #0x13 53 | lsl r0, r0, #24 54 | add r0, r0, #4 55 | str r6, [r0] 56 | add r0, r0, #4 57 | str r6, [r0] 58 | sub r0, r0, #8 59 | mov r1, #0xee 60 | lsl r1, r1, #8 61 | add r1, #0xee 62 | lsl r1, r1, #8 63 | add r1, #0xee 64 | lsl r1, r1, #8 65 | add r1, #0xee 66 | str r1, [r0] 67 | 68 | pop {r4-r11, pc} 69 | 70 | bx lr 71 | 72 | handler_table: 73 | .include "src/arm/table.s" 74 | .include "src/arm/instr_handlers.s" 75 | .include "src/arm/native_instrs.s" 76 | .include "src/arm/exceptions.s" 77 | 78 | .word 0xabcdefaa 79 | .word 4 80 | jvm_bytecode: 81 | .incbin "bytecode/bytecode" 82 | -------------------------------------------------------------------------------- /src/jazelle.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | #include 11 | #include 12 | 13 | void exec_jazelle() { 14 | int i; 15 | for (int i = 0; i < sizeof(arm_code)/4; i++) { 16 | *(u32*)(0x92000000+i*4) = arm_code[i]; 17 | } 18 | memset((void*)STACK_BASE, 0, (LOCAL_VARS-STACK_BASE)+0x100); 19 | 20 | DCFlushRange((void*)STACK_BASE, (LOCAL_VARS-STACK_BASE)+0x100); 21 | IOS_Write(-1, (void*)STACK_BASE, (LOCAL_VARS-STACK_BASE)+0x100); 22 | 23 | u32* arm_code_mem2 = (u32*)0x92000000; 24 | 25 | DCFlushRange((u32*)arm_code, sizeof(arm_code)); 26 | DCFlushRange(arm_code_mem2, sizeof(arm_code)); 27 | 28 | u32* search = arm_code_mem2; 29 | while(*search != 0xabcdefaa) { 30 | search++; 31 | } 32 | search++; 33 | u32 len = *search + 1; 34 | search++; 35 | u8* bytecode = (u8*)search; 36 | 37 | printf("JVM bytecode to be executed: "); 38 | for (i = 0; i < len; i++) { 39 | printf("%02x ", bytecode[i]); 40 | } 41 | printf("\n"); 42 | 43 | printf("Performing Palapeli's /dev/sha exploit\n"); 44 | #ifdef THUMB 45 | run_arm((u32*)arm_code_mem2, sizeof(arm_code), true); 46 | #else 47 | run_arm((u32*)arm_code_mem2, sizeof(arm_code), false); 48 | #endif 49 | printf("Starlet is running in Jazelle mode to execute the specified JVM bytecode\n"); 50 | 51 | while (*(u32*)0x93000000 != 0xeeeeeeee); // flag used in exit_jazelle 52 | 53 | DCFlushRange((void*)STACK_BASE, (LOCAL_VARS-STACK_BASE)+0x100); 54 | IOS_Write(-1, (void*)STACK_BASE, (LOCAL_VARS-STACK_BASE)+0x100); 55 | 56 | u32* stack = (u32*)(0x80000000 + (*(u32*)0x93000004)); 57 | printf("Finished execution. Stack: "); 58 | for (u32* si = stack-1; si >= (u32*)STACK_BASE; si--) { 59 | printf("%08x ", *si); 60 | } 61 | printf("\n"); 62 | for (i = 0; i < 8; i++) { 63 | printf("Local variable %08x: %08x\n", (u32)(LOCAL_VARS+i*4), *(u32*)(LOCAL_VARS+i*4)); 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /src/arm/native_instrs.s: -------------------------------------------------------------------------------- 1 | NOP_HANDLER_STUB: 2 | ICONST_M1_HANDLER_STUB: 3 | ICONST_0_HANDLER_STUB: 4 | ICONST_1_HANDLER_STUB: 5 | ICONST_2_HANDLER_STUB: 6 | ICONST_3_HANDLER_STUB: 7 | ICONST_4_HANDLER_STUB: 8 | ICONST_5_HANDLER_STUB: 9 | FCONST_0_HANDLER_STUB: 10 | BIPUSH_HANDLER_STUB: 11 | SIPUSH_HANDLER_STUB: 12 | ILOAD_HANDLER_STUB: 13 | LLOAD_HANDLER_STUB: 14 | FLOAD_HANDLER_STUB: 15 | DLOAD_HANDLER_STUB: 16 | ALOAD_HANDLER_STUB: 17 | ILOAD_0_HANDLER_STUB: 18 | ILOAD_1_HANDLER_STUB: 19 | ILOAD_2_HANDLER_STUB: 20 | ILOAD_3_HANDLER_STUB: 21 | LLOAD_0_HANDLER_STUB: 22 | LLOAD_1_HANDLER_STUB: 23 | LLOAD_2_HANDLER_STUB: 24 | LLOAD_3_HANDLER_STUB: 25 | FLOAD_0_HANDLER_STUB: 26 | FLOAD_1_HANDLER_STUB: 27 | FLOAD_2_HANDLER_STUB: 28 | FLOAD_3_HANDLER_STUB: 29 | DLOAD_0_HANDLER_STUB: 30 | DLOAD_1_HANDLER_STUB: 31 | DLOAD_2_HANDLER_STUB: 32 | DLOAD_3_HANDLER_STUB: 33 | ALOAD_0_HANDLER_STUB: 34 | ALOAD_1_HANDLER_STUB: 35 | ALOAD_2_HANDLER_STUB: 36 | ALOAD_3_HANDLER_STUB: 37 | ISTORE_HANDLER_STUB: 38 | LSTORE_HANDLER_STUB: 39 | FSTORE_HANDLER_STUB: 40 | DSTORE_HANDLER_STUB: 41 | ASTORE_HANDLER_STUB: 42 | ISTORE_0_HANDLER_STUB: 43 | ISTORE_1_HANDLER_STUB: 44 | ISTORE_2_HANDLER_STUB: 45 | ISTORE_3_HANDLER_STUB: 46 | LSTORE_0_HANDLER_STUB: 47 | LSTORE_1_HANDLER_STUB: 48 | LSTORE_2_HANDLER_STUB: 49 | LSTORE_3_HANDLER_STUB: 50 | FSTORE_0_HANDLER_STUB: 51 | FSTORE_1_HANDLER_STUB: 52 | FSTORE_2_HANDLER_STUB: 53 | FSTORE_3_HANDLER_STUB: 54 | DSTORE_0_HANDLER_STUB: 55 | DSTORE_1_HANDLER_STUB: 56 | DSTORE_2_HANDLER_STUB: 57 | DSTORE_3_HANDLER_STUB: 58 | POP_HANDLER_STUB: 59 | POP2_HANDLER_STUB: 60 | DUP_HANDLER_STUB: 61 | DUP_X1_HANDLER_STUB: 62 | DUP_X2_HANDLER_STUB: 63 | DUP2_HANDLER_STUB: 64 | DUP2_X1_HANDLER_STUB: 65 | DUP2_X2_HANDLER_STUB: 66 | SWAP_HANDLER_STUB: 67 | IADD_HANDLER_STUB: 68 | LADD_HANDLER_STUB: 69 | ISUB_HANDLER_STUB: 70 | LSUB_HANDLER_STUB: 71 | IMUL_HANDLER_STUB: 72 | LMUL_HANDLER_STUB: 73 | INEG_HANDLER_STUB: 74 | LNEG_HANDLER_STUB: 75 | ISHL_HANDLER_STUB: 76 | ISHR_HANDLER_STUB: 77 | IAND_HANDLER_STUB: 78 | IOR_HANDLER_STUB: 79 | IXOR_HANDLER_STUB: 80 | IINC_HANDLER_STUB: 81 | I2B_HANDLER_STUB: 82 | I2C_HANDLER_STUB: 83 | I2S_HANDLER_STUB: 84 | IFEQ_HANDLER_STUB: 85 | IFNE_HANDLER_STUB: 86 | IFLT_HANDLER_STUB: 87 | IFGE_HANDLER_STUB: 88 | IFGT_HANDLER_STUB: 89 | IFLE_HANDLER_STUB: 90 | IF_ICMPEQ_HANDLER_STUB: 91 | IF_ICMPNE_HANDLER_STUB: 92 | IF_ICMPLT_HANDLER_STUB: 93 | IF_ICMPGE_HANDLER_STUB: 94 | IF_ICMPGT_HANDLER_STUB: 95 | IF_ICMPLE_HANDLER_STUB: 96 | IF_ACMPEQ_HANDLER_STUB: 97 | IF_ACMPNE_HANDLER_STUB: 98 | GOTO_HANDLER_STUB: 99 | BKPT_0_HANDLER_STUB: 100 | supported: 101 | -------------------------------------------------------------------------------- /src/arm.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | /* exploit made by Palapeli, from https://github.com/mkwcat/saoirse/blob/master/channel/Main/IOSBoot.cpp (IOSBoot::Entry) */ 8 | /* 9 | MIT License 10 | 11 | Copyright (c) 2022-2023 Palapeli 12 | 13 | Permission is hereby granted, free of charge, to any person obtaining a copy 14 | of this software and associated documentation files (the "Software"), to deal 15 | in the Software without restriction, including without limitation the rights 16 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 17 | copies of the Software, and to permit persons to whom the Software is 18 | furnished to do so, subject to the following conditions: 19 | 20 | The above copyright notice and this permission notice shall be included in all 21 | copies or substantial portions of the Software. 22 | 23 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 24 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 25 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 26 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 27 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 28 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 29 | SOFTWARE. 30 | */ 31 | void run_arm(u32* code, int len, bool thumb) 32 | { 33 | u32* mem1 = (u32*)0x80000000; 34 | u32* entry = (u32*)((u32)code & ~0xc0000000); 35 | if (thumb) { 36 | entry = (u32*)((u32)entry | 1); 37 | } 38 | printf("Trying to execute ARM code at physical address %08x\n", (u32)entry); 39 | s32 fd = IOS_Open("/dev/sha", 0); 40 | if (fd < 0) return; 41 | printf("fd = IOS_Open(\"/dev/sha\");\n"); 42 | mem1[0] = 0x4903468D; // ldr r1, =0x10100000; mov sp, r1; 43 | mem1[1] = 0x49034788; // ldr r1, =entrypoint; blx r1; 44 | mem1[2] = 0x49036209; // ldr r1, =0xFFFF0014; str r1, [r1, #0x20]; 45 | mem1[3] = 0x47080000; // bx r1 46 | mem1[4] = 0x10100000; // temporary stack 47 | mem1[5] = (u32)entry; 48 | mem1[6] = 0xFFFF0014; // reserved handler 49 | 50 | DCFlushRange(mem1, 32); 51 | IOS_Write(-1, mem1, 32); 52 | ioctlv vec[4] ATTRIBUTE_ALIGN(32); 53 | vec[0].data = NULL; 54 | vec[0].len = 0; 55 | vec[1].data = (void*)0xFFFE0028; 56 | vec[1].len = 0; 57 | vec[2].data = (void*)0x80000000; 58 | vec[2].len = 32; 59 | 60 | IOS_Write(-1, code, len/4); 61 | int err = IOS_Ioctlv(fd, 0, 1, 2, vec); 62 | printf("IOS_Ioctlv(fd,0,1,2,vec) returned %d\n", err); 63 | int err_close = IOS_Close(fd); 64 | printf("IOS_Close(fd) returned %d\n", err_close); 65 | } 66 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | .SUFFIXES: 2 | ifeq ($(strip $(DEVKITPPC)),) 3 | $(error "no DEVKITPPC defined. export DEVKITPPC=devkitPPC") 4 | endif 5 | 6 | THUMB=0 7 | 8 | include $(DEVKITPPC)/wii_rules 9 | 10 | #--------------------------------------------------------------------------------- 11 | TARGET := $(notdir $(CURDIR)) 12 | BUILD := build 13 | SOURCES := src 14 | ARM := src/arm 15 | DATA := 16 | #--------------------------------------------------------------------------------- 17 | CFLAGS += -g -O2 -Wall $(MACHDEP) $(INCLUDE) 18 | CXXFLAGS += $(CFLAGS) 19 | LDFLAGS += -g $(MACHDEP) -Wl,-Map,$(notdir $@).map 20 | #--------------------------------------------------------------------------------- 21 | LIBS := -lwiiuse -lbte -logc -lm 22 | #--------------------------------------------------------------------------------- 23 | LIBDIRS := 24 | #--------------------------------------------------------------------------------- 25 | CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) 26 | CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) 27 | SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) \ 28 | $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.S))) 29 | #--------------------------------------------------------------------------------- 30 | ifeq ($(strip $(CPPFILES)),) 31 | LD := $(CC) 32 | else 33 | LD := $(CXX) 34 | endif 35 | 36 | OFILES_SOURCES := $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) 37 | OFILES := $(addprefix $(BUILD)/, $(OFILES_SOURCES)) 38 | INCLUDE := -I$(DEVKITPPC)/../powerpc-eabi/include/ \ 39 | -I$(CURDIR)/include \ 40 | $(foreach dir,$(LIBDIRS), -I$(dir)/include) \ 41 | -I$(CURDIR)/$(BUILD) \ 42 | -I$(LIBOGC_INC) 43 | LIBPATHS := -L$(LIBOGC_LIB) $(foreach dir,$(LIBDIRS), -L$(dir)/lib) 44 | #--------------------------------------------------------------------------------- 45 | .PHONY: all clean run 46 | 47 | all: $(TARGET).dol 48 | 49 | $(TARGET).dol: $(TARGET).elf 50 | $(STRIP) $< 51 | elf2dol $< $@ 52 | 53 | $(TARGET).elf: include/arm.h $(OFILES) 54 | $(LD) $(LDFLAGS) $(OFILES) $(LIBPATHS) $(LIBS) -o $@ 55 | 56 | #--------------------------------------------------------------------------------- 57 | $(BUILD)/%.o: $(SOURCES)/%.c | $(BUILD) 58 | $(CC) $(CFLAGS) -MMD -MP -MF $(BUILD)/$*.d -c $< -o $@ 59 | 60 | $(BUILD)/%.o: $(SOURCES)/%.cpp | $(BUILD) 61 | $(CXX) $(CXXFLAGS) -MMD -MP -MF $(BUILD)/$*.d -c $< -o $@ 62 | 63 | #$(BUILD)/%.o: $(SOURCES)/%.s | $(BUILD) 64 | # $(AS) $(ASFLAGS) -I ../bytecode $< -o $@ 65 | 66 | include/arm.h : $(ARM)/arm.bin 67 | @echo "\n#include " > $@ 68 | @echo "#include " >> $@ 69 | @echo "static const unsigned int arm_code[] __attribute__((section(\".arm_code\"))) = {" >> $@ 70 | @hexdump -v -e '"0x" 4/1 "%02x" ",\n"' $(ARM)/arm.bin >> $@ 71 | @echo "};" >> $@ 72 | @echo "void run_arm(uint32_t* code, int len, bool thumb);" >> $@ 73 | $(ARM)/arm.bin : $(ARM)/arm.elf 74 | arm-none-eabi-objcopy -Obinary $< $@ 75 | $(ARM)/arm.elf : $(wildcard $(ARM)/*.s) bytecode/bytecode $(ARM)/linker.ld 76 | @if [ $(THUMB) = 0 ]; then \ 77 | arm-none-eabi-as -march=armv5te -mcpu=arm926ej-s -mbig-endian $(ARM)/arm_code.s -o src/arm/arm.o; \ 78 | else \ 79 | arm-none-eabi-as -mthumb -march=armv5te -mcpu=arm926ej-s -mbig-endian $(ARM)/arm_code.s -o src/arm/arm.o; \ 80 | fi 81 | arm-none-eabi-ld -T src/arm/linker.ld src/arm/arm.o -o $@ 82 | $(BUILD): 83 | mkdir -p $(BUILD) 84 | 85 | -include $(wildcard $(BUILD)/*.d) 86 | 87 | clean: 88 | rm -rf $(BUILD) $(TARGET).elf $(TARGET).dol $(TARGET).elf.map include/arm.h src/arm/arm.elf src/arm/arm.bin src/arm/arm.o 89 | run: 90 | wiiload $(TARGET).dol 91 | -------------------------------------------------------------------------------- /include/arm.h: -------------------------------------------------------------------------------- 1 | 2 | #include 3 | #include 4 | static const unsigned int arm_code[] __attribute__((section(".arm_code"))) = { 5 | 0xe3a00012, 6 | 0xe1a00c00, 7 | 0xe2800010, 8 | 0xe12fff10, 9 | 0xe92d4ff0, 10 | 0xe3a00002, 11 | 0xeee10e10, 12 | 0xe3a00001, 13 | 0xeee20e10, 14 | 0xe3a06201, 15 | 0xe3a00008, 16 | 0xe1a00800, 17 | 0xe0867000, 18 | 0xe59f5498, 19 | 0xe5955000, 20 | 0xe59fc494, 21 | 0xe59cc000, 22 | 0xe59fe490, 23 | 0xe59ee000, 24 | 0xe12fff2c, 25 | 0x120000ac, 26 | 0x1200005c, 27 | 0x120004cc, 28 | 0xe3a00000, 29 | 0xeee10e10, 30 | 0xeee20e10, 31 | 0xe3a00013, 32 | 0xe1a00c00, 33 | 0xe2800004, 34 | 0xe5806000, 35 | 0xe2800004, 36 | 0xe5806000, 37 | 0xe2400008, 38 | 0xe3a010ee, 39 | 0xe1a01401, 40 | 0xe28110ee, 41 | 0xe1a01401, 42 | 0xe28110ee, 43 | 0xe1a01401, 44 | 0xe28110ee, 45 | 0xe5801000, 46 | 0xe8bd8ff0, 47 | 0xe12fff1e, 48 | 0x120004c4, 49 | 0x120004c0, 50 | 0x120004c4, 51 | 0x120004c4, 52 | 0x120004c4, 53 | 0x120004c4, 54 | 0x120004c4, 55 | 0x120004c4, 56 | 0x120004c4, 57 | 0x120004c0, 58 | 0x120004c0, 59 | 0x120004c4, 60 | 0x120004c0, 61 | 0x120004c0, 62 | 0x120004c0, 63 | 0x120004c0, 64 | 0x120004c4, 65 | 0x120004c4, 66 | 0x120004c0, 67 | 0x120004c0, 68 | 0x120004c0, 69 | 0x120004c4, 70 | 0x120004c4, 71 | 0x120004c4, 72 | 0x120004c4, 73 | 0x120004c4, 74 | 0x120004c4, 75 | 0x120004c4, 76 | 0x120004c4, 77 | 0x120004c4, 78 | 0x120004c4, 79 | 0x120004c4, 80 | 0x120004c4, 81 | 0x120004c4, 82 | 0x120004c4, 83 | 0x120004c4, 84 | 0x120004c4, 85 | 0x120004c4, 86 | 0x120004c4, 87 | 0x120004c4, 88 | 0x120004c4, 89 | 0x120004c4, 90 | 0x120004c4, 91 | 0x120004c4, 92 | 0x120004c4, 93 | 0x120004c4, 94 | 0x120004c0, 95 | 0x120004c0, 96 | 0x120004c0, 97 | 0x120004c0, 98 | 0x120004c0, 99 | 0x120004c0, 100 | 0x120004c0, 101 | 0x120004c0, 102 | 0x120004c4, 103 | 0x120004c4, 104 | 0x120004c4, 105 | 0x120004c4, 106 | 0x120004c4, 107 | 0x120004c4, 108 | 0x120004c4, 109 | 0x120004c4, 110 | 0x120004c4, 111 | 0x120004c4, 112 | 0x120004c4, 113 | 0x120004c4, 114 | 0x120004c4, 115 | 0x120004c4, 116 | 0x120004c4, 117 | 0x120004c4, 118 | 0x120004c4, 119 | 0x120004c4, 120 | 0x120004c4, 121 | 0x120004c4, 122 | 0x120004c4, 123 | 0x120004c0, 124 | 0x120004c0, 125 | 0x120004c0, 126 | 0x120004c0, 127 | 0x120004c0, 128 | 0x120004c0, 129 | 0x120004c0, 130 | 0x120004c0, 131 | 0x120004c0, 132 | 0x120004c0, 133 | 0x120004c0, 134 | 0x120004c0, 135 | 0x120004c4, 136 | 0x120004c4, 137 | 0x120004c4, 138 | 0x120004c4, 139 | 0x120004c4, 140 | 0x120004c4, 141 | 0x120004c4, 142 | 0x120004c4, 143 | 0x120004c4, 144 | 0x120004c4, 145 | 0x120004c4, 146 | 0x120004c0, 147 | 0x120004c0, 148 | 0x120004c4, 149 | 0x120004c4, 150 | 0x120004c0, 151 | 0x120004c0, 152 | 0x120004c4, 153 | 0x120004c4, 154 | 0x120004c0, 155 | 0x120004c0, 156 | 0x120004c0, 157 | 0x120004c0, 158 | 0x120004c0, 159 | 0x120004c0, 160 | 0x120004c0, 161 | 0x120004c0, 162 | 0x120004c0, 163 | 0x120004c0, 164 | 0x120004c4, 165 | 0x120004c4, 166 | 0x120004c0, 167 | 0x120004c0, 168 | 0x120004c4, 169 | 0x120004c0, 170 | 0x120004c4, 171 | 0x120004c0, 172 | 0x120004c0, 173 | 0x120004c0, 174 | 0x120004c4, 175 | 0x120004c0, 176 | 0x120004c4, 177 | 0x120004c0, 178 | 0x120004c4, 179 | 0x120004c0, 180 | 0x120004c4, 181 | 0x120004c0, 182 | 0x120004c0, 183 | 0x120004c0, 184 | 0x120004c0, 185 | 0x120004c0, 186 | 0x120004c0, 187 | 0x120004c0, 188 | 0x120004c0, 189 | 0x120004c0, 190 | 0x120004c0, 191 | 0x120004c0, 192 | 0x120004c0, 193 | 0x120004c4, 194 | 0x120004c4, 195 | 0x120004c4, 196 | 0x120004c0, 197 | 0x120004c0, 198 | 0x120004c0, 199 | 0x120004c0, 200 | 0x120004c0, 201 | 0x120004c4, 202 | 0x120004c4, 203 | 0x120004c4, 204 | 0x120004c4, 205 | 0x120004c4, 206 | 0x120004c4, 207 | 0x120004c4, 208 | 0x120004c4, 209 | 0x120004c4, 210 | 0x120004c4, 211 | 0x120004c4, 212 | 0x120004c4, 213 | 0x120004c4, 214 | 0x120004c4, 215 | 0x120004c4, 216 | 0x120004c0, 217 | 0x120004c0, 218 | 0x120004c0, 219 | 0x120004c0, 220 | 0x120004c0, 221 | 0x120004c4, 222 | 0x120004c4, 223 | 0x120004c4, 224 | 0x120004c4, 225 | 0x120004c4, 226 | 0x120004c4, 227 | 0x120004c4, 228 | 0x120004c4, 229 | 0x120004c4, 230 | 0x120004c4, 231 | 0x120004c4, 232 | 0x120004c4, 233 | 0x120004c4, 234 | 0x120004c4, 235 | 0x120004c4, 236 | 0x120004c4, 237 | 0x120004c4, 238 | 0x120004c4, 239 | 0x120004c4, 240 | 0x120004c4, 241 | 0x120004c4, 242 | 0x120004c4, 243 | 0x120004c4, 244 | 0x120004c4, 245 | 0x120004c4, 246 | 0x120004c4, 247 | 0x120004c4, 248 | 0x120004c4, 249 | 0x120004c4, 250 | 0x120004c4, 251 | 0x120004c4, 252 | 0x120004c4, 253 | 0x120004c4, 254 | 0x120004c4, 255 | 0x120004c4, 256 | 0x120004c4, 257 | 0x120004c4, 258 | 0x120004c4, 259 | 0x120004c4, 260 | 0x120004c4, 261 | 0x120004c4, 262 | 0x120004c4, 263 | 0x120004c4, 264 | 0x120004c4, 265 | 0x120004c4, 266 | 0x120004c4, 267 | 0x120004c4, 268 | 0x120004c4, 269 | 0x120004c4, 270 | 0x120004c4, 271 | 0x120004c4, 272 | 0x120004c4, 273 | 0x120004c4, 274 | 0x120004c4, 275 | 0x120004c4, 276 | 0x120004c4, 277 | 0x120004c4, 278 | 0x120004c4, 279 | 0x120004c4, 280 | 0x120004c4, 281 | 0x120004c4, 282 | 0x120004c4, 283 | 0x120004c4, 284 | 0x120004c4, 285 | 0x120004c4, 286 | 0x120004c4, 287 | 0x120004c4, 288 | 0x120004c4, 289 | 0x120004c4, 290 | 0x120004c4, 291 | 0x120004c4, 292 | 0x120004c4, 293 | 0x120004c4, 294 | 0x120004c4, 295 | 0x120004c4, 296 | 0x120004c4, 297 | 0x120004c4, 298 | 0x120004c4, 299 | 0x120004c4, 300 | 0x120004c4, 301 | 0x120004c4, 302 | 0x120004c4, 303 | 0x120004c4, 304 | 0x120004c4, 305 | 0x120004c4, 306 | 0x120004c4, 307 | 0x120004c4, 308 | 0x120004c4, 309 | 0xeafffee5, 310 | 0xabcdefaa, 311 | 0x00000004, 312 | 0x10133b1a, 313 | 0xac000000, 314 | 0x12000050, 315 | 0x12000054, 316 | 0x12000058, 317 | }; 318 | void run_arm(uint32_t* code, int len, bool thumb); 319 | -------------------------------------------------------------------------------- /src/arm/instr_handlers.s: -------------------------------------------------------------------------------- 1 | ACONST_NULL_HANDLER: 2 | // TODO 3 | 4 | LCONST_0_HANDLER: 5 | // TODO 6 | 7 | LCONST_1_HANDLER: 8 | // TODO 9 | 10 | FCONST_1_HANDLER: 11 | // TODO 12 | 13 | FCONST_2_HANDLER: 14 | // TODO 15 | 16 | DCONST_0_HANDLER: 17 | // TODO 18 | 19 | DCONST_1_HANDLER: 20 | // TODO 21 | 22 | LDC_HANDLER: 23 | // TODO 24 | 25 | LDC_W_HANDLER: 26 | // TODO 27 | 28 | LDC2_W_HANDLER: 29 | // TODO 30 | 31 | IALOAD_HANDLER: 32 | // TODO 33 | 34 | LALOAD_HANDLER: 35 | // TODO 36 | 37 | FALOAD_HANDLER: 38 | // TODO 39 | 40 | DALOAD_HANDLER: 41 | // TODO 42 | 43 | AALOAD_HANDLER: 44 | // TODO 45 | 46 | BALOAD_HANDLER: 47 | // TODO 48 | 49 | CALOAD_HANDLER: 50 | // TODO 51 | 52 | SALOAD_HANDLER: 53 | // TODO 54 | 55 | ASTORE_0_HANDLER: 56 | // TODO 57 | 58 | ASTORE_1_HANDLER: 59 | // TODO 60 | 61 | ASTORE_2_HANDLER: 62 | // TODO 63 | 64 | ASTORE_3_HANDLER: 65 | // TODO 66 | 67 | IASTORE_HANDLER: 68 | // TODO 69 | 70 | LASTORE_HANDLER: 71 | // TODO 72 | 73 | FASTORE_HANDLER: 74 | // TODO 75 | 76 | DASTORE_HANDLER: 77 | // TODO 78 | 79 | AASTORE_HANDLER: 80 | // TODO 81 | 82 | BASTORE_HANDLER: 83 | // TODO 84 | 85 | CASTORE_HANDLER: 86 | // TODO 87 | 88 | SASTORE_HANDLER: 89 | // TODO 90 | 91 | FADD_HANDLER: 92 | // TODO 93 | 94 | DADD_HANDLER: 95 | // TODO 96 | 97 | FSUB_HANDLER: 98 | // TODO 99 | 100 | DSUB_HANDLER: 101 | // TODO 102 | 103 | FMUL_HANDLER: 104 | // TODO 105 | 106 | DMUL_HANDLER: 107 | // TODO 108 | 109 | IDIV_HANDLER: 110 | // TODO 111 | 112 | LDIV_HANDLER: 113 | // TODO 114 | 115 | FDIV_HANDLER: 116 | // TODO 117 | 118 | DDIV_HANDLER: 119 | // TODO 120 | 121 | IREM_HANDLER: 122 | // TODO 123 | 124 | LREM_HANDLER: 125 | // TODO 126 | 127 | FREM_HANDLER: 128 | // TODO 129 | 130 | DREM_HANDLER: 131 | // TODO 132 | 133 | FNEG_HANDLER: 134 | // TODO 135 | 136 | DNEG_HANDLER: 137 | // TODO 138 | 139 | LSHL_HANDLER: 140 | // TODO 141 | 142 | LSHR_HANDLER: 143 | // TODO 144 | 145 | IUSHR_HANDLER: 146 | // TODO 147 | 148 | LUSHR_HANDLER: 149 | // TODO 150 | 151 | LAND_HANDLER: 152 | // TODO 153 | 154 | LOR_HANDLER: 155 | // TODO 156 | 157 | LXOR_HANDLER: 158 | // TODO 159 | 160 | I2L_HANDLER: 161 | // TODO 162 | 163 | I2F_HANDLER: 164 | // TODO 165 | 166 | I2D_HANDLER: 167 | // TODO 168 | 169 | L2I_HANDLER: 170 | // TODO 171 | 172 | L2F_HANDLER: 173 | // TODO 174 | 175 | L2D_HANDLER: 176 | // TODO 177 | 178 | F2I_HANDLER: 179 | // TODO 180 | 181 | F2L_HANDLER: 182 | // TODO 183 | 184 | F2D_HANDLER: 185 | // TODO 186 | 187 | D2I_HANDLER: 188 | // TODO 189 | 190 | D2L_HANDLER: 191 | // TODO 192 | 193 | D2F_HANDLER: 194 | // TODO 195 | 196 | LCMP_HANDLER: 197 | // TODO 198 | 199 | FCMPL_HANDLER: 200 | // TODO 201 | 202 | FCMPG_HANDLER: 203 | // TODO 204 | 205 | DCMPL_HANDLER: 206 | // TODO 207 | 208 | DCMPG_HANDLER: 209 | // TODO 210 | 211 | JSR_HANDLER: 212 | // TODO 213 | 214 | RET_HANDLER: 215 | // TODO 216 | 217 | TABLESWITCH_HANDLER: 218 | // TODO 219 | 220 | LOOKUPSWITCH_HANDLER: 221 | // TODO 222 | 223 | IRETURN_HANDLER: 224 | b exit_jazelle 225 | // TODO 226 | 227 | LRETURN_HANDLER: 228 | // TODO 229 | 230 | FRETURN_HANDLER: 231 | // TODO 232 | 233 | DRETURN_HANDLER: 234 | // TODO 235 | 236 | ARETURN_HANDLER: 237 | // TODO 238 | 239 | RETURN_HANDLER: 240 | // TODO 241 | 242 | GETSTATIC_HANDLER: 243 | // TODO 244 | 245 | PUTSTATIC_HANDLER: 246 | // TODO 247 | 248 | GETFIELD_HANDLER: 249 | // TODO 250 | 251 | PUTFIELD_HANDLER: 252 | // TODO 253 | 254 | INVOKEVIRTUAL_HANDLER: 255 | // TODO 256 | 257 | INVOKESPECIAL_HANDLER: 258 | // TODO 259 | 260 | INVOKESTATIC_HANDLER: 261 | // TODO 262 | 263 | INVOKEINTERFACE_HANDLER: 264 | // TODO 265 | 266 | INVOKEDYNAMIC_HANDLER: 267 | // TODO 268 | 269 | NEW_HANDLER: 270 | // TODO 271 | 272 | NEWARRAY_HANDLER: 273 | // TODO 274 | 275 | ANEWARRAY_HANDLER: 276 | // TODO 277 | 278 | ARRAYLENGTH_HANDLER: 279 | // TODO 280 | 281 | ATHROW_HANDLER: 282 | // TODO 283 | 284 | CHECKCAST_HANDLER: 285 | // TODO 286 | 287 | INSTANCEOF_HANDLER: 288 | // TODO 289 | 290 | MONITORENTER_HANDLER: 291 | // TODO 292 | 293 | MONITOREXIT_HANDLER: 294 | // TODO 295 | 296 | WIDE_HANDLER: 297 | // TODO 298 | 299 | MULTIANEWARRAY_HANDLER: 300 | // TODO 301 | 302 | IFNULL_HANDLER: 303 | // TODO 304 | 305 | IFNONNULL_HANDLER: 306 | // TODO 307 | 308 | GOTO_W_HANDLER: 309 | // TODO 310 | 311 | JSR_W_HANDLER: 312 | // TODO 313 | 314 | BREAKPOINT_HANDLER: 315 | // TODO 316 | 317 | UNDEFINED_CB_HANDLER: 318 | // TODO 319 | 320 | UNDEFINED_CC_HANDLER: 321 | // TODO 322 | 323 | UNDEFINED_CD_HANDLER: 324 | // TODO 325 | 326 | UNDEFINED_CE_HANDLER: 327 | // TODO 328 | 329 | UNDEFINED_CF_HANDLER: 330 | // TODO 331 | 332 | UNDEFINED_D0_HANDLER: 333 | // TODO 334 | 335 | UNDEFINED_D1_HANDLER: 336 | // TODO 337 | 338 | UNDEFINED_D2_HANDLER: 339 | // TODO 340 | 341 | UNDEFINED_D3_HANDLER: 342 | // TODO 343 | 344 | UNDEFINED_D4_HANDLER: 345 | // TODO 346 | 347 | UNDEFINED_D5_HANDLER: 348 | // TODO 349 | 350 | UNDEFINED_D6_HANDLER: 351 | // TODO 352 | 353 | UNDEFINED_D7_HANDLER: 354 | // TODO 355 | 356 | UNDEFINED_D8_HANDLER: 357 | // TODO 358 | 359 | UNDEFINED_D9_HANDLER: 360 | // TODO 361 | 362 | UNDEFINED_DA_HANDLER: 363 | // TODO 364 | 365 | UNDEFINED_DB_HANDLER: 366 | // TODO 367 | 368 | UNDEFINED_DC_HANDLER: 369 | // TODO 370 | 371 | UNDEFINED_DD_HANDLER: 372 | // TODO 373 | 374 | UNDEFINED_DE_HANDLER: 375 | // TODO 376 | 377 | UNDEFINED_DF_HANDLER: 378 | // TODO 379 | 380 | UNDEFINED_E0_HANDLER: 381 | // TODO 382 | 383 | UNDEFINED_E1_HANDLER: 384 | // TODO 385 | 386 | UNDEFINED_E2_HANDLER: 387 | // TODO 388 | 389 | UNDEFINED_E3_HANDLER: 390 | // TODO 391 | 392 | UNDEFINED_E4_HANDLER: 393 | // TODO 394 | 395 | UNDEFINED_E5_HANDLER: 396 | // TODO 397 | 398 | UNDEFINED_E6_HANDLER: 399 | // TODO 400 | 401 | UNDEFINED_E7_HANDLER: 402 | // TODO 403 | 404 | UNDEFINED_E8_HANDLER: 405 | // TODO 406 | 407 | UNDEFINED_E9_HANDLER: 408 | // TODO 409 | 410 | UNDEFINED_EA_HANDLER: 411 | // TODO 412 | 413 | UNDEFINED_EB_HANDLER: 414 | // TODO 415 | 416 | UNDEFINED_EC_HANDLER: 417 | // TODO 418 | 419 | UNDEFINED_ED_HANDLER: 420 | // TODO 421 | 422 | UNDEFINED_EE_HANDLER: 423 | // TODO 424 | 425 | UNDEFINED_EF_HANDLER: 426 | // TODO 427 | 428 | UNDEFINED_F0_HANDLER: 429 | // TODO 430 | 431 | UNDEFINED_F1_HANDLER: 432 | // TODO 433 | 434 | UNDEFINED_F2_HANDLER: 435 | // TODO 436 | 437 | UNDEFINED_F3_HANDLER: 438 | // TODO 439 | 440 | UNDEFINED_F4_HANDLER: 441 | // TODO 442 | 443 | UNDEFINED_F5_HANDLER: 444 | // TODO 445 | 446 | UNDEFINED_F6_HANDLER: 447 | // TODO 448 | 449 | UNDEFINED_F7_HANDLER: 450 | // TODO 451 | 452 | UNDEFINED_F8_HANDLER: 453 | // TODO 454 | 455 | UNDEFINED_F9_HANDLER: 456 | // TODO 457 | 458 | UNDEFINED_FA_HANDLER: 459 | // TODO 460 | 461 | UNDEFINED_FB_HANDLER: 462 | // TODO 463 | 464 | UNDEFINED_FC_HANDLER: 465 | // TODO 466 | 467 | UNDEFINED_FD_HANDLER: 468 | // TODO 469 | 470 | UNDEFINED_FE_HANDLER: 471 | // TODO 472 | -------------------------------------------------------------------------------- /src/arm/table.s: -------------------------------------------------------------------------------- 1 | .4byte NOP_HANDLER_STUB 2 | .4byte ACONST_NULL_HANDLER 3 | .4byte ICONST_M1_HANDLER_STUB 4 | .4byte ICONST_0_HANDLER_STUB 5 | .4byte ICONST_1_HANDLER_STUB 6 | .4byte ICONST_2_HANDLER_STUB 7 | .4byte ICONST_3_HANDLER_STUB 8 | .4byte ICONST_4_HANDLER_STUB 9 | .4byte ICONST_5_HANDLER_STUB 10 | .4byte LCONST_0_HANDLER 11 | .4byte LCONST_1_HANDLER 12 | .4byte FCONST_0_HANDLER_STUB 13 | .4byte FCONST_1_HANDLER 14 | .4byte FCONST_2_HANDLER 15 | .4byte DCONST_0_HANDLER 16 | .4byte DCONST_1_HANDLER 17 | .4byte BIPUSH_HANDLER_STUB 18 | .4byte SIPUSH_HANDLER_STUB 19 | .4byte LDC_HANDLER 20 | .4byte LDC_W_HANDLER 21 | .4byte LDC2_W_HANDLER 22 | .4byte ILOAD_HANDLER_STUB 23 | .4byte LLOAD_HANDLER_STUB 24 | .4byte FLOAD_HANDLER_STUB 25 | .4byte DLOAD_HANDLER_STUB 26 | .4byte ALOAD_HANDLER_STUB 27 | .4byte ILOAD_0_HANDLER_STUB 28 | .4byte ILOAD_1_HANDLER_STUB 29 | .4byte ILOAD_2_HANDLER_STUB 30 | .4byte ILOAD_3_HANDLER_STUB 31 | .4byte LLOAD_0_HANDLER_STUB 32 | .4byte LLOAD_1_HANDLER_STUB 33 | .4byte LLOAD_2_HANDLER_STUB 34 | .4byte LLOAD_3_HANDLER_STUB 35 | .4byte FLOAD_0_HANDLER_STUB 36 | .4byte FLOAD_1_HANDLER_STUB 37 | .4byte FLOAD_2_HANDLER_STUB 38 | .4byte FLOAD_3_HANDLER_STUB 39 | .4byte DLOAD_0_HANDLER_STUB 40 | .4byte DLOAD_1_HANDLER_STUB 41 | .4byte DLOAD_2_HANDLER_STUB 42 | .4byte DLOAD_3_HANDLER_STUB 43 | .4byte ALOAD_0_HANDLER_STUB 44 | .4byte ALOAD_1_HANDLER_STUB 45 | .4byte ALOAD_2_HANDLER_STUB 46 | .4byte ALOAD_3_HANDLER_STUB 47 | .4byte IALOAD_HANDLER 48 | .4byte LALOAD_HANDLER 49 | .4byte FALOAD_HANDLER 50 | .4byte DALOAD_HANDLER 51 | .4byte AALOAD_HANDLER 52 | .4byte BALOAD_HANDLER 53 | .4byte CALOAD_HANDLER 54 | .4byte SALOAD_HANDLER 55 | .4byte ISTORE_HANDLER_STUB 56 | .4byte LSTORE_HANDLER_STUB 57 | .4byte FSTORE_HANDLER_STUB 58 | .4byte DSTORE_HANDLER_STUB 59 | .4byte ASTORE_HANDLER_STUB 60 | .4byte ISTORE_0_HANDLER_STUB 61 | .4byte ISTORE_1_HANDLER_STUB 62 | .4byte ISTORE_2_HANDLER_STUB 63 | .4byte ISTORE_3_HANDLER_STUB 64 | .4byte LSTORE_0_HANDLER_STUB 65 | .4byte LSTORE_1_HANDLER_STUB 66 | .4byte LSTORE_2_HANDLER_STUB 67 | .4byte LSTORE_3_HANDLER_STUB 68 | .4byte FSTORE_0_HANDLER_STUB 69 | .4byte FSTORE_1_HANDLER_STUB 70 | .4byte FSTORE_2_HANDLER_STUB 71 | .4byte FSTORE_3_HANDLER_STUB 72 | .4byte DSTORE_0_HANDLER_STUB 73 | .4byte DSTORE_1_HANDLER_STUB 74 | .4byte DSTORE_2_HANDLER_STUB 75 | .4byte DSTORE_3_HANDLER_STUB 76 | .4byte ASTORE_0_HANDLER 77 | .4byte ASTORE_1_HANDLER 78 | .4byte ASTORE_2_HANDLER 79 | .4byte ASTORE_3_HANDLER 80 | .4byte IASTORE_HANDLER 81 | .4byte LASTORE_HANDLER 82 | .4byte FASTORE_HANDLER 83 | .4byte DASTORE_HANDLER 84 | .4byte AASTORE_HANDLER 85 | .4byte BASTORE_HANDLER 86 | .4byte CASTORE_HANDLER 87 | .4byte SASTORE_HANDLER 88 | .4byte POP_HANDLER_STUB 89 | .4byte POP2_HANDLER_STUB 90 | .4byte DUP_HANDLER_STUB 91 | .4byte DUP_X1_HANDLER_STUB 92 | .4byte DUP_X2_HANDLER_STUB 93 | .4byte DUP2_HANDLER_STUB 94 | .4byte DUP2_X1_HANDLER_STUB 95 | .4byte DUP2_X2_HANDLER_STUB 96 | .4byte SWAP_HANDLER_STUB 97 | .4byte IADD_HANDLER_STUB 98 | .4byte LADD_HANDLER_STUB 99 | .4byte FADD_HANDLER 100 | .4byte DADD_HANDLER 101 | .4byte ISUB_HANDLER_STUB 102 | .4byte LSUB_HANDLER_STUB 103 | .4byte FSUB_HANDLER 104 | .4byte DSUB_HANDLER 105 | .4byte IMUL_HANDLER_STUB 106 | .4byte LMUL_HANDLER_STUB 107 | .4byte FMUL_HANDLER 108 | .4byte DMUL_HANDLER 109 | .4byte IDIV_HANDLER 110 | .4byte LDIV_HANDLER 111 | .4byte FDIV_HANDLER 112 | .4byte DDIV_HANDLER 113 | .4byte IREM_HANDLER 114 | .4byte LREM_HANDLER 115 | .4byte FREM_HANDLER 116 | .4byte DREM_HANDLER 117 | .4byte INEG_HANDLER_STUB 118 | .4byte LNEG_HANDLER_STUB 119 | .4byte FNEG_HANDLER 120 | .4byte DNEG_HANDLER 121 | .4byte ISHL_HANDLER_STUB 122 | .4byte LSHL_HANDLER 123 | .4byte ISHR_HANDLER_STUB 124 | .4byte LSHR_HANDLER 125 | .4byte IUSHR_HANDLER 126 | .4byte LUSHR_HANDLER 127 | .4byte IAND_HANDLER_STUB 128 | .4byte LAND_HANDLER 129 | .4byte IOR_HANDLER_STUB 130 | .4byte LOR_HANDLER 131 | .4byte IXOR_HANDLER_STUB 132 | .4byte LXOR_HANDLER 133 | .4byte IINC_HANDLER_STUB 134 | .4byte I2L_HANDLER 135 | .4byte I2F_HANDLER 136 | .4byte I2D_HANDLER 137 | .4byte L2I_HANDLER 138 | .4byte L2F_HANDLER 139 | .4byte L2D_HANDLER 140 | .4byte F2I_HANDLER 141 | .4byte F2L_HANDLER 142 | .4byte F2D_HANDLER 143 | .4byte D2I_HANDLER 144 | .4byte D2L_HANDLER 145 | .4byte D2F_HANDLER 146 | .4byte I2B_HANDLER_STUB 147 | .4byte I2C_HANDLER_STUB 148 | .4byte I2S_HANDLER_STUB 149 | .4byte LCMP_HANDLER 150 | .4byte FCMPL_HANDLER 151 | .4byte FCMPG_HANDLER 152 | .4byte DCMPL_HANDLER 153 | .4byte DCMPG_HANDLER 154 | .4byte IFEQ_HANDLER_STUB 155 | .4byte IFNE_HANDLER_STUB 156 | .4byte IFLT_HANDLER_STUB 157 | .4byte IFGE_HANDLER_STUB 158 | .4byte IFGT_HANDLER_STUB 159 | .4byte IFLE_HANDLER_STUB 160 | .4byte IF_ICMPEQ_HANDLER_STUB 161 | .4byte IF_ICMPNE_HANDLER_STUB 162 | .4byte IF_ICMPLT_HANDLER_STUB 163 | .4byte IF_ICMPGE_HANDLER_STUB 164 | .4byte IF_ICMPGT_HANDLER_STUB 165 | .4byte IF_ICMPLE_HANDLER_STUB 166 | .4byte IF_ACMPEQ_HANDLER_STUB 167 | .4byte IF_ACMPNE_HANDLER_STUB 168 | .4byte GOTO_HANDLER_STUB 169 | .4byte JSR_HANDLER 170 | .4byte RET_HANDLER 171 | .4byte TABLESWITCH_HANDLER 172 | .4byte LOOKUPSWITCH_HANDLER 173 | .4byte IRETURN_HANDLER 174 | .4byte LRETURN_HANDLER 175 | .4byte FRETURN_HANDLER 176 | .4byte DRETURN_HANDLER 177 | .4byte ARETURN_HANDLER 178 | .4byte RETURN_HANDLER 179 | .4byte GETSTATIC_HANDLER 180 | .4byte PUTSTATIC_HANDLER 181 | .4byte GETFIELD_HANDLER 182 | .4byte PUTFIELD_HANDLER 183 | .4byte INVOKEVIRTUAL_HANDLER 184 | .4byte INVOKESPECIAL_HANDLER 185 | .4byte INVOKESTATIC_HANDLER 186 | .4byte INVOKEINTERFACE_HANDLER 187 | .4byte INVOKEDYNAMIC_HANDLER 188 | .4byte NEW_HANDLER 189 | .4byte NEWARRAY_HANDLER 190 | .4byte ANEWARRAY_HANDLER 191 | .4byte ARRAYLENGTH_HANDLER 192 | .4byte ATHROW_HANDLER 193 | .4byte CHECKCAST_HANDLER 194 | .4byte INSTANCEOF_HANDLER 195 | .4byte MONITORENTER_HANDLER 196 | .4byte MONITOREXIT_HANDLER 197 | .4byte WIDE_HANDLER 198 | .4byte MULTIANEWARRAY_HANDLER 199 | .4byte IFNULL_HANDLER 200 | .4byte IFNONNULL_HANDLER 201 | .4byte GOTO_W_HANDLER 202 | .4byte JSR_W_HANDLER 203 | .4byte BREAKPOINT_HANDLER 204 | .4byte UNDEFINED_CB_HANDLER 205 | .4byte UNDEFINED_CC_HANDLER 206 | .4byte UNDEFINED_CD_HANDLER 207 | .4byte UNDEFINED_CE_HANDLER 208 | .4byte UNDEFINED_CF_HANDLER 209 | .4byte UNDEFINED_D0_HANDLER 210 | .4byte UNDEFINED_D1_HANDLER 211 | .4byte UNDEFINED_D2_HANDLER 212 | .4byte UNDEFINED_D3_HANDLER 213 | .4byte UNDEFINED_D4_HANDLER 214 | .4byte UNDEFINED_D5_HANDLER 215 | .4byte UNDEFINED_D6_HANDLER 216 | .4byte UNDEFINED_D7_HANDLER 217 | .4byte UNDEFINED_D8_HANDLER 218 | .4byte UNDEFINED_D9_HANDLER 219 | .4byte UNDEFINED_DA_HANDLER 220 | .4byte UNDEFINED_DB_HANDLER 221 | .4byte UNDEFINED_DC_HANDLER 222 | .4byte UNDEFINED_DD_HANDLER 223 | .4byte UNDEFINED_DE_HANDLER 224 | .4byte UNDEFINED_DF_HANDLER 225 | .4byte UNDEFINED_E0_HANDLER 226 | .4byte UNDEFINED_E1_HANDLER 227 | .4byte UNDEFINED_E2_HANDLER 228 | .4byte UNDEFINED_E3_HANDLER 229 | .4byte UNDEFINED_E4_HANDLER 230 | .4byte UNDEFINED_E5_HANDLER 231 | .4byte UNDEFINED_E6_HANDLER 232 | .4byte UNDEFINED_E7_HANDLER 233 | .4byte UNDEFINED_E8_HANDLER 234 | .4byte UNDEFINED_E9_HANDLER 235 | .4byte UNDEFINED_EA_HANDLER 236 | .4byte UNDEFINED_EB_HANDLER 237 | .4byte UNDEFINED_EC_HANDLER 238 | .4byte UNDEFINED_ED_HANDLER 239 | .4byte UNDEFINED_EE_HANDLER 240 | .4byte UNDEFINED_EF_HANDLER 241 | .4byte UNDEFINED_F0_HANDLER 242 | .4byte UNDEFINED_F1_HANDLER 243 | .4byte UNDEFINED_F2_HANDLER 244 | .4byte UNDEFINED_F3_HANDLER 245 | .4byte UNDEFINED_F4_HANDLER 246 | .4byte UNDEFINED_F5_HANDLER 247 | .4byte UNDEFINED_F6_HANDLER 248 | .4byte UNDEFINED_F7_HANDLER 249 | .4byte UNDEFINED_F8_HANDLER 250 | .4byte UNDEFINED_F9_HANDLER 251 | .4byte UNDEFINED_FA_HANDLER 252 | .4byte UNDEFINED_FB_HANDLER 253 | .4byte UNDEFINED_FC_HANDLER 254 | .4byte UNDEFINED_FD_HANDLER 255 | .4byte UNDEFINED_FE_HANDLER 256 | .4byte BKPT_0_HANDLER_STUB 257 | 258 | .4byte NULL_PTR_EXCEPTION 259 | .4byte ARRAY_INDEX_OOB_EXCEPTION 260 | .4byte JE_ZERO 261 | .4byte INVALID_CONFIG 262 | .4byte PREFETCH_ABORT_MIDDLE_INST 263 | --------------------------------------------------------------------------------