This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[C6713] why does my boot-load branch instruction NOT contain an absolute address to _boot_2 ??

I am struggling with the boot-load code of a custom target.  Here is the first level bootload assembly code, after being processed by the hex6x (binary option, -b) and the absolute lister, abs6x:

       5                    * First-level boot-loader, boot_1.asm
       6                    *   This is patterned after a RESET IST entry, as all
       7                    *   it does is branch to the 2nd-level bootloader, boot_2
       8                    *------------------------------------------------------------------------------
       9                    * Global symbols
      10                       .global _boot_1
      11                   
      12                    *------------------------------------------------------------------------------
      13                    * Global symbols referenced in this file, defined elsewhere
      14                       .ref _boot_2
      15                   
      16                    *------------------------------------------------------------------------------
      17 00000000            .sect ".text:boot_1"     
      18                     .align 32
      19                   
      20 00000000           _boot1:
      21 00000000 003C30F6      STW   B0,*--B15
      22 00000004 0000002A!     MVKL  _boot_2,B0
      23 00000008 0000006A!     MVKH  _boot_2,B0
      24 0000000c 00000362      B     B0
      25 00000010 003C36E6      LDW   *B15++,B0
      26 00000014 00002000      NOP   2
      27 00000018 00000000      NOP  
      28 0000001c 00000000      NOP  
      29                    *------------------------------------------------------------------------------

No Assembly Errors, No Assembly Warnings

Here are the first few lines of the boot_2 assembly code, also after being assembled, linked (coff), hex6x with -b (binary) option, and run through abs6x:

 A    23                            .asg    A15, FP
 A    24                            .asg    B14, DP
 A    25                            .asg    B15, SP
 A    26                            .global $bss
 A    27                   
 A    28                    ;       .file   "N:\h2o\src\Projects\DSP\SPAM_5G\boot_5g.asm"
 A    29                   
 A    30 90000400                   .sect ".text:boot_2"
 A    31                    ;       .clink  ; don't use this !! It kills link of un-referenced code !!!
 A    32                            .global _boot_2
 A    33                            .ref _c_int00
 A    34                    ;       .sym    _boot_2,_boot_2, 32, 2, 0
 A    35                    ;       .func   24
 A    36                    ;----------------------------------------------------------------------
 A    37                    ;  24 | void boot_2(void)                                                    
 A    38                    ;----------------------------------------------------------------------
 A    39                   
 A    40                    ;******************************************************************************
 A    41                    ;* FUNCTION NAME: boot_5g                                                     *
 A    42                    ;*                                                                            *
 A    43                    ;*   Regs Used         : A
 A    44                    ;*                       B
 A    45                    ;*   Local Frame Size  :
 A    46                    ;******************************************************************************
 A    47 90000400           _boot_2:
 A    48                    ;** --------------------------------------------------------------------------*
 A    49                    ;       .sym    _i,4, 4, 1, 32
 A    50                    ;       .sym    _wt,$C$L1, 0, 6
 A    51                   
 A    52                            ;; spin loop so the debugger/emulator can attach
 A    53 90000400 008008C2                 zero B1
 A    54 90000404 50000092  _spin:     [!B1] B _spin
 A    55 90000408 00008000                 nop 5
 A    56 9000040c 00000000  _spin_end: nop
 A    57                           
 A    58                    ;  27 |   // Initialize FPGA registers.                                       
 A    59                    ;----------------------------------------------------------------------
 A    60                    ;  28 | *(int *)0xA0040020 = 0x0;        // *START_MEAS = 0x0;     // stop the measurement
 A    61                    ;----------------------------------------------------------------------
 A    62 90000410 0280102A             MVKL    .S2     0xa0040020,B5
 A    63 90000414 02D0026B             MVKH    .S2     0xa0040020,B5
 A    64 90000418 020000FA  ||         ZERO    .L2     B4                ; |28|
 A    65 9000041c 021402F6             STW     .D2T2   B4,*B5            ; |28|
 A    66 90000420 00002000             NOP             2

All sources were compiled/assembled with the following compiler/assemble options and map file, from my Rational OMAKE file.  Note that I suspected the near-far option might have been the culprit, so set the "far" memory model, but it did not result in a "correct" absolute address for the branch to _boot_2:

DBG_REL = --symdebug:coff -d"_RELEASE"

CFLAGS  = $(DBG_REL) -k -ss -px  \
              -pdf -pdsw225 -al      \
              -pdv -pden -mv6710     \
              --mem_model:data=far   \
              -fr$(OBJ_DIR)          \
              -fs$(ASM_DIR)          \
              -ft$(TMP_DIR)          \
              -fb$(ABS_DIR)          \
              -ff$(LST_DIR)          \
              -d$(SPAM_TYPE)         \
              -i$(PROJ_DIR) -i$(DSP_COMMON_DIR) \
              -i$(TMP_DIR)  -i$(OBJ_DIR) \
              -i$(INCLUDE)  -i$(INCLUDE)\include

 

