This is the mail archive of the crossgcc@sourceware.cygnus.com mailing list for the crossgcc project.

See the CrossGCC FAQ for lots more infromation.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

RE: Problem with the stack on m68k


You're getting an F-line trap. In other words, you are trying to execute an
illegal opcode which has the value $Fxxx. Have a look at the opcode that the
PC is pointing to (location $00033acc). Then you can check the linker map
file to find out what function (if any) corresponds to this location, and
you should then be able to figure out where it came from and what to do
about it.

From what I can tell here, you're linking the correct set of libraries.
However, if you are using any of the 'libgloss' IDP I/O routines supplied by
Cygnus (for example: inbyte(), outbyte(), etc) be aware that (at least in
newlib-1.8.0) there was an error in libgloss/m68k/Makefile.in which caused
these routines to be compiled for the 68020 instruction set for all targets.
This may be the source of the illegal opcodes when you link for a 68000
target. To fix it, remove the command lines associated with these files in
Makefile.in and re-build libgloss.

As far as the bus errors are concerned, my guess is that somehow the a0
register is getting loaded with an invalid address (it might be an odd
value, or it might point to an unimplemented memory address), and the
processor is getting a bus error when it tries to read from that location.
You didn't show the register dump from the bus error, so it's kind of hard
to tell from here.

Your linker script and makefile look reasonable. One thing confused me, why
do you specify __DYNAMIC=1 in the script? This should probably be omitted
for most embedded applications.

Scott

-----Original Message-----
From: crossgcc-owner@sourceware.cygnus.com
[mailto:crossgcc-owner@sourceware.cygnus.com]On Behalf Of Aklilu Noah
Sent: Wednesday, May 17, 2000 4:57 PM
To: crossgcc@sourceware.cygnus.com
Subject: Re: Problem with the stack on m68k



Thanks Peter and Scott for your responses.  So that
takes care of the calling procedure.  But I am still
get bus errors and an strange exception that I don't
recognize:

F-Line
Vector = B      True A7 = FFCF0 True SR = 2700

PC   =$00033ACC   SR   =$00002700   USP  =$00001B00
SSP  =$000FFCF8
D0   =$FFFFFFFF   D1   =$00000007   D2   =$000409B1   D3   =$00000008
D4   =$00000008   D5   =$00000009   D6   =$00000001   D7   =$0003646E

A0   =$000FFF1A   A1   =$000FFF18   A2   =$000409B3   A3   =$000FFF30
A4   =$000FFF60   A5   =$00000008   A6   =$000FFD04   A7   =$000

The monitor on the board is derived from the now old FBug68 v. 1.1 (circa
1990).  The errors seem to linked to values in the variable
space of the function (main in this case), for example the sequence
would be

87 0162 206E FFFC 		move.l -4(%a6),%a0
88 0166 2D50 FFE8 		move.l (%a0),-24(%a6)

the bus error would occur with the second instruction.

I wondering if the way I am linking the libraries in is incorrect.
The way I am trying to do it, is have it use the gizmo.ld linker
script in the current directory as well as the crt0.o in the
current directory.  I tried to use gcc to do everything like
this :

CFLAGS = -mc68000 -msoft-float -malign-int -Wall -DDEBUG
CC = m68k-coff-gcc
AR = m68k-coff-ar

LIBS =


testcram.s19 : testcram.o crt0.o rotate.o
        ${CC} ${CFLAGS} testcram.o rotate.o -nodefaultlibs -nostartfiles
-Wl,-Tgizmo.ld -Wl,-M -Wl,-otestcram.s19

But the executable it generated would not run.

This is what my current makefile looks like:

CFLAGS = -m68000 -mno-align-int -Wall -Wa,-alh,-L -fstack-check

CC = m68k-coff-gcc
AR = m68k-coff-ar

LIBS = -lgizmo -lgcc -lc

testcram.s19 : testcram.o crt0.o
	m68k-coff-ld testcram.o -L/usr/local/m68k-coff/lib/m68000
