# # $Id$ # The contents of this directory are based upon the "r46kstub.tar.gz" package released to the net by C. M. Heard VVNET, Inc. phone: +1 408 247 9376 4040 Moorpark Ave. Suite 206 fax: +1 408 244 3651 San Jose, CA 95117 USA e-mail: heard@vvnet.com This package was released in the September 1996 time frame for use with gdb 4.16 and an IDT R4600 Orion. The stub was modified to support R3000 class CPUs and to work within the mips-rtems exeception processing framework. THe file memlimits.h could end up being target board dependent. If this is the case, copy it to your BSP directory and modify as necessary. --joel 8 February 2002 Original README =============== The r46kstub directory and its compressed archive (r46kstub.tar.gz) contain the 9/29/96 source code snapshot for a ROM-resident gdb-4.16 debug agent (aka stub) for the IDT R4600 Orion processor. It is based on the stub for the Hitachi SH processor written by Ben Lee and Steve Chamberlain and supplied with the gdb-4.16 distribution; that stub in turn was "originally based on an m68k software stub written by Glenn Engel at HP, but has changed quite a bit". The modifications for the R4600 were contributed by C. M. Heard of VVNET, Inc. and were based in part on the Algorithmics R4000 version of Phil Bunce's PMON program. The distribution consists of the following files: -rw-r--r-- 1 1178 Sep 29 16:34 ChangeLog -rw-r--r-- 1 748 Jul 26 01:18 Makefile -rw-r--r-- 1 6652 Sep 29 16:34 README -rw-r--r-- 1 1829 May 21 02:02 gdb_if.h -rw-r--r-- 1 3745 Sep 29 14:03 ioaddr.h -rw-r--r-- 1 2906 Sep 29 14:39 limits.h -rw-r--r-- 1 6552 May 23 00:17 mips_opcode.h -rw-r--r-- 1 14017 May 21 02:04 r4600.h -rw-r--r-- 1 23874 Jul 21 20:31 r46kstub.c -rw-r--r-- 1 1064 Jul 3 12:35 r46kstub.ld -rw-r--r-- 1 13299 Sep 29 16:24 stubinit.S With the exception of mips_opcode.h, which is a slightly modified version of a header file contributed by Ralph Campbell to 4.4 BSD and is therefore copyrighted by the UC Regents, all of the source files have been dedicated by their authors to the public domain. Use them as you wish, but do so at your own risk! The authors accept _no_ responsibility for any errors. The debug agent contained herein is at this writing in active use at VVNET supporting initial hardware debug and board bring-up of an OC-12 ATM probe board. It uses polled I/O on a 16C450 UART. We had originally intended to add support for interrupts to allow gdb to break in on a running program, but we have found that this is not really necessary since the reset button will accomplish the same purpose (thanks to the MIPS feature of saving the program counter in the ErrorEPC register when a reset exception occurs). Be aware that this stub handles ALL interrupts and exceptions except for reset (or NMI) in the same way -- by passing control to the debug command loop. It of course uses the ROM exception vectors to do so. In order to support code that actally needs to use interrupts we use use a more elaborate stub that is linked with the downloaded program. It hooks the RAM exception vectors and clears the BEV status bit to gain control. The ROM-based stub is still used in this case for initial program loading. In order to port this stub to a different platform you will at a minimum need to customize the macros in limits.h (which define the limits of readable, writeable, and steppable address space) and the I/O addresses in ioaddr.h (which define the 16C450 MMIO addresses). If you use something other than a 16C450 UART you will probably also need to modify the portions of stubinit.S which deal with the serial port. I've tried to be careful to respect all the architecturally-defined hazards as described in Appendix F of Kane and Heinrich, MIPS RISC Architecture, in order to minimize the work in porting to 4000-series processors other than the R4600, but no guarantees are offered. Support is presently restricted to big-endian addressing, and I've not even considered what changes would be needed for little-endian support. When this stub is built with gcc-2.7.2 and binutils-2.6 you will see a few warning messages from the single-step support routine where a cast is used to sign-extend a pointer (the next instruction address) into a long long (the PC image). Those warnings are expected; I've checked the generated code and it is doing what I had intended. But you should not see any other warnings or errors. Here is a log of the build: mips64orion-idt-elf-gcc -g -Wa,-ahld -Wall -membedded-data \ -O3 -c r46kstub.c >r46kstub.L r46kstub.c: In function `doSStep': r46kstub.c:537: warning: cast to pointer from integer of different size r46kstub.c:539: warning: cast to pointer from integer of different size r46kstub.c:547: warning: cast to pointer from integer of different size r46kstub.c:561: warning: cast to pointer from integer of different size r46kstub.c:563: warning: cast to pointer from integer of different size r46kstub.c:572: warning: cast to pointer from integer of different size r46kstub.c:574: warning: cast to pointer from integer of different size r46kstub.c:582: warning: cast to pointer from integer of different size r46kstub.c:589: warning: cast to pointer from integer of different size r46kstub.c:591: warning: cast to pointer from integer of different size r46kstub.c:597: warning: cast to pointer from integer of different size r46kstub.c:599: warning: cast to pointer from integer of different size r46kstub.c:605: warning: cast to pointer from integer of different size r46kstub.c:607: warning: cast to pointer from integer of different size r46kstub.c:613: warning: cast to pointer from integer of different size r46kstub.c:615: warning: cast to pointer from integer of different size r46kstub.c:624: warning: cast to pointer from integer of different size r46kstub.c:628: warning: cast to pointer from integer of different size r46kstub.c:635: warning: cast to pointer from integer of different size r46kstub.c:637: warning: cast to pointer from integer of different size mips64orion-idt-elf-gcc -g -Wa,-ahld -Wall -membedded-data \ -O3 -c stubinit.S >stubinit.L mips64orion-idt-elf-ld -t -s -T r46kstub.ld -Map r46kstub.map -o r46kstub.out mips64orion-idt-elf-ld: mode elf32bmip stubinit.o r46kstub.o mips64orion-idt-elf-objcopy -S -R .bss -R .data -R .reginfo \ -O srec r46kstub.out r46kstub.hex Limitations: stubinit.S deliberately forces the PC (which is a 64-bit register) to contain a legitimate sign-extended 32-bit value. This was done to cope with a bug in gdb-4.16, which does _not_ properly sign-extend the initial PC when it loads a program. This means that you cannot use the "set" command to load an unmapped sixty-four bit virtual address into the PC, as you can for all other registers. Please send bug reports, comments, or suggestions for improvement to: