GNUPro®
Toolkit
GNUPro Toolkit
Reference for eCos
Toshiba TX39
eCos 1.2.1
April 1999
Table of Contents
Copyright Ó 1999 CYGNUS
SOLUTIONS, Inc. All rights reserved.
No part of this document may be reproduced in any form
or by any means without the prior express written consent of CYGNUS
SOLUTIONS, Inc.
No part of this document may be changed and/or modified
without the prior express written consent of CYGNUS
SOLUTIONS, Inc.
GNUPro®, the GNUPro® logo,
and the Cygnus Solutions logo are registered trademarks of
CYGNUS SOLUTIONS, Inc.
All other brand and product names are trademarks of their respective owners.
Corporate Headquarters
CYGNUS SOLUTIONS
1325 Chesapeake Terrace
Sunnyvale, CA 94089 USA
TEL: +1 408 542 9600
Support:
Within USA/Canada: +1 800 CYGNUS1
Outside USA/Canada: +1 408 542 9601
FAX: +1 408 542 9699
EMAIL: info@cygnus.com
WEBSITE: http://www.cygnus.com/
Cygnus Japan
NIHON CYGNUS SOLUTIONS
Madre Matsuda Building
4-13 Kioi-cho Chiyoda-ku
Tokyo 102-0094 JAPAN
TEL: +81-3-3234-3896
FAX: +81-3-3239-3300
EMAIL: info@cygnus.co.jp
WEBSITE: http://www.cygnus.co.jp/
Cygnus Europe
CYGNUS SOLUTIONS
35-36 Cambridge Place
Cambridge CB2 1NS
United Kingdom
TEL: +44 1223 728728
FAX: +44 1223 728777
Part #: 300-400-1010047-1.2.1
Table of Contents
Introduction
Tool naming conventions
Toolkit features
Processor version(s)
Targets Supported
Hosts Supported
Object file format
GNUPro on Windows NT
Windows environment settings
Case Sensitivity
GNUPro on Redhat Linux
Reference
Compiler
TX39-specific command-line
options
Preprocessor symbols
TX39-specific attributes
New compiler and linker features
Initialization prioritization
Selective linking
EABI Summary
Data type sizes and alignments
Subroutine calls
The Stack Frame
Parameter Assignment to Registers
Structure passing
Varargs handling
Function Return Values
Assembler
MIPS-specific command-line
options
Syntax
Register names
Assembler directives
MIPS Synthetic Instructions
Supported for the TX39
Linker
TX39-specific command-line
options
Debugger
TX39-specific command-line
options
Debugging programs with multiple
threads
Simulator
Features
Simulator-specific command
line options
Using the simulator
Simulator exceptions within
GDB
CygMon, the simulator, and
thread-aware debugging
Appendix A: CygMon (Cygnus ROM
Monitor)
Installing and building CygMon
Installing CygMon Source
Building CygMon
CygMon command list
baud
break
disassemble
dump
go
help
load
memory
port
register
step
terminal
transfer
unbreak
usage
version
CygMon command editing
Debugging CygMon
Appendix B: Bibliography
Introduction
The GNUPro Toolkit for eCos is a complete
solution for C and C++ development for the Toshiba TX39. The tools include
the compiler, assembler, linker, simulator and interactive debugger. Simulator,
linker and debugger support is also included for the Toshiba JMR-TX3904A-50
evaluation board. In addition to this manual, please read Getting
started with eCos.
Tool naming conventions
Cross-development tools in the Cygnus GNUPro Toolkit
normally have names that reflect the target processor and the object file
format output by the tools (for example ELF). This makes it possible to
install more than one set of tools in the same binary directory, including
both native and cross-development tools.
The complete tool name is a four-part hyphenated string.
The first part indicates the processor family (mips).
The second part indicates the processor (tx39).
The third part indicates the file format output by the tool (elf).
The fourth part is the generic tool name (gcc).
For example, the GCC compiler for the Toshiba TX39 is mips-tx39-elf-gcc.
The TX39 package includes the following supported tools:
| Tool Description |
Tool Name |
| GCC compiler |
mips-tx39-elf-gcc |
| C++ compiler |
mips-tx39-elf-c++ |
| GAS assembler |
mips-tx39-elf-as |
| GLD linker |
mips-tx39-elf-ld |
| Standalone simulator |
mips-tx39-elf-run |
| Binary Utilities |
mips-tx39-elf-ar
mips-tx39-elf-nm
mips-tx39-elf-objcopy
mips-tx39-elf-objdump
mips-tx39-elf-ranlib
mips-tx39-elf-size
mips-tx39-elf-strings
mips-tx39-elf-strip |
| GDB debugger |
mips-tx39-elf-gdb |
The binaries for a Windows NT hosted toolchain are installed
with an .exe
suffix. However, the .exe
suffix does not need to be specified when running the executable.
Toolkit
features
The following describes TX39-specific features of the
GNUPro Toolkit.
Processor version(s)
Toshiba TX39.
Targets
Supported
GNUPro Instruction Set Simulator with architectural extensions to
support eCos execution
Toshiba JMR-TX3904A-50 evaluation board
Both targets run in big-endian mode.
Hosts Supported
| CPU |
Operating System |
Vendor |
| x86 |
Windows NT 4.0 |
Microsoft |
| x86 |
Redhat Linux 5.x |
Redhat |
Object file format
The TX39 tools support the ELF object file format.
Refer to Chapter 4, System V Application Binary Interface
(Prentice Hall, 1990.). Use ld
(refer to Using LD in GNUPro Utilities) or objcopy
(refer to The GNU Binary Utilities in GNUPro Utilities)
to produce S-records.
GNUPro
on Windows NT
Windows environment settings
The Windows NT hosted toolchain requires the following
environmental settings to function properly. Assume the release is installed
in:
C:\cygnus\gnupro\i386-cygwin32\mips-tx39-elf\ecos-98r1p6
SET PROOT=C:\cygnus\gnupro\i386-cygwin32\mips-tx39-elf\ecos-98r1p6
SET PATH=%PROOT%\H-i386-cygwin32\bin;%PATH%
SET INFOPATH=%PROOT%\info
REM Set TMPDIR to point
to a ramdisk if you have one
SET TMPDIR=C:\TEMP
For the Sourceware release of eCos, ensure that the Cygwin B20.1 tools
are also installed. Assuming these are installed in their default location
in
C:\cygnus\cygwin-b20
then add the environmental setting:
SET PATH=C:\cygnus\cygwin-b20\H-i586-cygwin32\bin;%PATH%
If you are using the eCos Developers Kit CD release (not
included in the sourceware release), a working environment can be established
by using the following shortcut from the Windows Start menu:
Programs->Cygnus eCos->eCos Development
Environment.
This will bring up a window running bash, and your Windows
environment will be automatically set up.
Case Sensitivity
The following strings are case sensitive under Windows
NT:
-
command line options
-
assembler labels
-
linker script commands
-
section names
The following strings are not case sensitive under Windows
NT:
-
gdb commands
-
assembler instructions and register names
Case sensitivity for Windows NT is dependent on system
configuration. By default, file names under Windows NT are not case sensitive.
GNUPro
on Redhat Linux
The GNUPro Tools for Redhat Linux are supplied in a
ZIP format file. Detailed instructions for installation can be found on
the eCos sourceware site:
http://sourceware.cygnus.com/ecos/
Assuming the sources for the tools were installed in
/usr/cygnus/ecosSWtools-990319/src
By following the instructions in the Installation Guide,
you should eventually have the tools installed in
/usr/cygnus/ecosSWtools-990319/H-i386-pc-linux-gnu/bin
In which case, we recommend you have the following settings
in your appropriate shell startup script.
For Bourne shell compatible shells:
PROOT=/usr/cygnus/ecosSWtools-990319
PATH=$PROOT/H-i386-pc-linux-gnu/bin:$PATH
INFOPATH=$PROOT/info:${INFOPATH-/usr/local/info:/usr/info}
MANPATH=$PROOT/man:${MANPATH-/usr/local/man:/usr/man}
export PATH INFOPATH
MANPATH
For C-shell compatible shells:
setenv PROOT /usr/cygnus/ecosSWtools-990319
if ( "$?MANPATH" == "0"
) then
setenv MANPATH "/usr/local/man:/usr/man"
endif
if ( "$?INFOPATH" ==
"0" ) then
setenv INFOPATH "/usr/local/info:/usr/info"
endif
setenv MANPATH $PROOT/man:$MANPATH
setenv INFOPATH $PROOT/info:$INFOPATH
set path = ( $PROOT/H-i386-pc-linux-gnu/bin
$path )
Reference
Compiler
This section describes TX39-specific features of the
GNUPro Compiler.
TX39-specific
command-line options
For a list of available generic compiler options, refer
to "GNU CC Command Options" in Using GNU CC in GNUPro Compiler
Tools. MIPS-specific options can also be found in the MIPS Development
section of GNUPro Tools for Embedded Systems. In addition,
the following TX39-specific command-line option is of particular interest:
-msoft-float
This option is on by default. It causes the compiler
to generate output containing library calls for floating point operations.
Preprocessor symbols
The compiler supports the following preprocessor symbols:
__mips__
__R3000__
Each of these is always defined.
__mips_eabi
Is always defined because the GNUPro TX39 toolchain
conforms to the MIPS Embedded ABI
__MIPSEB__
Is always defined, because the tx39 is big-endian only.
__mips_soft_float
Is always defined, because the tx39 has no FPU, and
so passing -msoft-float
to the compiler is unnecessary.
TX39-specific attributes
There are no TX39-specific attributes. See "Declaring
Attributes of Functions" and "Specifying Attributes of Variables" in "Extensions
to the C Language Family" in Using GNU CC in GNUPro Compiler
Tools for more information.
New compiler and linker
features
The GNUPro compiler and linker have been improved by
Cygnus to provide even more benefits for customers developing for embedded
targets. These features are guaranteed order of initialization at startup,
and selective linking.
Initialization prioritization
In C++, you can define static and global objects with
constructors, or initialize static and global variables from a function.
This means that the constructors or functions are run before the rest of
your program starts. However, when you have these objects spread over multiple
files, the C++ standard does not specify the order in which they are initialized,
and for all practical purposes the order is random. For an embedded system,
this can be a problem, as you may want to ensure that a static scheduler
object is initialized before static threads can attach to it, or that devices
are initialized before they are used. GNUPro solves this problem by allowing
you to define a priority when the static or global is declared. The following
example shows the syntax:
static object_t myobj
__attribute__((init_priority (30000) ));
The syntax is slightly different if the object takes any
arguments to its constructor:
static object_t myobj __attribute__((init_priority
(30000) )) = object_t(arg1, arg2);
The numeric priority can be from 1 to 65535, with 1 being
the highest priority, and 65535 being the lowest. The default priority
for objects without this attribute is 65535. Constructors with a higher
priority are guaranteed execution before constructors with lower priority.
In all cases, you must provide the argument -finit-priority
to the compiler on its command-line for it to recognize this attribute
when you are compiling your C++ source files.
If you are using eCos, be warned that eCos uses initialization
priorities internally. Ensure you choose an appropriate priority level
so that other eCos subsystems will have initialized before you refer to
them in your own constructor.
Selective linking
When writing C and C++ code, it is sometimes natural
to include more than one function in a source file. For example in C++,
it is common to have all methods for a particular class contained in the
same C++ source file. However, there is a drawback that, conventionally,
if you use just one of these functions, then all the functions defined
in that file also get included in the final executable image. For an embedded
system, this can substantially and unnecessarily increase the size of the
final image stored in ROM, or loaded into RAM when debugging.
The GNUPro C and C++ compilers can now optionally remove
these unnecessary functions from the final image. They also ensure that
any shared global data is removed that is only referenced by functions
that are removed. This can be done by including the options -ffunction-sections
and -fdata-sections
on the command-line, when you invoke the C or C++ compiler. The -ffunction-sections
option removes unnecessary functions, and the -fdata-sections
option removes unnecessary data.
In addition, when classes define virtual methods in C++,
it is possible to remove any unused methods from the final image by passing
the option -fvtable-gc
to the C++ compiler on its command-line.
In all cases, you must also supply a command-line option
when linking. If invoking the linker ld directly, use --gc-sections
on its command-line; alternatively, if you are using the preferred method
of linking your executable, using the form
gcc
-o <program name> <file1>.o <file2>.o,
then also pass the option -Wl,--gc-sections
on the compiler command-line, for example:
gcc -o prog f1.o f2.o
-Wl,--gc-sections
EABI Summary
This section describes the MIPS Embedded Application
Binary Interface (EABI). As the TX39 does not have a floating-point unit,
the parts of the EABI pertaining to floating point registers do not apply.
Data type sizes and alignments
The following table shows the size and alignment for
all data types:
| Type |
Size (bytes) |
Alignment (bytes) |
| char |
1 byte |
1 byte |
| short |
2 bytes |
2 bytes |
| int |
4 bytes |
4 bytes |
| unsigned |
4 bytes |
4 bytes |
| long |
4 bytes |
4 bytes |
| long
long |
8 bytes |
8 bytes |
| float |
4 bytes |
4 bytes |
| double |
8 bytes |
8 bytes |
| pointer |
4 bytes |
4 bytes |
-
Alignment within aggregates (structs and unions) is as above,
with padding added if needed
-
Aggregates have alignment equal to that of their most aligned
member
-
Aggregates have sizes which are a multiple of their alignment
Subroutine calls
The following describes the calling conventions for
subroutine calls. The first table outlines the registers used for passing
parameters. The second table outlines other register usage.
| Parameter registers: |
| general-purpose |
r4-r11 |
| floating point |
f12-f19 |
| Register usage: |
| fixed 0 value |
r0 |
| volatile |
r1-r15,
r24, r25 |
| non-volatile |
r16-r23,
r30 |
| kernel reserved |
r26,
r27 |
| gp (SDA base) |
r28 |
| stack pointer |
r29 |
| frame pointer |
r30
(if needed) |
| return address |
r31 |
-
General-purpose and floating point parameter registers are
allocated independently.
-
Structures that are less than or equal to 32 bits are passed
as values.
-
Structures
that are greater than 32 bits are passed as pointers.
The Stack Frame
This section describes TX39 stack frame:
-
The stack grows downwards from high addresses to low addresses.
-
A leaf function need not allocate a stack frame if it does
not need one.
-
A frame pointer need not be allocated.
-
The stack pointer shall always be aligned to 8 byte boundaries.
Stack frames for functions that take a fixed number
of arguments look like this:
* If
no alloca
region the frame pointer (FP) points to the same place as SP.
Stack frames for functions that take a variable number
of arguments look like this:
* If
no alloca
region the frame pointer (FP) points to the same place as SP.
Parameter Assignment to Registers
Consider the parameters in a function call as ordered
from left (first parameter) to right. In this algorithm, FR contains
the number of the next available
floating-point register (or register pair for modes in
which floating-point registers hold only 32 bits). GR contains the number
of the next available general-purpose register. STARG is the address
of the next available stack parameter word.
INITIALIZE:
Set GR=r4, FR=f12, and STARG to point to parameter
word 1.
SCAN:
If there are no more parameters, terminate. Otherwise,
select one of the following depending on the type of the next parameter:
DOUBLE OR FLOAT:
If FR > f19, go to STACK. Otherwise, load the parameter
value into
floating-point register FR and advance FR to the
next floating-point register (or register pair in 32-bit mode). Then go
to SCAN.
SIMPLE ARG:
A SIMPLE ARG is one of the following:
-
One of the simple integer types which will fit into a general-purpose
register
-
A pointer to an object of any type
-
A struct or union small enough to fit in a register
-
A larger struct or union, which shall be treated as a pointer
to the object or to a copy of the object (See below for when copies are
made.)
If GR > r11, go to STACK. Otherwise, load the parameter
value into general-purpose register GR and advance GR to the next general-purpose
register. Values shorter than the register size are sign-extended or zero-extended
depending on whether they are signed or unsigned. Then go to SCAN.
LONG LONG in 32-bit mode:
If GR > r10, go to STACK. Otherwise, if GR is odd,
advance GR to the next register. Load the 64-bit long
long value into register pair GR and GR+1.
Advance GR to GR+2 and go to SCAN.
STACK:
Parameters not otherwise handled above are passed in the
parameter words of the caller's stack frame. SIMPLE ARGs, as defined above,
are considered to have size and alignment equal to the size of a general-purpose
register, with simple argument types shorter than this sign- or zero-extended
to this width. float arguments are considered to have size and alignment
equal to the size of a floating-point register. In 64-bit mode, floats
are stored in the low-order 32 bits of the 64-bit space allocated to them.
double
and long long
are considered to have 64-bit size and alignment. Round STARG up to a
multiple of the alignment requirement of the parameter and copy the argument
byte-for-byte into STARG, STARG+1, ... STARG+size-1. Set STARG
to STARG+size and go to SCAN.
Structure passing
As noted above, code, which passes structures and unions
by value is implemented specially. (In this section, "struct" will refer
to structs and unions inclusively.) Structs small enough to fit in a register
are passed by value in a single register or in a stack frame slot the size
of a register. Larger structs are handled by passing the address of the
structure. In this case, a copy of the structure will be made if necessary
in order to preserve the pass-by-value semantics.
Copies of large structs are made under the following rules:
| |
ANSI mode |
K&R Mode |
| Normal param |
Callee copies if needed |
Caller copies |
| Varargs (...) param |
Caller copies |
Caller copies |
In the case of normal (non-varargs) large-struct parameters
in ANSI mode, the callee is responsible for producing the same effect as
if a copy of the structure were passed, preserving the pass-by-value semantics.
This may be accomplished by having the callee make a copy, but in some
cases the callee may be able to determine that a copy is not necessary
in order to produce the same results. In such cases, the callee may choose
to avoid making a copy of the parameter.
Varargs handling
No special changes are needed for handling varargs parameters
other than the caller knowing that a copy is needed on struct parameters
larger than a register (see above).
The varargs macros set up a two-part register save area,
one part for the general-purpose registers and one part for floating-point
registers, and maintain separate pointers for these two areas and for the
stack parameter area. The register save area lies between the caller and
callee stack frame areas.
In the case of software floating-point only the general-purpose
registers need to be saved. Because the save area lies between the two
stack frames, the saved register parameters are contiguous with parameters
passed on the stack. This allows the varargs macros to be much simpler.
Only one pointer is needed, which advances from the register save area
into the caller's stack frame.
Function Return Values
Data types and register usage for return values:
| Type |
Register |
| int |
r2 |
| short |
r2 |
| long |
r2 |
| long
long |
r2-r3
(32-bit mode) |
| float |
f0 |
| double |
f0-f1
(32-bit mode) |
| struct/union |
see below |
Structures and unions, which will fit into two general-purpose
registers are returned in r2,
or in r2
and r3
if necessary. They are aligned within the register according to the endianness
of the processor; e.g., on a big-endian processor the first byte of the
struct is returned in the most significant byte of r2,
while on a little-endian processor the first byte is returned in the least
significant byte of r2.
The caller handles larger structures and unions, by passing, as a "hidden"
first argument, a pointer to space allocated to receive the return value.
Assembler
This section describes TX39-specific
features of the GNUPro Assembler.
MIPS-specific command-line
options
For a list of available generic assembler options, refer
to "Command-Line Options" in Using AS in GNUPro Utilities.
Syntax
For information about the
MIPS instruction set, see MIPS RISC Architecture, (Kane and
Heindrich, Prentice-Hall). For an overview of MIPS assembly conventions,
see "Appendix D: Assembly Language Programming" in the same volume.
Register
names
There are 32 64-bit general (integer) registers, named
$0
through
$31.
The symbols $0
through $31
refer to the general-purpose registers.
The following symbols can be used as aliases for individual
registers:
| Symbol |
Register |
| $at |
$1 |
| $kt0 |
$26 |
| $kt1 |
$27 |
| $gp |
$28 |
| $sp |
$29 |
| $fp |
$30 |
Assembler directives
This is a complete list of the TX39 assembler directives.
| .abicalls |
.dcb.b |
.fail |
.irepc |
.psize |
| .abort |
.dcb.d |
.file |
.irp |
.purgem |
| .aent |
.dcb.l |
.fill |
.irpc |
.quad |
| .align |
.dcb.s |
.float |
.lcomm |
.rdata |
| .appfile |
.dcb.w |
.fmask |
.lflags |
.rep |
| .appline |
.dcb.x |
.format |
.linkonce |
.rept |
| .ascii |
.debug |
.frame |
.list |
.rva |
| .asciiz |
.double |
.global |
.livereg |
.sbttl |
| .asciz |
.ds |
.globl |
.llen |
.sdata |
| .balign |
.ds.b |
.gpword |
.loc |
.set |
| .balignl |
.ds.d |
.half |
.long |
.short |
| .balignw |
.ds.l |
.hword |
.lsym |
.single |
| .bgnb |
.ds.p |
.if |
.macro |
.skip |
| .bss |
.ds.s |
.ifc |
.mask |
.space |
| .byte |
.ds.w |
.ifdef |
.mexit |
.spc |
| .comm |
.ds.x |
.ifeq |
.mri |
.stabd |
| .common |
.dword |
.ifeqs |
.name |
.stabn |
| .common.s |
.eject |
.ifge |
.noformat |
.stabs |
| .cpadd |
.else |
.ifgt |
.nolist |
.string |
| .cpload |
.elsec |
.ifle |
.nopage |
.struct |
| .cprestore |
.end |
.iflt |
.octa |
.text |
| .data |
.endb |
.ifnc |
.offset |
.title |
| .dc |
.endc |
.ifndef |
.option |
.ttl |
| .dc.b |
.endif |
.ifne |
.org |
.verstamp |
| .dc.d |
.ent |
.ifnes |
.p2align |
.word |
| .dc.l |
.equ |
.ifnotdef |
.p2alignl |
.xcom |
| .dc.s |
.equiv |
.include |
.p2alignw |
.xdef |
| .dc.w |
.err |
.insn |
.page |
.xref |
| .dc.x |
.exitm |
.int |
.plen |
.xstabs |
| .dcb |
.extern |
.irep |
.print |
.zero |
MIPS Synthetic Instructions
Supported for the TX39
The TX39 GAS assembler supports the typical MIPS synthetic
instructions (macros). What follows is a list of synthetic instructions
supported by the assembler, as well as an example expansion of each instruction.
R1 R2 R3 - integer registers
I1 I2 I3 - immediate integers
I? - integer value dependent on values of macro arguments
| Instruction |
Expansion |
| abs R1
R2 |
bgez
R2,abs-L1
ove R1,R2
neg R1,R2
abs-L1: |
| add
R1 R2 I1 |
addi
R1,R2,I1 |
| addu
R1 R2 I1 |
addiu
R1,R2,I1 |
| and
R1 R2 I1 |
andi
R1,R2,I1 |
| beq
R1 I1 I2 |
li
$at,I1
beq R1,$at,+I2 |
| beql
R1 I1 I2 |
li
$at,I1
beql R1,$at,+I2 |
| bge
R1 R2 I1 |
slt
$at,R1,R2
beqz $at,+I1 |
| bge
R1 I1 I2 |
slti
$at,R1,I1
beqz $at,+I2 |
| bgel
R1 R2 I1 |
slt
$at,R1,R2
beqzl $at,+I1 |
| bgel
R1 I1 I2 |
slti
$at,R1,I1
beqzl $at,+I2 |
| Instruction |
Expansion |
| bgeu
R1 R2 I1 |
sltu
$at,R1,R2
beqz $at,+I1 |
| bgeu
R1 I1 I2 |
sltiu
$at,R1,I1
beqz $at,+I2 |
| bgeul
R1 R2 I1 |
sltu
$at,R1,R2
beqzl $at,+I1 |
| bgeul
R1 I1 I2 |
sltiu
$at,R1,I1
beqzl $at,+I2 |
| bgt
R1 R2 I1 |
slt
$at,R2,R1
bnez $at,+I1 |
| bgt
R1 I1 I2 |
slti
$at,R1,I1+1
beqz $at,+I2 |
| bgtl
R1 R2 I1 |
slt
$at,R2,R1
bnezl $at,+I1 |
| bgtl
R1 I1 I2 |
slti
$at,R1,I1+1
beqzl $at,+I2 |
| bgtu
R1 R2 I1 |
sltu
$at,R2,R1
bnez $at,+I1 |
| bgtu
R1 I1 I2 |
sltiu
$at,R1,I1+1
beqz $at,+I2 |
| bgtul
R1 R2 I1 |
sltu
$at,R2,R1
bnezl $at,+I1 |
| bgtul
R1 I1 I2 |
sltiu
$at,R1,I1+1
beqzl $at,+I2 |
| ble
R1 R2 I1 |
slt
$at,R2,R1
beqz $at,+I1 |
| Instruction |
Expansion |
| ble
R1 I1 I2 |
slti
$at,R1,I1+1
bnez $at,+I2 |
| blel
R1 R2 I1 |
slt
$at,R2,R1
beqzl $at,+I1 |
| blel
R1 I1 I2 |
slti
$at,R1,I1+1
bnezl $at,+I2 |
| bleu
R1 R2 I1 |
sltu
$at,R2,R1
beqz $at,+I1 |
| bleu
R1 I1 I2 |
sltiu
$at,R1,I1+1
bnez $at,+I2 |
| bleul
R1 R2 I1 |
sltu
$at,R2,R1
beqzl $at,+I1 |
| bleul
R1 I1 I2 |
sltiu
$at,R1,I1+1
bnezl $at,+I2 |
| blt
R1 R2 I1 |
slt
$at,R1,R2
bnez $at,+I1 |
| blt
R1 I1 I2 |
slti
$at,R1,I1
bnez $at,+I2 |
| bltl
R1 R2 I1 |
slt
$at,R1,R2
bnezl $at,+I1 |
| bltl
R1 I1 I2 |
slti
$at,R1,I1
bnezl $at,+I2 |
| bltu
R1 R2 I1 |
sltu
$at,R1,R2
bnez $at,+I1 |
| bltu
R1 I1 I2 |
sltiu
$at,R1,I1
bnez $at,+I2 |
| Instruction |
Expansion |
| bltul R1 R2 I1 |
sltu $at,R1,R2
bnezl $at,+I1 |
| bltul R1 I1 I2 |
sltiu $at,R1,I1
bnezl $at,+I2 |
| bne R1 I1 I2 |
li $at,I1
bne R1,$at,+I2 |
| bnel R1 I1 I2 |
li $at,I1
bnel R1,$at,+I2 |
| div
R1 R2 R3 |
div
$zero,R2,R3
bnez R3,div-L6
nop
break 0x7
div-L6:
li $at,-1
bne R3,$at,div-L7
lui $at,0x8000
bne R2,$at,div-L7
nop
break 0x6
div-L7:
mflo R1 |
| div
R1 R2 I1 |
li
$at,I1
div $zero,R2,$at
mflo R1 |
| divu
R1 R2 R3 |
divu
$zero,R2,R3
bnez R3,divu-L8
nop
break 0x7
divu-L8:
mflo R1 |
| divu
R1 R2 I1 |
li
$at,I1
divu $zero,R2,$at
mflo R1 |
| dmul
R1 R2 R3 |
dmultu
R2,R3
mflo R1 |
| dmul
R1 R2 I1 |
li
$at,I1
dmult R2,$at
mflo |
| Instruction |
Expansion |
| dsub R1 R2 I1 |
daddi R1,R2,-I1 |
| dsubu R1 R2 I1 |
daddiu R1,R2,-I1 |
| jal R1 R2 |
jalr R1,R2 |
| jal R1 |
jalr R1 |
| la R1 I1(R2) |
li R1,I1
daddu R1,R1,R2 |
| lb R1 I1(R2) |
lb R1,I1(R2) |
| lbu R1 I1(R2) |
lbu R1,I1(R2) |
| ld
R1 I1(R2) |
ld
R1,I1(R2) |
| ldc2
R1 I1(R2) |
ldc2
R1,I1(R2) |
| ldc3
R1 I1(R2) |
ld
R1,I1(R2) |
| ldl
R1 I1(R2) |
ldl
R1,I1(R2) |
| ldr
R1 I1(R2) |
ldr
R1,I1(R2) |
| lh
R1 I1(R2) |
lh
R1,I1(R2) |
| lhu
R1 I1(R2) |
lhu
R1,I1(R2) |
| li.d
R1 I1 |
li
R1,I?
dsll32 R1,R1,0xf |
| li.s
R1 I1 |
lui
R1,I? |
| lwc0
R1,I1(R2) |
ll
R1,I1(R2) |
| mul
R1 R2 R3 |
multu
R2,R3
mflo R1 |
| Instruction |
Expansion |
| mul
R1 R2 I1 |
li
$at,I1
mult R2,$at
mflo R1 |
| nor
R1 R2 I1 |
ori
R1,R2,I1
nor R1,R1,$zero |
| or
R1 R2 I1 |
ori
R1,R2,I1 |
| rem
R1 R2 R3 |
div
$zero,R2,R3
bnez R3,rem-L12
nop
break 0x7
rem-L12:
li $at,-1
bne R3,$at,rem-L13
lui $at,0x8000
bne R2,$at,rem-L13
nop
break 0x6
rem-L13:
mfhi R1 |
| rem
R1 R2 I1 |
li
$at,I1
div $zero,R2,$at
mfhi R1 |
| remu
R1 R2 R3 |
divu
$zero,R2,R3
bnez R3,remu-L14
nop
break 0x7
remu-L14
mfhi R1 |
| remu
R1 R2 I1 |
li
$at,I1
divu $zero,R2,$at
mfhi R1 |
| rol
R1 R2 R3 |
negu
$at,R3
srlv $at,R2,$at
sllv R1,R2,R3
or R1,R1,$at |
| Instruction |
Expansion |
| rol
R1 R2 I1 |
sll
$at,R2,I1
srl R1,R2,32-I1
or R1,R1,$at |
| ror
R1 R2 R3 |
negu
$at,R3
sllv $at,R2,$at
srlv R1,R2,R3
or R1,R1,$at |
| ror
R1 R2 I1 |
srl
$at,R2,I1
sll R1,R2,32-I1
or R1,R1,$at |
| sdc3
R1 I1(R2) |
sd
R1,I1(R2) |
| seq
R1 R2 R3 |
xor
R1,R2,R3
sltiu R1,R1,1 |
| seq
R1 R2 I1 |
xori
R1,R2,I1
sltiu R1,R1,1 |
| sge
R1 R2 R3 |
slt
R1,R2,R3
xori R1,R1,0x1 |
| sge
R1 R2 I1 |
slti
R1,R2,I1
xori R1,R1,0x1 |
| sgeu
R1 R2 R3 |
sltu
R1,R2,R3
xori R1,R1,0x1 |
| sgeu
R1 R2 I1 |
sltiu
R1,R2,I1
xori R1,R1,0x1 |
| sgt
R1 R2 R3 |
slt
R1,R3,R2 |
| Instruction |
Expansion |
| sgt
R1 R2 I1 |
li
$at,I1
slt R1,$at,R2 |
| sgtu
R1 R2 R3 |
sltu
R1,R3,R2 |
| sgtu
R1 R2 I1 |
li
$at,I1
sltu R1,$at,R2 |
| sle
R1 R2 R3 |
slt
R1,R3,R2
xori R1,R1,0x1 |
| sle
R1 R2 I1 |
li
$at,I1
slt R1,$at,R2
xori R1,R1,0x1 |
| sleu
R1 R2 R3 |
sltu
R1,R3,R2
xori R1,R1,0x1 |
| sleu
R1 R2 I1 |
li
$at,I1
sltu R1,$at,R2
xori R1,R1,0x1 |
| slt
R1 R2 I1 |
slti
R1,R2,I1 |
| sltu
R1 R2 I1 |
sltiu
R1,R2,I1 |
| sne
R1 R2 R3 |
xor
R1,R2,R3
sltu R1,$zero,R1 |
| sne
R1 R2 I1 |
xori
R1,R2,I1
sltu R1,$zero,R1 |
| sub
R1 R2 I1 |
addi
R1,R2,-I1 |
| subu
R1 R2 I1 |
addiu
R1,R2,-I1 |
| swc0
R1 I1(R2) |
sc
R1,I1(R2) |
| Instruction |
Expansion |
| scache
R1 I1(R2) |
swl
R1,I1(R2) |
| invalidate
R1 I1(R2) |
swr
R1,I1(R2) |
| teq
R1 I1 |
teqi
R1,I1 |
| tge
R1 I1 |
tgei
R1,I1 |
| tgeu
R1 I1 |
tgeiu
R1,I1 |
| tlt
R1 I1 |
tlti
R1,I1 |
| tltu
R1 I1 |
tltiu
R1,I1 |
| tne
R1 I1 |
tnei
R1,I1 |
| ulh
R1 I1(R2) |
lb
R1,I1(R2)
lbu $at,I1+1(R2)
sll R1,R1,0x8
or R1,R1,$at |
| ulhu
R1 I1(R2) |
lbu
R1,I1(R2)
lbu $at,I1+1(R2)
sll R1,R1,0x8
or R1,R1,$at |
| ulw
R1 I1(R2) |
lwl
R1,I1(R2)
lwr R1,I1+3(R2) |
| ush R1 I1(R2) |
sb R1,I1+1(R2)
srl $at,R1,0x8
sb $at,I1(R2) |
| usw R1 I1(R2) |
swl R1,I1(R2)
swr R1,I1+3(R2) |
| xor R1 R2 I1 |
xori R1,R2,I1 |
Linker
eCos generates linker scripts appropriate for the exact
eCos configuration you have chosen. Instructions on how to use this
linker script are provided in the manual Getting Started with
eCos.
TX39-specific
command-line options
For a list of available generic linker options, refer
to ld command line options in Using LD in GNUPro Utilities.
There are no TX39-specific command-line linker options.
Debugger
This section describes TX39-specific features of the
GNUPro Debugger.
For debugging examples, see chapter "Run an eCos test
case" in Getting Started with eCos
There are two ways for GDB to talk to a TX39 target.
-
Simulator:
To build eCos for the simulator you may either configure
it to build for the target hardware with ROM startup, or for the minimal
simulator with RAM startup. Linking your program against the eCos libtarget.a
library, and with the target.ld
linker script will produce the correct final executable that should be
loaded into the simulator.
Note:
Loading binaries into the simulator that were built for
the standard evaluation board with RAM startup will not work.
To activate the simulator in GDB, follow the instructions
in the Simulator section later in this document.
-
Remote target board:
To load your program onto the standard evaluation board,
build eCos for the hardware with RAM startup. Provided the board is fitted
with CygMon ROMs, or GDB loader stub ROMs, you may connect to the target
board in GDB using the command
target
remote <devicename>
where <devicename>
will be a serial device such as com2
(Windows NT) or /dev/ttyS1
(Linux). Then load the code onto the target board by typing load.
After being downloaded, the program can be executed.
Note:
When using the remote target, GDB does not accept the
run
command. However, since downloading the program has the side effect of
setting the PC to the start address, you can start your program by typing
continue
(the letter c
works as a shortcut for the continue
command).
TX39-specific command-line
options
For the available generic debugger options, refer to
Debugging with GDB in GNUPro Debugging Tools. There
are no TX39 specific debugger command-line options.
Debugging programs with
multiple threads
Programs with multiple threads can be debugged using
either the graphic user interface to GDB, GDBTk or the GDB command line
interface. The following describes how to debug multiple threads using
the GDB command line.
In some operating systems, such as eCos, a single program
may have more than one thread of execution. The precise semantics of threads
differ from one operating system to another, but in general the threads
of a single program are akin to multiple processes, except that they share
one address space (that is, they can all examine and modify the same variables).
On the other hand, each thread has its own registers and execution stack,
and perhaps private memory.
GDB provides the following functions for debugging multi-thread
programs
-
thread threadno,
a command to switch among threads
-
info
threads, a command to inquire about existing
threads
-
thread
apply [threadno][all] args
, a command to apply a command to a list
of threads
-
thread-specific breakpoints
The GDB thread-debugging facility allows you to observe all
threads while your program runs, but whenever GDB takes control, one thread
in particular is always the focus of debugging. This thread is called the
current thread. Debugging commands show program information from the perspective
of the current thread.
For debugging purposes, GDB associates its own thread
number, always a single integer, with each thread in your program.
info threads
Display a summary of all threads currently in your program.
GDB displays for each thread (in the following order):
-
The thread number assigned by GDB.
-
The target systems thread I.D.
-
The current stack frame summary for that thread.
An asterisk *
to the left of the GDB thread number indicates the current thread. Use
the following example for clarity.
(gdb) info threads
* 2 thread 2 breakme
()
at /eCos/packages/kernel/v1_2_1/tests/thread_gdb.c:91
Name: controller,
State: running, Priority: 0, More: <none>
1 thread 1 Cyg_HardwareThread::thread_entry
(thread=0x1111aaa2)
at /eCos/packages/kernel/v1_2_1/src/common/thread.cxx:68
Name: Idle Thread,
State: running, Priority: 31, More: <none>
thread <threadno>
Make thread number <threadno>the
current thread. The command argument, <threadno>,
is the internal GDB thread number, as shown in the first field of the info
threads display. GDB responds by displaying
the system identifier of the thread you selected, and its current stack
frame summary, as in the following output.
(gdb) thread
2
[Switching to thread
2]
#0 change_state (id=0,
newstate=0 '\000')
at /eCos/kernel/current/tests/bin_sem2.cxx:93
93 if (PHILO_LOOPS
== state_changes++)
Current language:
auto; currently c++
thread apply [<threadno>][<all>]
<args>
The thread apply command allows you to apply a command
to one or more threads. Specify the numbers of the threads that you want
affected with the command argument <threadno>,
where <threadno>
is the internal GDB thread number, as shown in the first field of the info
threads display. To apply a command to all
threads, use thread apply
all args.
Whenever GDB stops your program, due to a breakpoint or a
signal, it automatically selects the thread where that breakpoint or signal
happened.
When your program has multiple threads, you can choose
whether to set breakpoints on all threads, or on a particular thread.
break <linespec>
thread <threadno>
If <linespec>
specifies source lines, then there are several ways of writing them. Use
the qualifier thread <threadno>
with a breakpoint command to specify that you only want GDB to stop the
program when a particular thread reaches this breakpoint. <threadno>
is one of the numeric thread identifiers assigned by GDB, shown in the
first column of the info threads display.
If you do not specify thread
<threadno> when you set a breakpoint,
the breakpoint applies to all threads of your program.
You can use the thread qualifier on conditional breakpoints
as well; in this case, place thread
<threadno> before the breakpoint
condition, as the following example shows.
(gdb) break
frik.c:13 thread 28 if bartab > lim
Whenever your program stops under GDB for any reason, all
threads of execution stop; not just the current thread. This allows you
to examine the overall state of the program, including switching between
threads, without worrying that things may change.
Conversely, whenever you restart the program, all threads
start executing. This is true even when single stepping with commands like
step
or next.
In particular, GDB cannot single-step all threads in lockstep. Since thread
scheduling is up to your debugging targets operating system (not controlled
by GDB), other threads may execute more than one statement while the current
thread completes a single step. In general other threads stop in the middle
of a statement, rather than at a clean statement boundary, when the program
stops.
You might even find your program stopped in another thread
after continuing or even single stepping. This happens whenever some other
thread runs into a breakpoint, a signal, or an exception before the first
thread completes whatever you requested.
SET SCHEDULER-LOCKING
For targets that support it, GDB has a new command that
helps to debug
multi-threaded programs. The set
scheduler-locking [on off step] command allows
the GDB user to exert some control over how threads are scheduled while
debugging.
Normally GDB does not attempt to interfere with thread
scheduling. This means that in the default mode (scheduler-locking
off), the current thread may be scheduled
out, and a different thread may begin running, at any time (as determined
by the native scheduler). For instance, you may give a GDB command such
as step
or finish,
and when the command completes, you may be looking at a different thread.
If you set the scheduler-locking mode to step,
then GDB will try to interfere with the native scheduler just enough to
prevent another thread from popping up while you debug. Other threads may
get to run sometimes, but whenever a command such as step
or finish
completes, you should be looking at the same thread that was running before
the command. Of course, if another thread gets to run and hits a breakpoint,
GDB will still switch you to that thread (so if you dont want that to
happen, then disable your breakpoints).
For even greater (and more intrusive) control over the
thread scheduler, GDB provides the mode scheduler-locking
on. In this mode, the native scheduler is
completely locked, and no thread may run except the current one. Obviously
this will radically change the behavior of your program, and may lead to
deadlock or other unpleasant consequences, so use it with caution.
Syntax:
set scheduler-locking
[off on step]
Set mode for locking scheduler during target execution.
off
No locking (threads may preempt at any time).
on
Full locking (no thread except the current thread may
run).
step
The scheduler is locked during every single-step operation.
In this mode, no other thread may run during a step command. However, other
threads may run while stepping over a function call (next).
Simulator
The GNUPro simulator allows execution of a program compiled
for the TX39 target CPU on any supported host computer. It includes a simulator
module for the target CPU instruction set, memory, and may also include
simulated peripheral devices such as serial I/O and timers. Altogether,
these features allow developers to test their TX39 programs, without need
for an actual board with that CPU.
The TX39 simulator is not designed to match timing characteristics
of its target board. For example, the CPU module uses a single clock cycle
for all instructions, its memory is infinitely fast, and its simulated
serial I/O is infinitely fast. Furthermore, a number of obscure or inapplicable
functions were omitted from the simulated peripherals. The simulator is
just complex and accurate enough to run eCos programs.
Features
The TX39 simulator includes support for 32, 32 bit general-purpose
registers.
The user program is provided with a single 32mb block
of memory at address 0xa0000000
(shadowed at address 0x80000000).
Simulator-specific
command line options
The following general options, are supported by the
simulator:
--board=BOARD
Specifies that the simulator be tailored model a specified
hardware board. For the tx39, the --board=jmr3904
option will add support for the peripherals of the JMR-TX3904A-50 evaluation
Board, including the tx3904 CPUs on-board interrupt controller, timers,
serial I/O modules. The boards actual RAM & ROM memory layouts are
matched by the simulator.
The tx39 simulator also supports --board=jmr3904pal,
a superset of the JMR TX3904 board simulation. This adds certain virtual
devices used by eCos programs that were configured with the --platform=sim
option.
--frequency <frequency>
By default, the simulator samples the running program
every 256 instructions. This option allows you to change this profiling
frequency to some other number. Smaller numbers increasing the accuracy
of the profile, but make the simulator run slightly slower. Also, because
the counters used in the profile are only 16 bits, a high sampling frequency
may cause the counters to overflow.
C:\> mips-tx39-elf-run
--profile --frequency 128 hello
Hello, world!
3 + 4 = 7
--help
Here is a list of the MIPS-specific options, as printed
by --help:
C:\> mips-tx39-elf-run
-help
Usage: run [options]
program [program args]
Options:
-l FILE, --log FILE
Log file
-n MODEL, --name
MODEL Select arch model
-p[on|off], --profile
[on|off]
Enable profiling
-t[on|off], --trace
[on|off]
Enable tracing
-z FILE, --tracefile
FILE Write trace to file
-y FREQ, --frequency
FREQ Profile frequency
-y SIZE, --samples
SIZE Profile sample size
--profile [on|off]
This option creates a file called gmon.out
that contains profiling information. This file can be used as input to
gprof,
the GNU profiler.
C:\> mips-tx39-elf-run
--trace hello
Hello, world!
3 + 4 = 7
--samples <size>
By default, the simulator uses a profiling sample size
of 131072 (128K). This option allows you to change the sample size. Increasing
the sample size will make the profile more accurate, but will also increase
the size of the profile output file (gmon.out).
The simulator rounds the sample size up the next power
of two.
C:\> mips-tx39-elf-run
--profile --samples 20000 hello
Hello, world!
3 + 4 = 7
--sockser-addr=HOSTNAME:PORT
Specifies that the simulation of the primary serial
I/O peripherals should send data to and from a TCP/IP socket rather than
to and from the simulator console. The TCP/IP sockets listening address
is specified by the argument. HOSTNAME should refer to an IP address of
the host, and PORT should be an unused port number between 1024 and 65535.
You may use any terminal program that connects to TCP/IP sockets, such
as telnet, kermit, or socket, to interact directly with the simulated program.
You can also use gdbs target
remote HOSTNAME:PORT command to connect, if
the simulator is running a program equipped with a gdb stub.
--trace=[on|off]
This creates a file called trace.din
that contains tracing information. Use the --tracefile
switch (discussed below) to change the name of the output file.
C:\> mips-tx39-elf-run
--trace hello
Hello, world!
3 + 4 = 7
Here are the first 10 lines of the file produced by the
above run:
2 a0040004 ; width
4 ; load instruction
2 a0040008 ; width
4 ; load instruc