source: rtems/c/src/lib/libbsp/arm/nds/libnds/source/arm9/gurumeditation.c @ 311dfa6

4.104.114.95
Last change on this file since 311dfa6 was 311dfa6, checked in by Joel Sherrill <joel.sherrill@…>, on 04/16/08 at 18:37:33

2008-04-16 Matthieu Bucchianeri <mbucchia@…>

  • ChangeLog?, Makefile.am, README, bsp_specs, configure.ac, mk_libnds.sh, patch.libnds, preinstall.am, block/block.c, clock/clock.c, console/console.c, coproc/coproc.S, coproc/coproc.c, coproc/coproc.ld, dswifi/dswifi_license.txt, dswifi/makefile, dswifi/arm7/makefile, dswifi/arm7/source/wifi_arm7.c, dswifi/arm7/source/wifi_arm7.h, dswifi/arm9/makefile, dswifi/arm9/source/sgIP.c, dswifi/arm9/source/sgIP.h, dswifi/arm9/source/sgIP_ARP.c, dswifi/arm9/source/sgIP_ARP.h, dswifi/arm9/source/sgIP_Config.h, dswifi/arm9/source/sgIP_DHCP.c, dswifi/arm9/source/sgIP_DHCP.h, dswifi/arm9/source/sgIP_DNS.c, dswifi/arm9/source/sgIP_DNS.h, dswifi/arm9/source/sgIP_Hub.c, dswifi/arm9/source/sgIP_Hub.h, dswifi/arm9/source/sgIP_ICMP.c, dswifi/arm9/source/sgIP_ICMP.h, dswifi/arm9/source/sgIP_IP.c, dswifi/arm9/source/sgIP_IP.h, dswifi/arm9/source/sgIP_TCP.c, dswifi/arm9/source/sgIP_TCP.h, dswifi/arm9/source/sgIP_UDP.c, dswifi/arm9/source/sgIP_UDP.h, dswifi/arm9/source/sgIP_memblock.c, dswifi/arm9/source/sgIP_memblock.h, dswifi/arm9/source/sgIP_sockets.c, dswifi/arm9/source/sgIP_sockets.h, dswifi/arm9/source/wifi_arm9.c, dswifi/arm9/source/wifi_arm9.h, dswifi/common/source/dsregs.h, dswifi/common/source/spinlock.h, dswifi/common/source/spinlock.s, dswifi/common/source/wifi_shared.h, dswifi/include/dswifi7.h, dswifi/include/dswifi9.h, dswifi/include/dswifi_version.h, dswifi/include/netdb.h, dswifi/include/sgIP_errno.h, dswifi/include/netinet/in.h, fb/fb.c, fb/fb.h, include/bsp.h, include/my_ipc.h, include/tm27.h, include/types.h, include/sys/iosupport.h, irq/irq.c, irq/irq.h, libfat/gba/include/fat.h, libfat/include/fat.h, libfat/nds/include/fat.h, libfat/source/bit_ops.h, libfat/source/cache.c, libfat/source/cache.h, libfat/source/common.h, libfat/source/directory.c, libfat/source/directory.h, libfat/source/fatdir.c, libfat/source/fatdir.h, libfat/source/fatfile.c, libfat/source/fatfile.h, libfat/source/file_allocation_table.c, libfat/source/file_allocation_table.h, libfat/source/filetime.c, libfat/source/filetime.h, libfat/source/libfat.c, libfat/source/mem_allocate.h, libfat/source/partition.c, libfat/source/partition.h, libfat/source/disc_io/disc.c, libfat/source/disc_io/disc.h, libfat/source/disc_io/disc_io.h, libfat/source/disc_io/io_cf_common.c, libfat/source/disc_io/io_cf_common.h, libfat/source/disc_io/io_dldi.h, libfat/source/disc_io/io_dldi.s, libfat/source/disc_io/io_efa2.c, libfat/source/disc_io/io_efa2.h, libfat/source/disc_io/io_fcsr.c, libfat/source/disc_io/io_fcsr.h, libfat/source/disc_io/io_m3_common.c, libfat/source/disc_io/io_m3_common.h, libfat/source/disc_io/io_m3cf.c, libfat/source/disc_io/io_m3cf.h, libfat/source/disc_io/io_m3sd.c, libfat/source/disc_io/io_m3sd.h, libfat/source/disc_io/io_mpcf.c, libfat/source/disc_io/io_mpcf.h, libfat/source/disc_io/io_njsd.c, libfat/source/disc_io/io_njsd.h, libfat/source/disc_io/io_nmmc.c, libfat/source/disc_io/io_nmmc.h, libfat/source/disc_io/io_sc_common.c, libfat/source/disc_io/io_sc_common.h, libfat/source/disc_io/io_sccf.c, libfat/source/disc_io/io_sccf.h, libfat/source/disc_io/io_scsd.c, libfat/source/disc_io/io_scsd.h, libfat/source/disc_io/io_scsd_s.s, libfat/source/disc_io/io_sd_common.c, libfat/source/disc_io/io_sd_common.h, libnds/Makefile.arm7, libnds/Makefile.arm9, libnds/libnds_license.txt, libnds/basicARM7/source/defaultARM7.c, libnds/include/default_font_bin.h, libnds/include/gbfs.h, libnds/include/nds.h, libnds/include/nds/bios.h, libnds/include/nds/card.h, libnds/include/nds/dma.h, libnds/include/nds/interrupts.h, libnds/include/nds/ipc.h, libnds/include/nds/jtypes.h, libnds/include/nds/memory.h, libnds/include/nds/registers_alt.h, libnds/include/nds/reload.h, libnds/include/nds/system.h, libnds/include/nds/timers.h, libnds/include/nds/arm7/audio.h, libnds/include/nds/arm7/clock.h, libnds/include/nds/arm7/serial.h, libnds/include/nds/arm7/touch.h, libnds/include/nds/arm9/background.h, libnds/include/nds/arm9/boxtest.h, libnds/include/nds/arm9/cache.h, libnds/include/nds/arm9/console.h, libnds/include/nds/arm9/exceptions.h, libnds/include/nds/arm9/image.h, libnds/include/nds/arm9/input.h, libnds/include/nds/arm9/math.h, libnds/include/nds/arm9/ndsmotion.h, libnds/include/nds/arm9/pcx.h, libnds/include/nds/arm9/postest.h, libnds/include/nds/arm9/rumble.h, libnds/include/nds/arm9/sound.h, libnds/include/nds/arm9/sprite.h, libnds/include/nds/arm9/trig_lut.h, libnds/include/nds/arm9/video.h, libnds/include/nds/arm9/videoGL.h, libnds/source/arm7/audio.c, libnds/source/arm7/clock.c, libnds/source/arm7/microphone.c, libnds/source/arm7/spi.c, libnds/source/arm7/touch.c, libnds/source/arm7/userSettings.c, libnds/source/arm9/COS.bin, libnds/source/arm9/COS.s, libnds/source/arm9/SIN.bin, libnds/source/arm9/SIN.s, libnds/source/arm9/TAN.bin, libnds/source/arm9/TAN.s, libnds/source/arm9/boxtest.c, libnds/source/arm9/console.c, libnds/source/arm9/dcache.s, libnds/source/arm9/default_font.bin, libnds/source/arm9/default_font.s, libnds/source/arm9/exceptionHandler.S, libnds/source/arm9/exceptionHandler.s, libnds/source/arm9/exceptions.c, libnds/source/arm9/gurumeditation.c, libnds/source/arm9/icache.s, libnds/source/arm9/image.c, libnds/source/arm9/initSystem.c, libnds/source/arm9/keys.c, libnds/source/arm9/ndsmotion.c, libnds/source/arm9/pcx.c, libnds/source/arm9/rumble.c, libnds/source/arm9/sound.c, libnds/source/arm9/system.c, libnds/source/arm9/touch.c, libnds/source/arm9/video.c, libnds/source/arm9/videoGL.c, libnds/source/common/biosCalls.s, libnds/source/common/card.c, libnds/source/common/gbfs.c, libnds/source/common/interruptDispatcher.s, libnds/source/common/interrupts.c, rtc/rtc.c, sound/sound.c, sound/sound.h, start/start.S, startup/linkcmds, startup/start.c, timer/timer.c, tools/Makefile.am, tools/bin2s, tools/bin2s.c, tools/configure.ac, tools/runtest, tools/ndstool/include/arm7_sha1_homebrew.h, tools/ndstool/include/arm7_sha1_nintendo.h, tools/ndstool/include/banner.h, tools/ndstool/include/bigint.h, tools/ndstool/include/crc.h, tools/ndstool/include/default_icon.h, tools/ndstool/include/encryption.h, tools/ndstool/include/header.h, tools/ndstool/include/hook.h, tools/ndstool/include/little.h, tools/ndstool/include/loadme.h, tools/ndstool/include/logo.h, tools/ndstool/include/ndscreate.h, tools/ndstool/include/ndsextract.h, tools/ndstool/include/ndstool.h, tools/ndstool/include/ndstree.h, tools/ndstool/include/overlay.h, tools/ndstool/include/passme.h, tools/ndstool/include/passme_sram.h, tools/ndstool/include/passme_vhd1.h, tools/ndstool/include/passme_vhd2.h, tools/ndstool/include/raster.h, tools/ndstool/include/sha1.h, tools/ndstool/include/types.h, tools/ndstool/source/arm7_sha1_homebrew.c, tools/ndstool/source/arm7_sha1_nintendo.c, tools/ndstool/source/banner.cpp, tools/ndstool/source/bigint.cpp, tools/ndstool/source/compile_date.c, tools/ndstool/source/crc.cpp, tools/ndstool/source/default_icon.c, tools/ndstool/source/encryption.cpp, tools/ndstool/source/header.cpp, tools/ndstool/source/hook.cpp, tools/ndstool/source/loadme.c, tools/ndstool/source/logo.cpp, tools/ndstool/source/ndscodes.cpp, tools/ndstool/source/ndscreate.cpp, tools/ndstool/source/ndsextract.cpp, tools/ndstool/source/ndstool.cpp, tools/ndstool/source/ndstree.cpp, tools/ndstool/source/passme.cpp, tools/ndstool/source/passme_sram.c, tools/ndstool/source/raster.cpp, tools/ndstool/source/sha1.cpp, touchscreen/README.reco, touchscreen/parser.c, touchscreen/reco.c, touchscreen/reco.h, touchscreen/touchscreen.c, touchscreen/touchscreen.h, wifi/compat.c, wifi/compat.h, wifi/wifi.c: New files.
  • Property mode set to 100644
