Difference between revisions of "Unit PlatformARMv6"
Line 38: | Line 38: | ||
! '''Note''' | ! '''Note''' | ||
| None documented | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | |||
+ | '''ARMv6 platform functions''' | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure ARMv6CPUInit; assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure ARMv6FPUInit; assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure ARMv6MMUInit;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure ARMv6CacheInit; assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure ARMv6PageTableInit;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Initialize the Hardware Page Tables before enabling the MMU</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | See page 6-36 of the ARM1176JZF-S Technical Reference Manual | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure ARMv6SystemCall(Number:LongWord; Param1,Param2,Param3:PtrUInt); assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function ARMv6CPUGetMode:LongWord; assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function ARMv6CPUGetState:LongWord; assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function ARMv6CPUGetMainID:LongWord; assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function ARMv6CPUGetModel:LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function ARMv6CPUGetRevision:LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function ARMv6CPUGetDescription:String;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function ARMv6FPUGetState:LongWord; assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function ARMv6L1CacheGetType:LongWord; assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function ARMv6L1DataCacheGetSize:LongWord; assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function ARMv6L1DataCacheGetLineSize:LongWord; assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function ARMv6L1InstructionCacheGetSize:LongWord; assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function ARMv6L1InstructionCacheGetLineSize:LongWord; assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure ARMv6Halt; assembler; nostackframe; public name'_haltproc';</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' The purpose of the Wait For Interrupt operation is to put the processor in to a low power state</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | See Standby mode on page 10-3 of the ARM1176JZF-S Revision: r0p7 Technical Reference Manual | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure ARMv6Pause; assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' The purpose of the Wait For Interrupt operation is to put the processor in to a low power state</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | See Standby mode on page 10-3 of the ARM1176JZF-S Revision: r0p7 Technical Reference Manual | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure ARMv6WaitForEvent; assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Wait For Event not available in ARMv6, do a Wait For Interrupt instead</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure ARMv6WaitForInterrupt; assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' The purpose of the Wait For Interrupt operation is to put the processor in to a low power state</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | See Standby mode on page 10-3 of the ARM1176JZF-S Revision: r0p7 Technical Reference Manual | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure ARMv6DataMemoryBarrier; assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Perform a data memory barrier operation using the c7 (Cache Operations) register of system control coprocessor CP15</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | See page 3-74 of the ARM1176JZF-S Technical Reference Manual | ||
+ | Note that this is also available in the FPC RTL as ReadBarrier/WriteBarrier See: \source\rtl\arm\arm.inc | ||
+ | <br />Implementation is exactly the same for either. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure ARMv6DataSynchronizationBarrier; assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Perform a data synchronization barrier operation using the c7 (Cache Operations) register of system control coprocessor CP15</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | See page 3-74 of the ARM1176JZF-S Technical Reference Manual | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure ARMv6InstructionMemoryBarrier; assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Perform a Flush Prefetch Buffer operation</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | The ARM1176JZF-S Technical Reference Manual states on page 5-10 (section 5.5) that a Flush Prefetch Buffer operation also acts as an IMB | ||
+ | See page 3-79 of the ARM1176JZF-S Technical Reference Manual | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure ARMv6InvalidateTLB; assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Perform an invalidate entire TLB (Unlocked/Unified) operation using the c8 (TLB Operations) register of system control coprocessor CP15</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | See page 3-86 of the ARM1176JZF-S Technical Reference Manual | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure ARMv6InvalidateDataTLB; assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Perform an invalidate data TLB (Unlocked/Data) operation using the c8 (TLB Operations) register of system control coprocessor CP15</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | See page 3-86 of the ARM1176JZF-S Technical Reference Manual | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure ARMv6InvalidateInstructionTLB; assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Perform an invalidate instruction TLB (Unlocked/Instruction) operation using the c8 (TLB Operations) register of system control coprocessor CP15</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | See page 3-86 of the ARM1176JZF-S Technical Reference Manual | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure ARMv6InvalidateCache; assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Perform an invalidate both caches operation using the c7 (Cache Operations) register of system control coprocessor CP15</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | See page 3-74 of the ARM1176JZF-S Technical Reference Manual | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure ARMv6CleanDataCache; assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Perform a clean entire data cache operation using the c7 (Cache Operations) register of system control coprocessor CP15</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | See page 3-74 of the ARM1176JZF-S Technical Reference Manual | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure ARMv6InvalidateDataCache; assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Perform an invalidate entire data cache operation using the c7 (Cache Operations) register of system control coprocessor CP15</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | See page 3-74 of the ARM1176JZF-S Technical Reference Manual | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure ARMv6CleanAndInvalidateDataCache; assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Perform a clean and invalidate entire data cache operation using the c7 (Cache Operations) register of system control coprocessor CP15</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | See page 3-74 of the ARM1176JZF-S Technical Reference Manual | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure ARMv6InvalidateInstructionCache; assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Perform an invalidate entire instruction cache operation using the c7 (Cache Operations) register of system control coprocessor CP15</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | See page 3-74 of the ARM1176JZF-S Technical Reference Manual | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure ARMv6CleanDataCacheRange(Address,Size:LongWord); assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Perform a clean data cache range operation</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | See page 3-71 / 3-76 of the ARM1176JZF-S Technical Reference Manual | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure ARMv6InvalidateDataCacheRange(Address,Size:LongWord); assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Perform an invalidate data cache range operation</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | See page 3-71 / 3-76 of the ARM1176JZF-S Technical Reference Manual | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure ARMv6CleanAndInvalidateDataCacheRange(Address,Size:LongWord); assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Perform a clean and invalidate data cache range operation</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | See page 3-71 / 3-76 of the ARM1176JZF-S Technical Reference Manual | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure ARMv6InvalidateInstructionCacheRange(Address,Size:LongWord); assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Perform an invalidate instruction cache range operation</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | See page 3-71 / 3-76 of the ARM1176JZF-S Technical Reference Manual | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure ARMv6FlushPrefetchBuffer; assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Perform a Flush Prefetch Buffer operation</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | See page 3-79 of the ARM1176JZF-S Technical Reference Manual | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure ARMv6FlushBranchTargetCache; assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Perform a Flush Entire Branch Target Cache</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | See page 3-79 of the ARM1176JZF-S Technical Reference Manual | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure ARMv6ContextSwitch(OldStack,NewStack:Pointer; NewThread:TThreadHandle); assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Perform a context switch from one thread to another as a result of a thread yielding, sleeping or waiting</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''OldStack''' | ||
+ | | The address to save the stack pointer to for the current thread (Passed in r0) | ||
+ | |- | ||
+ | ! '''NewThread''' | ||
+ | | The address to restore the stack pointer from for the new thread (Passed in r1) | ||
+ | |- | ||
+ | ! '''NewThread''' | ||
+ | | The handle of the new thread to switch to (Passed in r2) | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | At the point of the actual context switch (str sp / ldr sp) the thread stacks will look like this: | ||
+ | <br /> | ||
+ | <br />(See: ARMv6ThreadSetupStack for additional information) | ||
+ | <br /> | ||
+ | <br />(Base "Highest Address" of Stack) | ||
+ | <br />. | ||
+ | <br />. | ||
+ | <br />. | ||
+ | <br />. | ||
+ | <br />cpsr <- The current program status register value to load on return from the context switch | ||
+ | <br />lr/pc <- The address to return to from the context switch | ||
+ | <br />lr <- The lr value prior to the context switch | ||
+ | <br />r12 <- | ||
+ | <br />r11 <- | ||
+ | <br />r10 <- | ||
+ | <br />r9 <- | ||
+ | <br />r8 <- | ||
+ | <br />r7 <- | ||
+ | <br />r6 <- The value of these registers prior to the context switch | ||
+ | <br />r5 <- | ||
+ | <br />r4 <- | ||
+ | <br />r3 <- | ||
+ | <br />r2 <- | ||
+ | <br />r1 <- | ||
+ | <br />r0 <- | ||
+ | <br /> | ||
+ | <br />d15 <- | ||
+ | <br />d14 <- | ||
+ | <br />d13 <- | ||
+ | <br />d12 <- | ||
+ | <br />d11 <- | ||
+ | <br />d10 <- | ||
+ | <br />d9 <- | ||
+ | <br />d8 <- The value of these floating point registers prior to the context switch | ||
+ | <br />d7 <- | ||
+ | <br />d6 <- | ||
+ | <br />d5 <- | ||
+ | <br />d4 <- | ||
+ | <br />d3 <- | ||
+ | <br />d2 <- | ||
+ | <br />d1 <- | ||
+ | <br />d0 <- | ||
+ | <br /> | ||
+ | <br />fpscr <- The floating point FPSCR register | ||
+ | <br />fpexc <- The floating point FPEXC register (Current StackPointer points to here) | ||
+ | <br />. | ||
+ | <br />. | ||
+ | <br />. | ||
+ | <br />. | ||
+ | <br />(Top "Lowest Address" of Stack) | ||
+ | <br /> | ||
+ | <br />This form of context switch uses r12 to save the cpsr value (and RFE to restore it). Because this context switch is called from a routine which will have saved the value of r12 (which is caller save in the ARM ABI) then we do not need to save the original value of r12. | ||
+ | <br /> | ||
+ | <br />The context switch will be performed from SYS mode to SYS mode, the cpsr value will include the control bits (Mode and IRQ/FIQ state) but not the flags values. Again the ARM ABI does not require that the flags be saved by the callee and so the caller would have accounted for any needed flags before calling. If the thread to be resumed was interrupted by an IRQ or FIQ then the cpsr will also contain the flags etc as they were at the point of interrupt. We do not need to account for the state bits in the cpsr since all operations are performed in ARM mode at present. | ||
+ | <br /> | ||
+ | <br />The main requirement of this routine is to ensure that the context record on the stack matches exactly that which is created on an interrupt and also that created by ThreadSetupStack for a new thread. If this is correct then the next context switch for any given thread can be either by a call to reschedule or by an interrupt. Equally a new thread can be first run from a context switch that resulted from either a call to reschedule or an interrupt. | ||
+ | <br /> | ||
+ | <br />Note that this routine could use: | ||
+ | <br /> | ||
+ | <br />pop (lr) | ||
+ | <br />pop (r12) | ||
+ | <br />msr cpsr_c, r12 | ||
+ | <br />mov pc, lr | ||
+ | <br /> | ||
+ | <br />To return but that would mess up the value of r12, lr and the cpsr flags etc if the thread being resumed was interrupted by an IRQ, FIQ or SWI. The use of RFE here allows for exactly the same behaviour no matter which way the context record is saved and restored. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure ARMv6ContextSwitchIRQ(OldStack,NewStack:Pointer; NewThread:TThreadHandle); assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Perform a context switch from one thread to another as a result of an interrupt request (IRQ)</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''OldStack''' | ||
+ | | The address to save the stack pointer to for the current thread (Passed in r0) | ||
+ | |- | ||
+ | ! '''NewStack''' | ||
+ | | The address to restore the stack pointer from for the new thread (Passed in r1) | ||
+ | |- | ||
+ | ! '''NewThread''' | ||
+ | | The handle of the new thread to switch to (Passed in r2) | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | At the point of the actual context switch (str sp / ldr sp) the thread stacks will look like this: | ||
+ | <br /> | ||
+ | <br />(See: ARMv6ThreadSetupStack for additional information) | ||
+ | <br /> | ||
+ | <br />(Base "Highest Address" of Stack) | ||
+ | <br />. | ||
+ | <br />. | ||
+ | <br />. | ||
+ | <br />. | ||
+ | <br />cpsr <- The current program status register value to load on return from the context switch | ||
+ | <br />lr/pc <- The address to return to from the context switch | ||
+ | <br />lr <- The lr value prior to the context switch | ||
+ | <br />r12 <- | ||
+ | <br />r11 <- | ||
+ | <br />r10 <- | ||
+ | <br />r9 <- | ||
+ | <br />r8 <- | ||
+ | <br />r7 <- | ||
+ | <br />r6 <- The value of these registers prior to the context switch | ||
+ | <br />r5 <- | ||
+ | <br />r4 <- | ||
+ | <br />r3 <- | ||
+ | <br />r2 <- | ||
+ | <br />r1 <- | ||
+ | <br />r0 <- | ||
+ | <br /> | ||
+ | <br />d15 <- | ||
+ | <br />d14 <- | ||
+ | <br />d13 <- | ||
+ | <br />d12 <- | ||
+ | <br />d11 <- | ||
+ | <br />d10 <- | ||
+ | <br />d9 <- | ||
+ | <br />d8 <- The value of these floating point registers prior to the context switch | ||
+ | <br />d7 <- | ||
+ | <br />d6 <- | ||
+ | <br />d5 <- | ||
+ | <br />d4 <- | ||
+ | <br />d3 <- | ||
+ | <br />d2 <- | ||
+ | <br />d1 <- | ||
+ | <br />d0 <- | ||
+ | <br /> | ||
+ | <br />fpscr <- The floating point FPSCR register | ||
+ | <br />fpexc <- The floating point FPEXC register (Current StackPointer points to here) | ||
+ | <br />. | ||
+ | <br />. | ||
+ | <br />. | ||
+ | <br />. | ||
+ | <br />(Top "Lowest Address" of Stack) | ||
+ | <br /> | ||
+ | <br />This form of context switch relies on the IRQ handler to save the necessary registers including the lr, cpsr and other general registers from the point at which the thread was interrupted. The thread to be resumed may have been saved by a previous IRQ or by a call to the standard context switch from SchedulerReschule or it may be a new thread to be run for the first time. All of these result in the same context record on the stack and therefore can be resumed the same way. | ||
+ | <br /> | ||
+ | <br />The context switch will be performed by switching to SYS mode, exchanging the stack pointers and then returning to IRQ mode. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure ARMv6ContextSwitchFIQ(OldStack,NewStack:Pointer; NewThread:TThreadHandle); assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Perform a context switch from one thread to another as a result of a fast interrupt request (FIQ)</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''OldStack''' | ||
+ | | The address to save the stack pointer to for the current thread (Passed in r0) | ||
+ | |- | ||
+ | ! '''NewStack''' | ||
+ | | The address to restore the stack pointer from for the new thread (Passed in r1) | ||
+ | |- | ||
+ | ! '''NewThread''' | ||
+ | | The handle of the new thread to switch to (Passed in r2) | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | At the point of the actual context switch (str sp / ldr sp) the thread stacks will look like this: | ||
+ | <br /> | ||
+ | <br />(See: ARMv6ThreadSetupStack for additional information) | ||
+ | <br /> | ||
+ | <br />(Base "Highest Address" of Stack) | ||
+ | <br />. | ||
+ | <br />. | ||
+ | <br />. | ||
+ | <br />. | ||
+ | <br />cpsr <- The current program status register value to load on return from the context switch | ||
+ | <br />lr/pc <- The address to return to from the context switch | ||
+ | <br />lr <- The lr value prior to the context switch | ||
+ | <br />r12 <- | ||
+ | <br />r11 <- | ||
+ | <br />r10 <- | ||
+ | <br />r9 <- | ||
+ | <br />r8 <- | ||
+ | <br />r7 <- | ||
+ | <br />r6 <- The value of these registers prior to the context switch | ||
+ | <br />r5 <- | ||
+ | <br />r4 <- | ||
+ | <br />r3 <- | ||
+ | <br />r2 <- | ||
+ | <br />r1 <- | ||
+ | <br />r0 <- | ||
+ | <br /> | ||
+ | <br />d15 <- | ||
+ | <br />d14 <- | ||
+ | <br />d13 <- | ||
+ | <br />d12 <- | ||
+ | <br />d11 <- | ||
+ | <br />d10 <- | ||
+ | <br />d9 <- | ||
+ | <br />d8 <- The value of these floating point registers prior to the context switch | ||
+ | <br />d7 <- | ||
+ | <br />d6 <- | ||
+ | <br />d5 <- | ||
+ | <br />d4 <- | ||
+ | <br />d3 <- | ||
+ | <br />d2 <- | ||
+ | <br />d1 <- | ||
+ | <br />d0 <- | ||
+ | <br /> | ||
+ | <br />fpscr <- The floating point FPSCR register | ||
+ | <br />fpexc <- The floating point FPEXC register (Current StackPointer points to here) | ||
+ | <br />. | ||
+ | <br />. | ||
+ | <br />. | ||
+ | <br />. | ||
+ | <br />(Top "Lowest Address" of Stack) | ||
+ | <br /> | ||
+ | <br />This form of context switch relies on the FIQ handler to save the necessary registers including the lr, cpsr and other general registers from the point at which the thread was interrupted. The thread to be resumed may have been saved by a previous FIQ or by a call to the standard context switch from SchedulerReschule or it may be a new thread to be run for the first time. All of these result in the same context record on the stack and therefore can be resumed the same way. | ||
+ | <br /> | ||
+ | <br />The context switch will be performed by switching to SYS mode, exchanging the stack pointers and then returning to FIQ mode. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">procedure ARMv6ContextSwitchSWI(OldStack,NewStack:Pointer; NewThread:TThreadHandle);</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Perform a context switch from one thread to another as a result of a software interrupt (SWI)</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''OldStack''' | ||
+ | | The address to save the stack pointer to for the current thread (Passed in r0) | ||
+ | |- | ||
+ | ! '''NewStack''' | ||
+ | | The address to restore the stack pointer from for the new thread (Passed in r1) | ||
+ | |- | ||
+ | ! '''NewThread''' | ||
+ | | The handle of the new thread to switch to (Passed in r2) | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | At the point of the actual context switch (str sp / ldr sp) the thread stacks will look like this: | ||
+ | <br /> | ||
+ | <br />(See: ARMv6ThreadSetupStack for additional information) | ||
+ | <br /> | ||
+ | <br />(Base "Highest Address" of Stack) | ||
+ | <br />. | ||
+ | <br />. | ||
+ | <br />. | ||
+ | <br />. | ||
+ | <br />cpsr <- The current program status register value to load on return from the context switch | ||
+ | <br />lr/pc <- The address to return to from the context switch | ||
+ | <br />lr <- The lr value prior to the context switch | ||
+ | <br />r12 <- | ||
+ | <br />r11 <- | ||
+ | <br />r10 <- | ||
+ | <br />r9 <- | ||
+ | <br />r8 <- | ||
+ | <br />r7 <- | ||
+ | <br />r6 <- The value of these registers prior to the context switch | ||
+ | <br />r5 <- | ||
+ | <br />r4 <- | ||
+ | <br />r3 <- | ||
+ | <br />r2 <- | ||
+ | <br />r1 <- | ||
+ | <br />r0 <- | ||
+ | <br /> | ||
+ | <br />d15 <- | ||
+ | <br />d14 <- | ||
+ | <br />d13 <- | ||
+ | <br />d12 <- | ||
+ | <br />d11 <- | ||
+ | <br />d10 <- | ||
+ | <br />d9 <- | ||
+ | <br />d8 <- The value of these floating point registers prior to the context switch | ||
+ | <br />d7 <- | ||
+ | <br />d6 <- | ||
+ | <br />d5 <- | ||
+ | <br />d4 <- | ||
+ | <br />d3 <- | ||
+ | <br />d2 <- | ||
+ | <br />d1 <- | ||
+ | <br />d0 <- | ||
+ | <br /> | ||
+ | <br />fpscr <- The floating point FPSCR register | ||
+ | <br />fpexc <- The floating point FPEXC register (Current StackPointer points to here) | ||
+ | <br />. | ||
+ | <br />. | ||
+ | <br />. | ||
+ | <br />. | ||
+ | <br />(Top "Lowest Address" of Stack) | ||
+ | <br /> | ||
+ | <br />This form of context switch relies on the SWI handler to save the necessary registers including the lr, cpsr and other general registers from the point at which the thread was interrupted. The thread to be resumed may have been saved by a previous SWI or by a call to the standard context switch from SchedulerReschule or it may be a new thread to be run for the first time. All of these result in the same context record on the stack and therefore can be resumed the same way. | ||
+ | <br /> | ||
+ | <br />The context switch will be performed by switching to SYS mode, exchanging the stack pointers and then returning to SWI (SVC) mode. | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function ARMv6InterlockedOr(var Target:LongInt; Value:LongInt):LongInt; assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Perform an atomic OR operation using LDREX/STREX</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | See page ??? of the ARM1176JZF-S Technical Reference Manual | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function ARMv6InterlockedXor(var Target:LongInt; Value:LongInt):LongInt; assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Perform an atomic XOR operation using LDREX/STREX</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | See page ??? of the ARM1176JZF-S Technical Reference Manual | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function ARMv6InterlockedAnd(var Target:LongInt; Value:LongInt):LongInt; assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Perform an atomic AND operation using LDREX/STREX</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | See page ??? of the ARM1176JZF-S Technical Reference Manual | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function ARMv6InterlockedDecrement(var Target:LongInt):LongInt; assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Perform an atomic decrement operation using LDREX/STREX</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | See page 8-6 of the ARM1176JZF-S Technical Reference Manual | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function ARMv6InterlockedIncrement(var Target:LongInt):LongInt; assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Perform an atomic increment operation using LDREX/STREX</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | See page 8-6 of the ARM1176JZF-S Technical Reference Manual | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function ARMv6InterlockedExchange(var Target:LongInt; Source:LongInt):LongInt; assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Perform an atomic exchange operation using LDREX/STREX</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | See page 8-6 of the ARM1176JZF-S Technical Reference Manual | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function ARMv6InterlockedAddExchange(var Target:LongInt; Source:LongInt):LongInt; assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Perform an atomic add and exchange operation using LDREX/STREX</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | See page 8-6 of the ARM1176JZF-S Technical Reference Manual | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function ARMv6InterlockedCompareExchange(var Target:LongInt; Source,Compare:LongInt):LongInt; assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Perform an atomic compare and exchange operation using LDREX/STREX</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | See page 8-6 of the ARM1176JZF-S Technical Reference Manual | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function ARMv6PageTableGetEntry(Address:PtrUInt):TPageTableEntry;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Get and Decode the entry in the Page Table that corresponds to the supplied virtual address</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function ARMv6PageTableSetEntry(const Entry:TPageTableEntry):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Encode and Set an entry in the Page Table that corresponds to the supplied virtual address</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function ARMv6VectorTableGetEntry(Number:LongWord):PtrUInt;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Return the address of the specified vector table entry number</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function ARMv6VectorTableSetEntry(Number:LongWord; Address:PtrUInt):LongWord;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Set the supplied address as the value of the specified vector table entry number</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | None documented | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function ARMv6FirstBitSet(Value:LongWord):LongWord; assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | ARM arm states that CLZ is supported for ARMv5 and above | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
+ | <pre style="border: 0; padding-bottom:0px;">function ARMv6CountLeadingZeros(Value:LongWord):LongWord; assembler; nostackframe;</pre> | ||
+ | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Equivalent of the GCC Builtin function __builtin_clz</div> | ||
+ | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
+ | {| class="wikitable" style="font-size: 14px; background: white;" | ||
+ | |- | ||
+ | ! '''Note''' | ||
+ | | ARM arm states that CLZ is supported for ARMv5 and above | ||
|- | |- | ||
|} | |} |
Revision as of 04:16, 21 October 2016
Return to Unit Reference
Description
The ARMv6 (ARM11) does not support WFI, WFE, DMB, DSB or ISB instructions, these must be done using MCR operations on the system control processor registers.
The ARMv6 supports the LDREX/STREX instructions for syncronisation (Lock/Mutex/Semaphore etc) but only if the MMU is enabled.
Constants
To be documented
Type definitions
To be documented
Public variables
To be documented
Function declarations
Initialization functions
procedure ARMv6Init;
Note | None documented |
---|
ARMv6 platform functions
procedure ARMv6CPUInit; assembler; nostackframe;
Note | None documented |
---|
procedure ARMv6FPUInit; assembler; nostackframe;
Note | None documented |
---|
procedure ARMv6MMUInit;
Note | None documented |
---|
procedure ARMv6CacheInit; assembler; nostackframe;
Note | None documented |
---|
procedure ARMv6PageTableInit;
Note | See page 6-36 of the ARM1176JZF-S Technical Reference Manual |
---|
procedure ARMv6SystemCall(Number:LongWord; Param1,Param2,Param3:PtrUInt); assembler; nostackframe;
Note | None documented |
---|
function ARMv6CPUGetMode:LongWord; assembler; nostackframe;
Note | None documented |
---|
function ARMv6CPUGetState:LongWord; assembler; nostackframe;
Note | None documented |
---|
function ARMv6CPUGetMainID:LongWord; assembler; nostackframe;
Note | None documented |
---|
function ARMv6CPUGetModel:LongWord;
Note | None documented |
---|
function ARMv6CPUGetRevision:LongWord;
Note | None documented |
---|
function ARMv6CPUGetDescription:String;
Note | None documented |
---|
function ARMv6FPUGetState:LongWord; assembler; nostackframe;
Note | None documented |
---|
function ARMv6L1CacheGetType:LongWord; assembler; nostackframe;
Note | None documented |
---|
function ARMv6L1DataCacheGetSize:LongWord; assembler; nostackframe;
Note | None documented |
---|
function ARMv6L1DataCacheGetLineSize:LongWord; assembler; nostackframe;
Note | None documented |
---|
function ARMv6L1InstructionCacheGetSize:LongWord; assembler; nostackframe;
Note | None documented |
---|
function ARMv6L1InstructionCacheGetLineSize:LongWord; assembler; nostackframe;
Note | None documented |
---|
procedure ARMv6Halt; assembler; nostackframe; public name'_haltproc';
Note | See Standby mode on page 10-3 of the ARM1176JZF-S Revision: r0p7 Technical Reference Manual |
---|
procedure ARMv6Pause; assembler; nostackframe;
Note | See Standby mode on page 10-3 of the ARM1176JZF-S Revision: r0p7 Technical Reference Manual |
---|
procedure ARMv6WaitForEvent; assembler; nostackframe;
Note | None documented |
---|
procedure ARMv6WaitForInterrupt; assembler; nostackframe;
Note | See Standby mode on page 10-3 of the ARM1176JZF-S Revision: r0p7 Technical Reference Manual |
---|
procedure ARMv6DataMemoryBarrier; assembler; nostackframe;
Note | See page 3-74 of the ARM1176JZF-S Technical Reference Manual
Note that this is also available in the FPC RTL as ReadBarrier/WriteBarrier See: \source\rtl\arm\arm.inc
|
---|
procedure ARMv6DataSynchronizationBarrier; assembler; nostackframe;
Note | See page 3-74 of the ARM1176JZF-S Technical Reference Manual |
---|
procedure ARMv6InstructionMemoryBarrier; assembler; nostackframe;
Note | The ARM1176JZF-S Technical Reference Manual states on page 5-10 (section 5.5) that a Flush Prefetch Buffer operation also acts as an IMB
See page 3-79 of the ARM1176JZF-S Technical Reference Manual |
---|
procedure ARMv6InvalidateTLB; assembler; nostackframe;
Note | See page 3-86 of the ARM1176JZF-S Technical Reference Manual |
---|
procedure ARMv6InvalidateDataTLB; assembler; nostackframe;
Note | See page 3-86 of the ARM1176JZF-S Technical Reference Manual |
---|
procedure ARMv6InvalidateInstructionTLB; assembler; nostackframe;
Note | See page 3-86 of the ARM1176JZF-S Technical Reference Manual |
---|
procedure ARMv6InvalidateCache; assembler; nostackframe;
Note | See page 3-74 of the ARM1176JZF-S Technical Reference Manual |
---|
procedure ARMv6CleanDataCache; assembler; nostackframe;
Note | See page 3-74 of the ARM1176JZF-S Technical Reference Manual |
---|
procedure ARMv6InvalidateDataCache; assembler; nostackframe;
Note | See page 3-74 of the ARM1176JZF-S Technical Reference Manual |
---|
procedure ARMv6CleanAndInvalidateDataCache; assembler; nostackframe;
Note | See page 3-74 of the ARM1176JZF-S Technical Reference Manual |
---|
procedure ARMv6InvalidateInstructionCache; assembler; nostackframe;
Note | See page 3-74 of the ARM1176JZF-S Technical Reference Manual |
---|
procedure ARMv6CleanDataCacheRange(Address,Size:LongWord); assembler; nostackframe;
Note | See page 3-71 / 3-76 of the ARM1176JZF-S Technical Reference Manual |
---|
procedure ARMv6InvalidateDataCacheRange(Address,Size:LongWord); assembler; nostackframe;
Note | See page 3-71 / 3-76 of the ARM1176JZF-S Technical Reference Manual |
---|
procedure ARMv6CleanAndInvalidateDataCacheRange(Address,Size:LongWord); assembler; nostackframe;
Note | See page 3-71 / 3-76 of the ARM1176JZF-S Technical Reference Manual |
---|
procedure ARMv6InvalidateInstructionCacheRange(Address,Size:LongWord); assembler; nostackframe;
Note | See page 3-71 / 3-76 of the ARM1176JZF-S Technical Reference Manual |
---|
procedure ARMv6FlushPrefetchBuffer; assembler; nostackframe;
Note | See page 3-79 of the ARM1176JZF-S Technical Reference Manual |
---|
procedure ARMv6FlushBranchTargetCache; assembler; nostackframe;
Note | See page 3-79 of the ARM1176JZF-S Technical Reference Manual |
---|
procedure ARMv6ContextSwitch(OldStack,NewStack:Pointer; NewThread:TThreadHandle); assembler; nostackframe;
OldStack | The address to save the stack pointer to for the current thread (Passed in r0) |
---|---|
NewThread | The address to restore the stack pointer from for the new thread (Passed in r1) |
NewThread | The handle of the new thread to switch to (Passed in r2) |
Note | At the point of the actual context switch (str sp / ldr sp) the thread stacks will look like this:
|
procedure ARMv6ContextSwitchIRQ(OldStack,NewStack:Pointer; NewThread:TThreadHandle); assembler; nostackframe;
OldStack | The address to save the stack pointer to for the current thread (Passed in r0) |
---|---|
NewStack | The address to restore the stack pointer from for the new thread (Passed in r1) |
NewThread | The handle of the new thread to switch to (Passed in r2) |
Note | At the point of the actual context switch (str sp / ldr sp) the thread stacks will look like this:
|
procedure ARMv6ContextSwitchFIQ(OldStack,NewStack:Pointer; NewThread:TThreadHandle); assembler; nostackframe;
OldStack | The address to save the stack pointer to for the current thread (Passed in r0) |
---|---|
NewStack | The address to restore the stack pointer from for the new thread (Passed in r1) |
NewThread | The handle of the new thread to switch to (Passed in r2) |
Note | At the point of the actual context switch (str sp / ldr sp) the thread stacks will look like this:
|
procedure ARMv6ContextSwitchSWI(OldStack,NewStack:Pointer; NewThread:TThreadHandle);
OldStack | The address to save the stack pointer to for the current thread (Passed in r0) |
---|---|
NewStack | The address to restore the stack pointer from for the new thread (Passed in r1) |
NewThread | The handle of the new thread to switch to (Passed in r2) |
Note | At the point of the actual context switch (str sp / ldr sp) the thread stacks will look like this:
|
function ARMv6InterlockedOr(var Target:LongInt; Value:LongInt):LongInt; assembler; nostackframe;
Note | See page ??? of the ARM1176JZF-S Technical Reference Manual |
---|
function ARMv6InterlockedXor(var Target:LongInt; Value:LongInt):LongInt; assembler; nostackframe;
Note | See page ??? of the ARM1176JZF-S Technical Reference Manual |
---|
function ARMv6InterlockedAnd(var Target:LongInt; Value:LongInt):LongInt; assembler; nostackframe;
Note | See page ??? of the ARM1176JZF-S Technical Reference Manual |
---|
function ARMv6InterlockedDecrement(var Target:LongInt):LongInt; assembler; nostackframe;
Note | See page 8-6 of the ARM1176JZF-S Technical Reference Manual |
---|
function ARMv6InterlockedIncrement(var Target:LongInt):LongInt; assembler; nostackframe;
Note | See page 8-6 of the ARM1176JZF-S Technical Reference Manual |
---|
function ARMv6InterlockedExchange(var Target:LongInt; Source:LongInt):LongInt; assembler; nostackframe;
Note | See page 8-6 of the ARM1176JZF-S Technical Reference Manual |
---|
function ARMv6InterlockedAddExchange(var Target:LongInt; Source:LongInt):LongInt; assembler; nostackframe;
Note | See page 8-6 of the ARM1176JZF-S Technical Reference Manual |
---|
function ARMv6InterlockedCompareExchange(var Target:LongInt; Source,Compare:LongInt):LongInt; assembler; nostackframe;
Note | See page 8-6 of the ARM1176JZF-S Technical Reference Manual |
---|
function ARMv6PageTableGetEntry(Address:PtrUInt):TPageTableEntry;
Note | None documented |
---|
function ARMv6PageTableSetEntry(const Entry:TPageTableEntry):LongWord;
Note | None documented |
---|
function ARMv6VectorTableGetEntry(Number:LongWord):PtrUInt;
Note | None documented |
---|
function ARMv6VectorTableSetEntry(Number:LongWord; Address:PtrUInt):LongWord;
Note | None documented |
---|
function ARMv6FirstBitSet(Value:LongWord):LongWord; assembler; nostackframe;
Note | ARM arm states that CLZ is supported for ARMv5 and above |
---|
function ARMv6CountLeadingZeros(Value:LongWord):LongWord; assembler; nostackframe;
Note | ARM arm states that CLZ is supported for ARMv5 and above |
---|
Return to Unit Reference