-L/usr/local/lib/gcc-lib/m68k-coff/2.95.2/m68000 -M -Tgizmo.ld
-otestcram.s19

and my linker script looks like

STARTUP(crt0.o)
OUTPUT_ARCH(m68k)
OUTPUT_FORMAT(srec)

SEARCH_DIR(.)
GROUP(-lgizmo -lc -lgcc)
__DYNAMIC  =  1;

/*
 * Setup the memory map of the M68332BCC Business Card Computer.
 * stack grows down from high memory.
 *
 * The memory map look like this:
 * +--------------------+ <- low memory
 * | .text              |
 * |        _etext      |
 * |        ctor list   | the ctor and dtor lists are for
 * |        dtor list   | C++ support
 * +--------------------+
 * | .data              | initialized data goes here
 * |        _edata      |
 * +--------------------+
 * | .bss               |
 * |        __bss_start | start of bss, cleared by crt0
 * |        _end        | start of heap, used by sbrk()
 * +--------------------+
 * .                    .
 * .                    .
 * .                    .
 * |        __stack     | top of stack
 * +--------------------+
 */
MEMORY
{
  ram (rwx) : ORIGIN = 0x30000, LENGTH = 1M - 0x30000
}

/*
 * allocate the stack to be at the top of memory, since the stack
 * grows down
 */

PROVIDE (__stack = 1M);

/*
 * Initalize some symbols to be zero so we can reference them in the
 * crt0 without core dumping. These functions are all optional, but
 * we do this so we can have our crt0 always use them if they exist.
 * This is so BSPs work better when using the crt0 installed with gcc.
 * We have to initalize them twice, so we cover a.out (which prepends
 * an underscore) and coff object file formats.
 */
PROVIDE (hardware_init_hook = 0);
PROVIDE (_hardware_init_hook = 0);
PROVIDE (software_init_hook = 0);
PROVIDE (_software_init_hook = 0);
/*
 * stick everything in ram (of course)
 */
SECTIONS
{
  .text :
  {
    *(.text)
    . = ALIGN(0x4);
     __CTOR_LIST__ = .;
    ___CTOR_LIST__ = .;
    LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2)
    *(.ctors)
    LONG(0)
    __CTOR_END__ = .;
    __DTOR_LIST__ = .;
   ___DTOR_LIST__ = .;
    LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2)
    *(.dtors)
     LONG(0)
    __DTOR_END__ = .;
    *(.rodata)
    *(.gcc_except_table)

    __INIT_SECTION__ = . ;
    LONG (0x4e560000)	/* linkw %fp,#0 */
    *(.init)
    SHORT (0x4e5e)	/* unlk %fp */
    SHORT (0x4e75)	/* rts */

    __FINI_SECTION__ = . ;
    LONG (0x4e560000)	/* linkw %fp,#0 */
    *(.fini)
    SHORT (0x4e5e)	/* unlk %fp */
    SHORT (0x4e75)	/* rts */

    _etext = .;
    *(.lit)
  } > ram

  .data :
  {
    *(.shdata)
    *(.data)
    _edata = .;
  } > ram

  .bss :
  {
    . = ALIGN(0x4);
    __bss_start = . ;
    *(.shbss)
    *(.bss)
    *(COMMON)
    _end =  ALIGN (0x8);
    __end = _end;
  } > ram

  .stab 0 (NOLOAD) :
  {
    *(.stab)
  }

  .stabstr 0 (NOLOAD) :
  {
    *(.stabstr)
  }
}


Noah Aklilu
aklilu@nyquist.ee.ualberta.ca
http://www.ee.ualberta.ca/~aklilu/
"Integrity is something you do when no one is looking"





------
Want more information?  See the CrossGCC FAQ, http://www.objsw.com/CrossGCC/
Want to unsubscribe? Send a note to
crossgcc-unsubscribe@sourceware.cygnus.com



------
Want more information?  See the CrossGCC FAQ, http://www.objsw.com/CrossGCC/
Want to unsubscribe? Send a note to crossgcc-unsubscribe@sourceware.cygnus.com


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]