File size: 8.6 KB
Line 
1/*---------------------------------------------------------------------------------
2  $Id$
3
4  Copyright (C) 2005
5        Dave Murphy (WinterMute)
6
7  This software is provided 'as-is', without any express or implied
8  warranty.  In no event will the authors be held liable for any
9  damages arising from the use of this software.
10
11  Permission is granted to anyone to use this software for any
12  purpose, including commercial applications, and to alter it and
13  redistribute it freely, subject to the following restrictions:
14
15  1. The origin of this software must not be misrepresented; you
16     must not claim that you wrote the original software. If you use
17     this software in a product, an acknowledgment in the product
18     documentation would be appreciated but is not required.
19  2. Altered source versions must be plainly marked as such, and
20     must not be misrepresented as being the original software.
21  3. This notice may not be removed or altered from any source
22     distribution.
23
24---------------------------------------------------------------------------------*/
25
26#include <nds/jtypes.h>
27#include <nds/memory.h>
28
29#include <nds/arm9/video.h>
30#include <nds/arm9/console.h>
31#include <nds/arm9/exceptions.h>
32#include <nds/arm9/background.h>
33
34#include <stdio.h>
35
36//---------------------------------------------------------------------------------
37unsigned long ARMShift(unsigned long value,unsigned char shift) {
38//---------------------------------------------------------------------------------
39        // no shift at all
40        if (shift == 0x0B) return value ;
41        int index ;
42        if (shift & 0x01) {
43                // shift index is a register
44                index = exceptionRegisters[(shift >> 4) & 0x0F];
45        } else {
46                // constant shift index
47                index = ((shift >> 3) & 0x1F) ;
48        } ;
49        int i ;
50        bool isN ;
51        switch (shift & 0x06) {
52                case 0x00:
53                        // logical left
54                        return (value << index) ;
55                case 0x02:
56                        // logical right
57                        return (value >> index) ;
58                case 0x04:
59                        // arithmetical right
60                        isN = (value & 0x80000000) ;
61                        value = value >> index ;
62                        if (isN) {
63                                for (i=31;i>31-index;i--) {
64                                        value = value | (1 << i) ;
65                                } ;
66                        } ;
67                        return value ;
68                case 0x06:
69                        // rotate right
70                        index = index & 0x1F;
71                        value = (value >> index) | (value << (32-index));
72                        return value;
73        };
74        return value;
75}
76
77
78//---------------------------------------------------------------------------------
79u32 getExceptionAddress( u32 opcodeAddress, u32 thumbState) {
80//---------------------------------------------------------------------------------
81
82        int Rf, Rb, Rd, Rn, Rm;
83
84        if (thumbState) {
85                // Thumb
86
87                unsigned short opcode = *(unsigned short *)opcodeAddress ;
88                // ldr r,[pc,###]                       01001ddd ffffffff
89                // ldr r,[r,r]                          0101xx0f ffbbbddd
90                // ldrsh                                        0101xx1f ffbbbddd
91                // ldr r,[r,imm]                        011xxfff ffbbbddd
92                // ldrh                                         1000xfff ffbbbddd
93                // ldr r,[sp,###]                       1001xddd ffffffff
94                // push                                         1011x10l llllllll
95                // ldm                                          1100xbbb llllllll
96
97
98                if ((opcode & 0xF800) == 0x4800) {
99                        // ldr r,[pc,###]
100                        s8 offset = opcode & 0xff;
101                        return exceptionRegisters[15] + offset;
102                } else if ((opcode & 0xF200) == 0x5000) {
103                        // ldr r,[r,r]
104                        Rb = (opcode >> 3) & 0x07 ;
105                        Rf = (opcode >> 6) & 0x07 ;
106                        return exceptionRegisters[Rb] + exceptionRegisters[Rf];
107
108                } else if ((opcode & 0xF200) == 0x5200) {
109                        // ldrsh
110                        Rb = (opcode >> 3) & 0x07;
111                        Rf = (opcode >> 6) & 0x03;
112                        return exceptionRegisters[Rb] + exceptionRegisters[Rf];
113
114                } else if ((opcode & 0xE000) == 0x6000) {
115                        // ldr r,[r,imm]
116                        Rb = (opcode >> 3) & 0x07;
117                        Rf = (opcode >> 6) & 0x1F ;
118                        return exceptionRegisters[Rb] + (Rf << 2);
119                } else if ((opcode & 0xF000) == 0x8000) {
120                        // ldrh
121                        Rb = (opcode >> 3) & 0x07 ;
122                        Rf = (opcode >> 6) & 0x1F ;
123                        return exceptionRegisters[Rb] + (Rf << 2);
124                } else if ((opcode & 0xF000) == 0x9000) {
125                        // ldr r,[sp,#imm]
126                        s8 offset = opcode & 0xff;
127                        return exceptionRegisters[13] + offset;
128                } else if ((opcode & 0xF700) == 0xB500) {
129                        // push/pop
130                        return exceptionRegisters[13];
131                } else if ((opcode & 0xF000) == 0xC000) {
132                        // ldm/stm
133                        Rd = (opcode >> 8) & 0x07;
134                        return exceptionRegisters[Rd];
135                }
136        } else {
137                // arm32
138                unsigned long opcode = *(unsigned long *)opcodeAddress ;
139
140                // SWP                  xxxx0001 0x00nnnn dddd0000 1001mmmm
141                // STR/LDR              xxxx01xx xxxxnnnn ddddffff ffffffff
142                // STRH/LDRH    xxxx000x x0xxnnnn dddd0000 1xx1mmmm
143                // STRH/LDRH    xxxx000x x1xxnnnn ddddffff 1xx1ffff
144                // STM/LDM              xxxx100x xxxxnnnn llllllll llllllll
145
146                if ((opcode & 0x0FB00FF0) == 0x01000090) {
147                        // SWP
148                        Rn = (opcode >> 16) & 0x0F;
149                        return exceptionRegisters[Rn];
150                } else if ((opcode & 0x0C000000) == 0x04000000) {
151                        // STR/LDR
152                        Rn = (opcode >> 16) & 0x0F;
153                        if (opcode & 0x02000000) {
154                                // Register offset
155                                Rm = opcode & 0x0F;
156                                if (opcode & 0x01000000) {
157                                        unsigned short shift = (unsigned short)((opcode >> 4) & 0xFF) ;
158                                        // pre indexing
159                                        long Offset = ARMShift(exceptionRegisters[Rm],shift);
160                                        // add or sub the offset depending on the U-Bit
161                                        return exceptionRegisters[Rn] + ((opcode & 0x00800000)?Offset:-Offset);
162                                } else {
163                                        // post indexing
164                                        return exceptionRegisters[Rn];
165                                }
166                        } else {
167                                // Immediate offset
168                                unsigned long Offset = (opcode & 0xFFF) ;
169                                if (opcode & 0x01000000) {
170                                        // pre indexing
171                                        // add or sub the offset depending on the U-Bit
172                                        return exceptionRegisters[Rn] + ((opcode & 0x00800000)?Offset:-Offset);
173                                } else {
174                                        // post indexing
175                                        return exceptionRegisters[Rn];
176                                }
177                        }
178                } else if ((opcode & 0x0E400F90) == 0x00000090) {
179                        // LDRH/STRH with register Rm
180                        Rn = (opcode >> 16) & 0x0F;
181                        Rd = (opcode >> 12) & 0x0F;
182                        Rm = opcode & 0x0F;
183                        unsigned short shift = (unsigned short)((opcode >> 4) & 0xFF);
184                        long Offset = ARMShift(exceptionRegisters[Rm],shift);
185                        // add or sub the offset depending on the U-Bit
186                        return exceptionRegisters[Rn] + ((opcode & 0x00800000)?Offset:-Offset);
187                } else if ((opcode & 0x0E400F90) == 0x00400090) {
188                        // LDRH/STRH with immediate offset
189                        Rn = (opcode >> 16) & 0x0F;
190                        Rd = (opcode >> 12) & 0x0F;
191                        unsigned long Offset = (opcode & 0xF) | ((opcode & 0xF00)>>8) ;
192                        // add or sub the offset depending on the U-Bit
193                        return exceptionRegisters[Rn] + ((opcode & 0x00800000)?Offset:-Offset) ;
194                } else if ((opcode & 0x0E000000) == 0x08000000) {
195                        // LDM/STM
196                        Rn = (opcode >> 16) & 0x0F;
197                        return exceptionRegisters[Rn];
198                }
199        }
200        return 0;
201}
202
203static const char *registerNames[] =
204        {       "r0","r1","r2","r3","r4","r5","r6","r7",
205                "r8 ","r9 ","r10","r11","r12","sp ","lr ","pc " };
206
207extern const char __itcm_start[];
208//---------------------------------------------------------------------------------
209static void defaultHandler() {
210//---------------------------------------------------------------------------------
211        videoSetMode(0);
212        videoSetModeSub(MODE_0_2D | DISPLAY_BG0_ACTIVE);
213        vramSetBankC(VRAM_C_SUB_BG);
214
215        SUB_BG0_CR = BG_MAP_BASE(31);
216
217        BG_PALETTE_SUB[0] = RGB15(31,0,0);
218        BG_PALETTE_SUB[255] = RGB15(31,31,31);
219
220        consoleInitDefault((u16*)SCREEN_BASE_BLOCK_SUB(31), (u16*)CHAR_BASE_BLOCK_SUB(0), 16);
221
222        iprintf("\x1b[5CGuru Meditation Error!\n");
223        u32     currentMode = getCPSR() & 0x1f;
224        u32 thumbState = ((*(u32*)0x027FFD90) & 0x20);
225
226        u32 codeAddress, exceptionAddress = 0;
227
228        int offset = 8;
229
230        if ( currentMode == 0x17 ) {
231                iprintf ("\x1b[10Cdata abort!\n\n");
232                codeAddress = exceptionRegisters[15] - offset;
233                if (    (codeAddress > 0x02000000 && codeAddress < 0x02400000) ||
234                                (codeAddress > (u32)__itcm_start && codeAddress < (u32)(__itcm_start + 32768)) )
235                        exceptionAddress = getExceptionAddress( codeAddress, thumbState);
236                else
237                        exceptionAddress = codeAddress;
238                       
239        } else {
240                if (thumbState)
241                        offset = 2;
242                else
243                        offset = 4;
244                iprintf("\x1b[5Cundefined instruction!\n\n");
245                codeAddress = exceptionRegisters[15] - offset;
246                exceptionAddress = codeAddress;
247        }
248
249        iprintf("  pc: %08X addr: %08X\n\n",codeAddress,exceptionAddress);
250
251        int i;
252        for ( i=0; i < 8; i++ ) {
253                iprintf(        "  %s: %08X   %s: %08X\n",
254                                        registerNames[i], exceptionRegisters[i],
255                                        registerNames[i+8],exceptionRegisters[i+8]);
256        }
257        iprintf("\n");
258        u32 *stack = (u32 *)exceptionRegisters[13];
259        for ( i=0; i<10; i++ ) {
260                iprintf( "\x1b[%d;2H%08X: %08X %08X", i + 14, (u32)&stack[i*2],stack[i*2], stack[(i*2)+1] );
261        }
262        while(1);
263
264}
265
266//---------------------------------------------------------------------------------
267void defaultExceptionHandler() {
268//---------------------------------------------------------------------------------
269        setExceptionHandler(defaultHandler) ;
270}
Note: See TracBrowser for help on using the repository browser.