Ignore:
Timestamp:
Jun 17, 2013, 7:10:20 PM (11 years ago)
Author:
porquet
Message:

boot_tsar: bug fix and more debug

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/softs/tsar_boot/src/boot_elf_loader.c

    r388 r412  
    3737    unsigned int i;
    3838    unsigned int segment_req;
    39    
     39
    4040    /*
    4141     * Loader state machine definition
    42      */ 
     42     */
    4343    enum
    4444    {
     
    4848        ELF_SEGMENT_STATE,
    4949        ELF_END_STATE
    50     } init_state;
     50    } init_state
     51#if (BOOT_DEBUG ==1)
     52    , init_state_debug
     53#endif
     54        ;
     55
     56#if (BOOT_DEBUG == 1)
     57    char* init_state_str[] = {
     58        "ELF_HEADER_STATE",
     59        "ELF_PROGRAM_HEADER_STATE",
     60        "ELF_OFFSET_STATE",
     61        "ELF_SEGMENT_STATE",
     62        "ELF_END_STATE"
     63    };
     64#endif
     65
    5166
    5267    boot_puts("Starting boot_elf_loader function...\n\r");
     
    6378
    6479    init_state         = ELF_HEADER_STATE;
     80#if (BOOT_DEBUG == 1)
     81    init_state_debug   = ELF_END_STATE;
     82#endif
    6583
    6684    while(init_state != ELF_END_STATE)
     
    88106        offset  +=  nb_read;
    89107
     108#if (BOOT_DEBUG == 1)
     109        if (init_state != init_state_debug)
     110        {
     111            boot_puts("init_state = ");
     112            boot_puts(init_state_str[init_state]);
     113            boot_puts("\n");
     114            init_state_debug = init_state;
     115        }
     116#endif
     117
    90118        switch(init_state)
    91119        {
     
    113141                            "Input file does not use ELF format"
    114142                            "\n"
    115                         ); 
     143                        );
    116144
    117145                        boot_exit();
    118146                    }
    119147
    120                     /* 
     148                    /*
    121149                     * Verification of Program Headers table size. It must be
    122                      * smaller than the work size allocated for the 
     150                     * smaller than the work size allocated for the
    123151                     * elf_pht[PHDR_ARRAY_SIZE] array
    124152                     **/
     
    142170            /**
    143171             * Reading ELF program headers
    144              */ 
     172             */
    145173            case ELF_PROGRAM_HEADER_STATE:
    146174                boot_memcpy(elf_pht_ptr, buffer_ptr, nb_read);
     
    160188                        if(elf_pht_ptr[pseg].p_type == PT_LOAD)
    161189                        {
    162                             nb_rest = elf_pht_ptr[pseg].p_offset - offset;
     190#if (BOOT_DEBUG == 1)
     191                            boot_puts("found a loadable segment:\n");
     192                            boot_puts("- type   : "); boot_putx(elf_pht_ptr[pseg].p_type);    boot_puts("\n");
     193                            boot_puts("- offset : "); boot_putx(elf_pht_ptr[pseg].p_offset);  boot_puts("\n");
     194                            boot_puts("- vaddr  : "); boot_putx(elf_pht_ptr[pseg].p_vaddr);   boot_puts("\n");
     195                            boot_puts("- paddr  : "); boot_putx(elf_pht_ptr[pseg].p_paddr);   boot_puts("\n");
     196                            boot_puts("- filesz : "); boot_putx(elf_pht_ptr[pseg].p_filesz);  boot_puts("\n");
     197                            boot_puts("- memsz  : "); boot_putx(elf_pht_ptr[pseg].p_memsz);   boot_puts("\n");
     198                            boot_puts("- flags  : "); boot_putx(elf_pht_ptr[pseg].p_flags);   boot_puts("\n");
     199                            boot_puts("- align  : "); boot_putx(elf_pht_ptr[pseg].p_align);   boot_puts("\n");
     200#endif
     201                            if (elf_pht_ptr[pseg].p_offset < offset)
     202                            {
     203                                /* case where the segment to load includes the elf and program headers */
     204                                nb_rest = elf_pht_ptr[pseg].p_filesz - offset;
     205                                init_state = ELF_SEGMENT_STATE;
     206                            }
     207                            else
     208                            {
     209                                /* segment to load is further away in memory */
     210                                nb_rest = elf_pht_ptr[pseg].p_offset - offset;
     211                                init_state = ELF_OFFSET_STATE;
     212                            }
    163213                            break;
    164214                        }
    165215                    }
    166216
    167                     init_state = ELF_OFFSET_STATE;
     217                    if (pseg == elf_header_ptr->e_phnum)
     218                    {
     219                        boot_puts(
     220                            "ERROR: "
     221                            "No PT_LOAD found"
     222                            "\n"
     223                        );
     224                        boot_exit();
     225                    }
     226
    168227                }
    169228
     
    191250                 * Copying ELF segment data in memory segments using the virtual
    192251                 * address got from the ELF file
    193                  */ 
     252                 */
    194253                segment_req = ((elf_pht_ptr[pseg].p_vaddr & 0xBFC00000) != 0xBFC00000);
    195254
     
    201260                                nb_read);
    202261                }
    203    
     262
    204263                nb_rest -= nb_read;
    205264
     
    237296                    /*
    238297                     * Program loading finished
    239                      */ 
     298                     */
    240299                    if(pseg == elf_header_ptr->e_phnum)
    241300                    {
Note: See TracChangeset for help on using the changeset viewer.