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
orba
; 26 bit range) to some boot code is loaded here- The Xilinx example branches to in block RAM (
bram
) at0xffffff00
- The RTEMS example branches to
download_entry
(but I'm not sure how)
- The Xilinx example branches to in block RAM (
- 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
- Probably not as the corresponding
- A branch instruction (either
dlEntry.s
This portion 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
- Other names are
- 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 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 ( overwrites r2?)
- Set up initial stack
- Set up argument registers r3, r4 and r5
- Branch to
boot_card()
boot_card()
- 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?
- Thread with entry point
- Call
bsp_cleanup()
- Return to start code
- Not clear what's in the
lr
at this point, i.e., where do we return to?
- Not clear what's in the
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
bsp_timer_average_overhead
bsp_timer_least_valid
- Rate of timer source for
- 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
forstdin
,stdout
andstderr
, if it exists - Call
app_bsp_postdriver_hook()
- Call
bsp_cleanup()
- Call
app_bsp_cleanup()
- Call
RCE BSP
app_bsp_start()
- Replace the character output function with one that writes to the
syslog
- Replace the character output function with one that writes to the
app_bsp_pretasking_hook()
- Initialize
RceDebug
- Initialize ~claus:
RcePic
- Initialize
app_bsp_predriver_hook()
- Initialize ~claus:
RceEthernet
- Initialize ~claus:
RceBsdnet
- Initialize ~claus:
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
- Set up a vector of ECDs
- Set up a vector of FLBs
- Set up a vector of PIBs
- 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
- Launch ~claus:
init_executive()
thread - Delete the
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
- Other possibilities exist, but generally, this will be one of the
- Announce what's running
- Configure the network from DHCP
- Set up the dynamic linker
[~claus:Start the shell]
[~claus: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