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

Compare with Current View Page History

« Previous Version 26 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 ramge) 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 written for the PPC 440 found in Xilinx Virtex 5 parts.

  • 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) r2 overwritten?)
  • Set up initial stack
  • Set up argument registers r3, r4 and r5
  • Branch to boot_card()

boot_card()

  • Command line is in first argument
  • Disable interrupts
  • Store command line
  • Call bsp_start()
  • Determine RTEMS work area and heap
  • Initialize RTEMS data structures
  • Initialize the C library
  • Call bsp_pretasking_hook()
  • Optional: 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 PEBs (question)
    • Set up ECDs (question)
    • Set up FLBs (question)
    • Set up PIBs (question)
    • Install a BOOKE Critical exception handler
    • Install an External Interrupt handler
RceEthernet
  • Create an empty linked list of ethernet drivers
RceBsdnet
  • Cretae an 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 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