Linker flags/options:

LNKFLAGS = -z -a -c -w -x     \
           --rom_model  -stack 0x400                   \
           -i$(TI_DIR)\lib -i $(INCLUDE)\csl\include   \
           -i$(TI_DIR)\include \
           -i$(ASM_DIR) -i$(OBJ_DIR)                   \
           -m$(MAP_FILE) -l$(LNK_LIBS)

Linker command file:

MEMORY
{                                                                        /* 6713 Memory notes             */
   BOOT1:        origin = 0x000000    len = 0x400     /* level 1 boot code (branch)    */
   INT_VEC:      origin = 0x00000400, len = 0x400    /* relocated interrupt table     */
   L2_RAM:       origin = 0x000800    len = 0x2F800  /* fast on-chip SRAM, 195k       */
   L2_4WAY:     origin = 0x030000    len = 0x10000  /* 4-way cache, 64k -- STAY OUT  */

   CE1_BOOT1:   origin = 0x90000000  len = 0x400    /* level 1 boot, remapped to 0x0 */
   CE1_BOOT2:   origin = 0x90000400  len = 0x400    /* level 2 boot, shared mem      */
   CE1_IVT:        origin = 0x90000800  len = 0x400    /* interrupt table, shared mem   */
   CE1_SRAM:    origin = 0x90000C00, len = 0x3F400  /* slow external SRAM, 259.1k    */
}

SECTIONS
{
   .text:boot_1:    load=CE1_BOOT1, run = BOOT1 

   .text:boot_2:    >CE1_BOOT2                      /* emu will not execute this code*/
   .text:IVT:       > CE1_IVT                       /* slower, but no copy required  */

       .text:       > CE1_SRAM                      /* pgm code NOT boot-loader      */
      .const:       > CE1_SRAM                      /* constants                     */
      .cinit:       > CE1_SRAM                      /* global c-runtime init         */
       .data:       > CE1_SRAM
      .stack:       > L2_RAM 
        .bss:       > L2_RAM
        .far:       > L2_RAM                        /* 6713 compiler artifact        */
        .cio:       > L2_RAM                        /* 6713 compiler artifact        */
     .ppdata:       > CE1_SRAM                      /* 6713 compiler artifact        */

 

My questions: 

1.  What is the meaning of the exclamation point following the opcodes 0000002a, and 0000006a ??

2.  The absolute listing shows that boot_2 is located at 0x900000400, so I expected to see the low/high portions of that address, NOT 0x2a and 0x6a:  what am I doing wroing?

3.  Any suggestions, or problems you can detect, based on the information provided?

  • What device are you using?

    dsp_5g said:

    1.  What is the meaning of the exclamation point following the opcodes 0000002a, and 0000006a ??

    It means that the symbol is from an external module (i.e. a different file).  Once the file gets linked that number gets replaced with the real address.  This is documented in the Assembly Language Tools User's Guide (spru186q), Section 2.4 Relocation.  Did you not link that code?

    dsp_5g said:

    2.  The absolute listing shows that boot_2 is located at 0x900000400, so I expected to see the low/high portions of that address, NOT 0x2a and 0x6a:  what am I doing wroing?

    It looks like this has not been linked.  I assume if you looked at this in the disassembly window that you would see the correct addresses.

    dsp_5g said:

    3.  Any suggestions, or problems you can detect, based on the information provided?

    I don't know what device you're using so it's difficult to give good advice.  Looking at your code I assume boot_1 is the first thing to run after reset.  That being the case the B15 register would not be initialized so you should not be storing anything to this address at reset.  I would just delete that instruction altogether (if I've interpreted things correctly).

    Brad

     

  • Brad, thanks for your reply: my device is a C6713B, but my problem was a failure to read another manual :-(  The target location, _boot_2, was 0x90000400, and the CPU and Instruction Set manual clearly states the the MVKL, MVKH instructions each embed 16bits of address into the opcode, shifted 7-bits.  When I decoded the absolute listing output, the high address was 9000, and the low address was 0400.  Thus, the failure of the bootloader to properly execute ... lies elsewhere.

    I have found help with _every_ post so far.... I am impressed with the utility of this community, and I appreciate the pointer to the relocation section of the assembler document.

    Again, thanks, and I will be more careful to include chip info and/or use enough tags to establish context for questions posted here.

  • Hi,

    I'm glad I could help.  Thanks for the feedback. 

    So did you figure out the issue?  I wasn't clear if it was working yet or not. 

    Cheers,
    Brad