...
- 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
(Part of RTEMS BSP)
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()
(RTEMS proper)
- 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()
Wiki Markup \[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
...