You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 39 Next »

Note that in this description, time advances down along the page.

Bear in mind as well that this description applies to the Gen 1 design.

Items in square brackets ([]) are optional.

Initial instruction

  • Execution after reset starts at 0xfffffffc
    • A branch instruction (either b or ba; 26 bit range) to some boot code is loaded here
      • The Xilinx example branches to in block RAM (bram) at 0xffffff00
      • The RTEMS example branches to download_entry (but I'm not sure how)
    • Potentially a sc (system call) instruction could be loaded here? Any advantage to this?
      • Probably not as the corresponding ivor register (PPC 440) is not loaded yet
      • The PPC 405 doesn't have ivor registers, so it would continue executing at the system call vector

dlEntry.s

This is considered part of an RTEMS BSP. What's written here is written for the PPC 440 found in Xilinx Virtex 5 parts. The Virtex 4 version is similar.

  • In our case, the boot code starts at startup
    • Other names are start, download_entry and __rtems_entry_point
  • Boot code vaguely follows the "Initialization Software Requirements" outlined in the PowerPPC 440x5 Embedded Processor Core User's Manual v7.1 from IBM
    • Why only "vaguely"?
  • Clear MSR
  • Disable debug events
  • Configure instruction and data cache registers
  • Set up decrementer and timer registers
  • Clear exception registers ECR and XER
  • Invalidate instruction and data caches
  • Clear the CPU reservation bit
  • Set up CCR0, CCR1, MMUCR, CRF (question) and CTR
  • Set up TLB pages
  • Set up debug events
  • Set up EABI and SYSV environment
  • Clear out BSS section
  • Load vector offset register
  • Set up TOC ((question) overwrites r2?)
  • Set up initial stack
  • Set up argument registers r3, r4 and r5
  • Branch to boot_card()

boot_card()

While the RTEMS structure provides for allowing this function to be supplied by the RTEMS BSP, we use the version that the distribution comes with. It is found in the $RTEMS_ROOT/src/c/src/lib/libbsp/shared directory called bootcard.c.

In the following, functions prefixed with bsp_ are supplied by the RTEMS BSP.

  • Command line is in first argument
    • In our system this is always a null pointer
  • Disable interrupts
  • Store command line
  • Call bsp_start()
  • Determine RTEMS work area and heap location and size
  • Initialize RTEMS data structures
  • Initialize the C library
    • This also installs the heap
  • Call bsp_pretasking_hook()
  • [Enable RTEMS debugging capabilities]

  • RTEMS initialization before loading device drivers
  • Call bsp_predriver_hook()
  • Initialize device drivers
  • Call bsp_postdriver_hook()
  • Start multitasking
    • Thread with entry point Init runs
    • Not clear how this returns. Perhaps when the last task is deleted?
  • Call bsp_cleanup()
  • Return to start code
    • Not clear what's in the lr at this point, i.e., where do we return to?

RTEMS BSP

  • bsp_start()
    • Set up default character output function
    • Get CPU type and revision cached
    • Initialize device driver parameters
      • Rate of timer source for clock.c
      • bsp_timer_internal_clock (question)
      • bsp_timer_average_overhead (question)
      • bsp_timer_least_valid (question)
    • Initialize default raw exception handlers
    • Call app_bsp_start()
  • bsp_pretasking_hook()
  • bsp_predriver_hook()
  • bsp_postdriver_hook()
    • Call rtems_libio_supp_helper() to open /dev/console for stdin, stdout and stderr, if it exists
    • Call app_bsp_postdriver_hook()
  • bsp_cleanup()

RCE BSP

  • app_bsp_start()
    • Replace the character output function with one that writes to the syslog
  • app_bsp_pretasking_hook()
  • app_bsp_predriver_hook()
  • app_bsp_postdriver_hook()
  • app_bsp_cleanup()
RceDebug
  • Set up an RTEMS extension that creates and manages the syslog
RcePic
  • Set up a single PIC Manager
    • Set up a vector of PEBs (question)
    • Set up a vector of ECDs (question)
    • Set up a vector of FLBs (question)
    • Set up a vector of PIBs (question)
    • Install a BOOK-E Critical exception handler
    • Install an External Interrupt handler
RceEthernet
  • Create a single empty linked list of Ethernet drivers
RceBsdnet
  • Create a single empty linked list of Ethernet handlers

Init task

init_executive()

  • This forms the intent of the loaded executable
    • Other possibilities exist, but generally, this will be one of the core executables
  • Announce what's running
  • Configure the network from DHCP
  • Set up the dynamic linker
  • [Start the shell]

  • [Start the debugger daemon (gdb stub)]

  • Create a Task
  • Determine what the Task should run
    • Read metadata from flash
    • Read the front panel rotary switch
  • Dynamically link the code
  • Run the Task
  • No labels