Difference between revisions of "Unit PlatformARMv7"
(5 intermediate revisions by the same user not shown) | |||
Line 5: | Line 5: | ||
---- | ---- | ||
− | '''Ultibo Platform | + | '''Ultibo Platform Interface unit for ARMv7''' |
The ARMv7 does not support the SWP/SWPB instructions for syncronisation (Lock/Mutex/Semaphore etc) unless enabled. | The ARMv7 does not support the SWP/SWPB instructions for syncronisation (Lock/Mutex/Semaphore etc) unless enabled. | ||
Line 2,179: | Line 2,179: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 2,194: | Line 2,194: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 2,206: | Line 2,206: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 2,218: | Line 2,218: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 2,230: | Line 2,230: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 2,242: | Line 2,242: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 2,254: | Line 2,254: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| See page ??? | | See page ??? | ||
|- | |- | ||
Line 2,266: | Line 2,266: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 2,278: | Line 2,278: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 2,290: | Line 2,290: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 2,302: | Line 2,302: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 2,314: | Line 2,314: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 2,326: | Line 2,326: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 2,338: | Line 2,338: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 2,350: | Line 2,350: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 2,362: | Line 2,362: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 2,374: | Line 2,374: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 2,386: | Line 2,386: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 2,398: | Line 2,398: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 2,410: | Line 2,410: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 2,422: | Line 2,422: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 2,434: | Line 2,434: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 2,446: | Line 2,446: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 2,458: | Line 2,458: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 2,470: | Line 2,470: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 2,477: | Line 2,477: | ||
<br /> | <br /> | ||
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | <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 ARMv7Halt; assembler; nostackframe; public name'_haltproc';</pre> | + | <pre style="border: 0; padding-bottom:0px;">procedure ARMv7Halt; 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 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;"> | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| See Standby mode on page A8-810 of the ARMv7 Architecture Reference Manual | | See Standby mode on page A8-810 of the ARMv7 Architecture Reference Manual | ||
|- | |- | ||
Line 2,494: | Line 2,494: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| See Standby mode on page A8-810 of the ARMv7 Architecture Reference Manual | | See Standby mode on page A8-810 of the ARMv7 Architecture Reference Manual | ||
|- | |- | ||
Line 2,506: | Line 2,506: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| See Page A8-316 of the ARMv7 Architecture Reference Manual | | See Page A8-316 of the ARMv7 Architecture Reference Manual | ||
|- | |- | ||
Line 2,518: | Line 2,518: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| See Page A8-808 of the ARMv7 Architecture Reference Manual | | See Page A8-808 of the ARMv7 Architecture Reference Manual | ||
|- | |- | ||
Line 2,530: | Line 2,530: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| See Standby mode on page A8-810 of the ARMv7 Architecture Reference Manual | | See Standby mode on page A8-810 of the ARMv7 Architecture Reference Manual | ||
|- | |- | ||
Line 2,542: | Line 2,542: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| See page A8-90 of the ARMv7 Architecture Reference Manual | | See page A8-90 of the ARMv7 Architecture Reference Manual | ||
Note that this is also available in the FPC RTL as ReadBarrier/WriteBarrier See: \source\rtl\arm\arm.inc | Note that this is also available in the FPC RTL as ReadBarrier/WriteBarrier See: \source\rtl\arm\arm.inc | ||
Line 2,556: | Line 2,556: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| See page A8-92 of the ARMv7 Architecture Reference Manual | | See page A8-92 of the ARMv7 Architecture Reference Manual | ||
|- | |- | ||
Line 2,568: | Line 2,568: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| See page A8-102 of the ARMv7 Architecture Reference Manual | | See page A8-102 of the ARMv7 Architecture Reference Manual | ||
|- | |- | ||
Line 2,580: | Line 2,580: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| See page B3-138 of the ARMv7 Architecture Reference Manual | | See page B3-138 of the ARMv7 Architecture Reference Manual | ||
|- | |- | ||
Line 2,592: | Line 2,592: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| See page B3-138 of the ARMv7 Architecture Reference Manual | | See page B3-138 of the ARMv7 Architecture Reference Manual | ||
|- | |- | ||
Line 2,604: | Line 2,604: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| See page B3-138 of the ARMv7 Architecture Reference Manual | | See page B3-138 of the ARMv7 Architecture Reference Manual | ||
|- | |- | ||
Line 2,616: | Line 2,616: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| See page B3-127 of the ARMv7 Architecture Reference Manual | | See page B3-127 of the ARMv7 Architecture Reference Manual | ||
|- | |- | ||
Line 2,628: | Line 2,628: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| See page B3-127 of the ARMv7 Architecture Reference Manual | | See page B3-127 of the ARMv7 Architecture Reference Manual | ||
|- | |- | ||
Line 2,640: | Line 2,640: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| See page B3-127 of the ARMv7 Architecture Reference Manual | | See page B3-127 of the ARMv7 Architecture Reference Manual | ||
|- | |- | ||
Line 2,652: | Line 2,652: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| See page B3-127 of the ARMv7 Architecture Reference Manual | | See page B3-127 of the ARMv7 Architecture Reference Manual | ||
|- | |- | ||
Line 2,664: | Line 2,664: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| See page B3-127 of the ARMv7 Architecture Reference Manual | | See page B3-127 of the ARMv7 Architecture Reference Manual | ||
|- | |- | ||
Line 2,676: | Line 2,676: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| See page B3-127 of the ARMv7 Architecture Reference Manual | | See page B3-127 of the ARMv7 Architecture Reference Manual | ||
|- | |- | ||
Line 2,683: | Line 2,683: | ||
<br /> | <br /> | ||
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | <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 ARMv7CleanDataCacheRange(Address | + | <pre style="border: 0; padding-bottom:0px;">procedure ARMv7CleanDataCacheRange(Address:PtrUInt; Size:LongWord);</pre> |
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' Perform a clean data cache by MVA to PoC operation</div> | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Perform a clean data cache by MVA to PoC operation</div> | ||
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| See page B3-127 of the ARMv7 Architecture Reference Manual | | See page B3-127 of the ARMv7 Architecture Reference Manual | ||
|- | |- | ||
Line 2,695: | Line 2,695: | ||
<br /> | <br /> | ||
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | <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 ARMv7InvalidateDataCacheRange(Address | + | <pre style="border: 0; padding-bottom:0px;">procedure ARMv7InvalidateDataCacheRange(Address:PtrUInt; Size:LongWord);</pre> |
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' Perform an invalidate data cache by MVA to PoC operation</div> | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Perform an invalidate data cache by MVA to PoC operation</div> | ||
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| See page B3-127 of the ARMv7 Architecture Reference Manual | | See page B3-127 of the ARMv7 Architecture Reference Manual | ||
|- | |- | ||
Line 2,707: | Line 2,707: | ||
<br /> | <br /> | ||
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | <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 ARMv7CleanAndInvalidateDataCacheRange(Address | + | <pre style="border: 0; padding-bottom:0px;">procedure ARMv7CleanAndInvalidateDataCacheRange(Address:PtrUInt; Size:LongWord);</pre> |
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' Perform a clean and invalidate data cache by MVA to PoC operation</div> | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Perform a clean and invalidate data cache by MVA to PoC operation</div> | ||
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| See page B3-127 of the ARMv7 Architecture Reference Manual | | See page B3-127 of the ARMv7 Architecture Reference Manual | ||
|- | |- | ||
Line 2,719: | Line 2,719: | ||
<br /> | <br /> | ||
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | <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 ARMv7InvalidateInstructionCacheRange(Address | + | <pre style="border: 0; padding-bottom:0px;">procedure ARMv7InvalidateInstructionCacheRange(Address:PtrUInt; Size:LongWord);</pre> |
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' Perform an invalidate instruction caches by MVA to PoU operation</div> | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' Perform an invalidate instruction caches by MVA to PoU operation</div> | ||
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| See page B3-127 of the ARMv7 Architecture Reference Manual | | See page B3-127 of the ARMv7 Architecture Reference Manual | ||
|- | |- | ||
Line 2,736: | Line 2,736: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! SetWay |
| Set/Way/Level will be passed in r0 | | Set/Way/Level will be passed in r0 | ||
|- | |- | ||
− | ! | + | ! Note |
| See page B3-127 of the ARMv7 Architecture Reference Manual | | See page B3-127 of the ARMv7 Architecture Reference Manual | ||
|- | |- | ||
Line 2,751: | Line 2,751: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! SetWay |
| Set/Way/Level will be passed in r0 | | Set/Way/Level will be passed in r0 | ||
|- | |- | ||
− | ! | + | ! Note |
| See page B3-127 of the ARMv7 Architecture Reference Manual | | See page B3-127 of the ARMv7 Architecture Reference Manual | ||
|- | |- | ||
Line 2,766: | Line 2,766: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! SetWay |
| Set/Way/Level will be passed in r0 | | Set/Way/Level will be passed in r0 | ||
|- | |- | ||
− | ! | + | ! Note |
| See page B3-127 of the ARMv7 Architecture Reference Manual | | See page B3-127 of the ARMv7 Architecture Reference Manual | ||
|- | |- | ||
Line 2,781: | Line 2,781: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| See page A8-102 of the ARMv7 Architecture Reference Manual | | See page A8-102 of the ARMv7 Architecture Reference Manual | ||
|- | |- | ||
Line 2,793: | Line 2,793: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| See page B3-127 of the ARMv7 Architecture Reference Manual | | See page B3-127 of the ARMv7 Architecture Reference Manual | ||
|- | |- | ||
Line 2,800: | Line 2,800: | ||
<br /> | <br /> | ||
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | <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 ARMv7ContextSwitch(OldStack,NewStack:Pointer; NewThread:TThreadHandle); | + | <pre style="border: 0; padding-bottom:0px;">procedure ARMv7ContextSwitch(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 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;"> | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! OldStack |
| The address to save the stack pointer to for the current thread (Passed in r0) | | 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) | | 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) | | 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: | | At the point of the actual context switch (str sp/ldr sp) the thread stacks will look like this: | ||
<br />(See: ARMv7ThreadSetupStack for additional information) | <br />(See: ARMv7ThreadSetupStack for additional information) | ||
Line 2,884: | Line 2,884: | ||
<br /> | <br /> | ||
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | <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 ARMv7ContextSwitchIRQ(OldStack,NewStack:Pointer; NewThread:TThreadHandle); | + | <pre style="border: 0; padding-bottom:0px;">procedure ARMv7ContextSwitchIRQ(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 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;"> | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! OldStack |
| The address to save the stack pointer to for the current thread (Passed in r0) | | 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) | | 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) | | 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: | | At the point of the actual context switch (str sp/ldr sp) the thread stacks will look like this: | ||
<br />(See: ARMv7ThreadSetupStack for additional information) | <br />(See: ARMv7ThreadSetupStack for additional information) | ||
Line 2,962: | Line 2,962: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! OldStack |
| The address to save the stack pointer to for the current thread (Passed in r0) | | 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) | | 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) | | 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: | | At the point of the actual context switch (str sp/ldr sp) the thread stacks will look like this: | ||
<br />(See: ARMv7ThreadSetupStack for additional information) | <br />(See: ARMv7ThreadSetupStack for additional information) | ||
Line 3,035: | Line 3,035: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! OldStack |
| The address to save the stack pointer to for the current thread (Passed in r0) | | 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) | | 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) | | 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: | | At the point of the actual context switch (str sp/ldr sp) the thread stacks will look like this: | ||
<br />(See: ARMv7ThreadSetupStack for additional information) | <br />(See: ARMv7ThreadSetupStack for additional information) | ||
Line 3,108: | Line 3,108: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| See page ??? | | See page ??? | ||
|- | |- | ||
Line 3,120: | Line 3,120: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| See page ??? | | See page ??? | ||
|- | |- | ||
Line 3,132: | Line 3,132: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| See page ??? | | See page ??? | ||
|- | |- | ||
Line 3,144: | Line 3,144: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| See page ??? | | See page ??? | ||
|- | |- | ||
Line 3,156: | Line 3,156: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| See page ??? | | See page ??? | ||
|- | |- | ||
Line 3,168: | Line 3,168: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| See page ??? | | See page ??? | ||
|- | |- | ||
Line 3,180: | Line 3,180: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| See page ??? | | See page ??? | ||
|- | |- | ||
Line 3,192: | Line 3,192: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| See page ??? | | See page ??? | ||
|- | |- | ||
Line 3,204: | Line 3,204: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 3,216: | Line 3,216: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 3,228: | Line 3,228: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 3,240: | Line 3,240: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 3,252: | Line 3,252: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| ARM arm states that CLZ is supported for ARMv5 and above | | ARM arm states that CLZ is supported for ARMv5 and above | ||
|- | |- | ||
Line 3,264: | Line 3,264: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| ARM arm states that CLZ is supported for ARMv5 and above | | ARM arm states that CLZ is supported for ARMv5 and above | ||
|- | |- | ||
Line 3,279: | Line 3,279: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 3,291: | Line 3,291: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Spin |
| Pointer to the Spin entry to lock (Passed in R0) | | Pointer to the Spin entry to lock (Passed in R0) | ||
|- | |- | ||
− | ! | + | ! Return |
| ERROR_SUCCESS if completed or another error code on failure (Returned in R0) | | ERROR_SUCCESS if completed or another error code on failure (Returned in R0) | ||
|- | |- | ||
Line 3,306: | Line 3,306: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Spin |
| Pointer to the Spin entry to lock (Passed in R0) | | Pointer to the Spin entry to lock (Passed in R0) | ||
|- | |- | ||
− | ! | + | ! Return |
| ERROR_SUCCESS if completed or another error code on failure (Returned in R0) | | ERROR_SUCCESS if completed or another error code on failure (Returned in R0) | ||
|- | |- | ||
Line 3,321: | Line 3,321: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Spin |
| Pointer to the Spin entry to lock (Passed in R0) | | Pointer to the Spin entry to lock (Passed in R0) | ||
|- | |- | ||
− | ! | + | ! Return |
| ERROR_SUCCESS if completed or another error code on failure (Returned in R0) | | ERROR_SUCCESS if completed or another error code on failure (Returned in R0) | ||
|- | |- | ||
Line 3,336: | Line 3,336: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Spin |
| Pointer to the Spin entry to lock (Passed in R0) | | Pointer to the Spin entry to lock (Passed in R0) | ||
|- | |- | ||
− | ! | + | ! Return |
| ERROR_SUCCESS if completed or another error code on failure (Returned in R0) | | ERROR_SUCCESS if completed or another error code on failure (Returned in R0) | ||
|- | |- | ||
Line 3,351: | Line 3,351: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Spin |
| Pointer to the Spin entry to lock (Passed in R0) | | Pointer to the Spin entry to lock (Passed in R0) | ||
|- | |- | ||
− | ! | + | ! Return |
| ERROR_SUCCESS if completed or another error code on failure (Returned in R0) | | ERROR_SUCCESS if completed or another error code on failure (Returned in R0) | ||
|- | |- | ||
Line 3,366: | Line 3,366: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Spin |
| Pointer to the Spin entry to lock (Passed in R0) | | Pointer to the Spin entry to lock (Passed in R0) | ||
|- | |- | ||
− | ! | + | ! Return |
| ERROR_SUCCESS if completed or another error code on failure (Returned in R0) | | ERROR_SUCCESS if completed or another error code on failure (Returned in R0) | ||
|- | |- | ||
Line 3,381: | Line 3,381: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Spin |
| Pointer to the Spin entry to lock (Passed in R0) | | Pointer to the Spin entry to lock (Passed in R0) | ||
|- | |- | ||
− | ! | + | ! Return |
| ERROR_SUCCESS if completed or another error code on failure (Returned in R0) | | ERROR_SUCCESS if completed or another error code on failure (Returned in R0) | ||
|- | |- | ||
Line 3,396: | Line 3,396: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Spin |
| Pointer to the Spin entry to lock (Passed in R0) | | Pointer to the Spin entry to lock (Passed in R0) | ||
|- | |- | ||
− | ! | + | ! Return |
| ERROR_SUCCESS if completed or another error code on failure (Returned in R0) | | ERROR_SUCCESS if completed or another error code on failure (Returned in R0) | ||
|- | |- | ||
Line 3,411: | Line 3,411: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Return |
| True if the mask would enable IRQ on restore, False if it would not | | True if the mask would enable IRQ on restore, False if it would not | ||
|- | |- | ||
Line 3,423: | Line 3,423: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Return |
| True if the mask would enable FIQ on restore, False if it would not | | True if the mask would enable FIQ on restore, False if it would not | ||
|- | |- | ||
Line 3,435: | Line 3,435: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 3,447: | Line 3,447: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 3,459: | Line 3,459: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Mutex |
| Pointer to the Mutex entry to lock (Passed in R0) | | Pointer to the Mutex entry to lock (Passed in R0) | ||
|- | |- | ||
− | ! | + | ! Return |
| ERROR_SUCCESS if completed or another error code on failure (Returned in R0) | | ERROR_SUCCESS if completed or another error code on failure (Returned in R0) | ||
|- | |- | ||
Line 3,474: | Line 3,474: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Mutex |
| Pointer to the Mutex entry to lock (Passed in R0) | | Pointer to the Mutex entry to lock (Passed in R0) | ||
|- | |- | ||
− | ! | + | ! Return |
| ERROR_SUCCESS if completed or another error code on failure (Returned in R0) | | ERROR_SUCCESS if completed or another error code on failure (Returned in R0) | ||
|- | |- | ||
Line 3,489: | Line 3,489: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Mutex |
| Pointer to the Mutex entry to try to lock (Passed in R0) | | Pointer to the Mutex entry to try to lock (Passed in R0) | ||
|- | |- | ||
− | ! | + | ! Return |
− | | ERROR_SUCCESS if completed, ERROR_LOCKED if already locked or another error code on failure (Returned in R0) | + | | ERROR_SUCCESS if completed, ERROR_LOCKED if already locked or another error code on failure (Returned in R0). |
|- | |- | ||
|} | |} | ||
Line 3,504: | Line 3,504: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| See page ??? | | See page ??? | ||
|- | |- | ||
Line 3,516: | Line 3,516: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| See page ??? | | See page ??? | ||
|- | |- | ||
Line 3,528: | Line 3,528: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! StackBase |
| Pointer to the base (highest address) of the allocated stack (as returned by ThreadAllocateStack | | Pointer to the base (highest address) of the allocated stack (as returned by ThreadAllocateStack | ||
|- | |- | ||
− | ! | + | ! StartProc |
| The procedure the thread will start executing when resumed | | The procedure the thread will start executing when resumed | ||
|- | |- | ||
− | ! | + | ! ReturnProc |
| The procedure the thread will return to on exit | | The procedure the thread will return to on exit | ||
|- | |- | ||
− | ! | + | ! Return |
| Pointer to the starting address of the stack, which will be the Stack Pointer on the first context switch | | Pointer to the starting address of the stack, which will be the Stack Pointer on the first context switch | ||
|- | |- | ||
− | ! | + | ! Note |
| At the point of a context switch the thread stack will look like this: | | At the point of a context switch the thread stack will look like this: | ||
<br />(Base "Highest Address" of Stack) | <br />(Base "Highest Address" of Stack) | ||
Line 3,620: | Line 3,620: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 3,635: | Line 3,635: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 3,650: | Line 3,650: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 3,665: | Line 3,665: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 3,677: | Line 3,677: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| This routine is registered as the vector for undefined instruction exception in the vector table loaded during startup | | This routine is registered as the vector for undefined instruction exception in the vector table loaded during startup | ||
|- | |- | ||
Line 3,689: | Line 3,689: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| This routine is registered as the vector for SWI requests in the vector table loaded during startup. When the processor executes an SVC it switches to SWI mode, stores the address of the next instruction in the SWI mode link register (lr_svc) and saves the current program status register into the SWI mode saved program status register (spsr_svc). | | This routine is registered as the vector for SWI requests in the vector table loaded during startup. When the processor executes an SVC it switches to SWI mode, stores the address of the next instruction in the SWI mode link register (lr_svc) and saves the current program status register into the SWI mode saved program status register (spsr_svc). | ||
<br />The SWI handler first saves the SWI mode lr and spsr (which represent the location and state to return to) onto the SYS mode stack using the srsdb (Store Return State Decrement Before) instruction. | <br />The SWI handler first saves the SWI mode lr and spsr (which represent the location and state to return to) onto the SYS mode stack using the srsdb (Store Return State Decrement Before) instruction. | ||
Line 3,717: | Line 3,717: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| This routine is registered as the vector for prefetch abort exception in the vector table loaded during startup | | This routine is registered as the vector for prefetch abort exception in the vector table loaded during startup | ||
|- | |- | ||
Line 3,729: | Line 3,729: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| This routine is registered as the vector for data abort exception in the vector table loaded during startup | | This routine is registered as the vector for data abort exception in the vector table loaded during startup | ||
|- | |- | ||
Line 3,741: | Line 3,741: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 3,753: | Line 3,753: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| This routine is registered as the vector for IRQ requests in the vector table loaded during startup. | | This routine is registered as the vector for IRQ requests in the vector table loaded during startup. | ||
<br />At the end of each instruction the processor checks the IRQ line and if triggered it will lookup the vector in the vector table and jump to the routine listed. | <br />At the end of each instruction the processor checks the IRQ line and if triggered it will lookup the vector in the vector table and jump to the routine listed. | ||
Line 3,776: | Line 3,776: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| This routine is registered as the vector for FIQ requests in the vector table loaded during startup. | | This routine is registered as the vector for FIQ requests in the vector table loaded during startup. | ||
<br />At the end of each instruction the processor checks the FIQ line and if triggered it will lookup the vector in the vector table and jump to the routine listed. | <br />At the end of each instruction the processor checks the FIQ line and if triggered it will lookup the vector in the vector table and jump to the routine listed. | ||
Line 3,804: | Line 3,804: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 3,816: | Line 3,816: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 3,828: | Line 3,828: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 3,840: | Line 3,840: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 3,852: | Line 3,852: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 3,864: | Line 3,864: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 3,876: | Line 3,876: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 3,888: | Line 3,888: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 3,900: | Line 3,900: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 3,912: | Line 3,912: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 3,924: | Line 3,924: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 3,936: | Line 3,936: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| See page ??? | | See page ??? | ||
|- | |- | ||
Line 3,948: | Line 3,948: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| See page ??? | | See page ??? | ||
Caller must call ARMv7InvalidateTLB after changes if MMU is enabled | Caller must call ARMv7InvalidateTLB after changes if MMU is enabled | ||
Line 3,961: | Line 3,961: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| See page ??? | | See page ??? | ||
|- | |- | ||
Line 3,973: | Line 3,973: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| Large Page Table descriptors must begin on a 16 longword (64 byte) boundary and be repeated for 16 consecutive longwords | | Large Page Table descriptors must begin on a 16 longword (64 byte) boundary and be repeated for 16 consecutive longwords | ||
See page ??? | See page ??? | ||
Line 3,987: | Line 3,987: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| See page ??? | | See page ??? | ||
|- | |- | ||
Line 3,999: | Line 3,999: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| See page ??? | | See page ??? | ||
Caller must call ARMv7InvalidateTLB after changes if MMU is enabled | Caller must call ARMv7InvalidateTLB after changes if MMU is enabled | ||
Line 4,012: | Line 4,012: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| See page ??? | | See page ??? | ||
|- | |- | ||
Line 4,024: | Line 4,024: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| See page ??? | | See page ??? | ||
Caller must call ARMv7InvalidateTLB after changes if MMU is enabled | Caller must call ARMv7InvalidateTLB after changes if MMU is enabled | ||
Line 4,037: | Line 4,037: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| Supersection Page Table descriptors must begin on a 16 longword (64 byte) boundary and be repeated for 16 consecutive longwords | | Supersection Page Table descriptors must begin on a 16 longword (64 byte) boundary and be repeated for 16 consecutive longwords | ||
See page ??? | See page ??? |
Latest revision as of 01:34, 22 April 2022
Return to Unit Reference
Contents
[hide]Description
Ultibo Platform Interface unit for ARMv7
The ARMv7 does not support the SWP/SWPB instructions for syncronisation (Lock/Mutex/Semaphore etc) unless enabled.
On ARMv7 Unaligned memory access is always enabled.
On ARMv7 the Extended Page Table format is always enabled.
For usage of barriers (DMB/DSB/ISB) after cache maintenance operations see: ARM.Reference_Manual_1.pdf - Appendix G Barrier Litmus Tests
Constants
ARMV7_PAGE_TABLES_*
ARMV7_CP15_C0_MAINID_*
ARMV7_CP15_C0_MPID_*
ARMV7_CP15_C0_CCSID_*
ARMV7_CP15_C0_CLID_*
ARMV7_CP15_C0_CSSEL_*
ARMV7_CP15_C1_*
ARMV7_CP15_C1_AUX_*
ARMV7_CP15_C1_CP*
ARMV7_CP15_C1_SCR_*
ARMV7_CP15_C2_TTBR_*
ARMV7_CP15_C3_DOMAIN*
ARMV7_CP15_C10_PRRR_*
ARMV7_CP15_C10_NMRR_*
ARMV7_CP15_C14_CNT_CTL_*
ARMV7_CP15_C14_*
ARMV7_FPEXC_*
ARMV7_L1D_TYPE_*
ARMV7_L1D_FLAG_*
ARMV7_L1D_*_MASK
ARMV7_L1D_TEX*
ARMV7_L1D_AP*
ARMV7_L1D_ACCESS_*
ARMV7_L1D_CACHE_*
ARMV7_L1D_CACHE_CACHEABLE_*
ARMV7_L1D_CACHE_REMAP_*
ARMV7_L2D_TYPE_*
ARMV7_L2D_FLAG_*
ARMV7_L2D_*_MASK
ARMV7_L2D_LARGE_TEX*
ARMV7_L2D_SMALL_TEX*
ARMV7_L2D_AP*
ARMV7_L2D_ACCESS_*
ARMV7_L2D_LARGE_CACHE_*
ARMV7_L2D_LARGE_CACHE_CACHEABLE_*
ARMV7_L2D_LARGE_CACHE_REMAP_*
ARMV7_L2D_SMALL_CACHE_*
ARMV7_L2D_SMALL_CACHE_CACHEABLE_*
ARMV7_L2D_SMALL_CACHE_REMAP_*
ARMV7_*
Type definitions
ARMv7 page table initialization
TARMv7PageTableInit = procedure;
|
ARMv7 dispatch IRQ
TARMv7DispatchIRQ = function(CPUID:LongWord; Thread:TThreadHandle):TThreadHandle;
|
ARMv7 dispatch FIQ
TARMv7DispatchFIQ = function(CPUID:LongWord; Thread:TThreadHandle):TThreadHandle;
|
ARMv7 dispatch SWI
TARMv7DispatchSWI = function(CPUID:LongWord; Thread:TThreadHandle; Request:PSystemCallRequest):TThreadHandle;
|
Public variables
ARMv7 specific variables
ARMv7Initialized:Boolean;
|
Page table handlers
ARMv7PageTableInitHandler:TARMv7PageTableInit;
|
IRQ handlers
ARMv7DispatchIRQHandler:TARMv7DispatchIRQ;
|
FIQ handlers
ARMv7DispatchFIQHandler:TARMv7DispatchFIQ;
|
SWI handlers
ARMv7DispatchSWIHandler:TARMv7DispatchSWI;
|
Function declarations
Initialization functions
ARMv7 platform functions
procedure ARMv7TimerInit(Frequency:LongWord); assembler; nostackframe;
procedure ARMv7PageTableInit;
procedure ARMv7SystemCall(Number:LongWord; Param1,Param2,Param3:PtrUInt);
function ARMv7CPUGetCurrent:LongWord; assembler; nostackframe;
function ARMv7CPUGetMainID:LongWord; assembler; nostackframe;
function ARMv7CPUGetMultiprocessorID:LongWord; assembler; nostackframe;
function ARMv7L1CacheGetType:LongWord; assembler; nostackframe;
function ARMv7L1DataCacheGetSize:LongWord; assembler; nostackframe;
function ARMv7L1DataCacheGetLineSize:LongWord; assembler; nostackframe;
function ARMv7L1InstructionCacheGetSize:LongWord; assembler; nostackframe;
function ARMv7L1InstructionCacheGetLineSize:LongWord; assembler; nostackframe;
function ARMv7L2CacheGetType:LongWord; assembler; nostackframe;
function ARMv7L2CacheGetSize:LongWord; assembler; nostackframe;
function ARMv7L2CacheGetLineSize:LongWord; assembler; nostackframe;
procedure ARMv7Halt; assembler; nostackframe; public name '_haltproc';
procedure ARMv7Pause; assembler; nostackframe;
procedure ARMv7WaitForInterrupt; assembler; nostackframe;
procedure ARMv7DataMemoryBarrier; assembler; nostackframe;
procedure ARMv7DataSynchronizationBarrier; assembler; nostackframe;
procedure ARMv7InstructionMemoryBarrier; assembler; nostackframe;
procedure ARMv7InvalidateTLB; assembler; nostackframe;
procedure ARMv7InvalidateDataTLB; assembler; nostackframe;
procedure ARMv7InvalidateInstructionTLB; assembler; nostackframe;
procedure ARMv7InvalidateCache; assembler; nostackframe;
procedure ARMv7CleanDataCache; assembler; nostackframe;
procedure ARMv7InvalidateDataCache; assembler; nostackframe;
procedure ARMv7InvalidateL1DataCache; assembler; nostackframe;
procedure ARMv7CleanAndInvalidateDataCache; assembler; nostackframe;
procedure ARMv7InvalidateInstructionCache; assembler; nostackframe;
procedure ARMv7CleanDataCacheRange(Address:PtrUInt; Size:LongWord);
procedure ARMv7InvalidateDataCacheRange(Address:PtrUInt; Size:LongWord);
procedure ARMv7CleanAndInvalidateDataCacheRange(Address:PtrUInt; Size:LongWord);
procedure ARMv7InvalidateInstructionCacheRange(Address:PtrUInt; Size:LongWord);
procedure ARMv7CleanDataCacheSetWay(SetWay:LongWord); assembler; nostackframe;
procedure ARMv7InvalidateDataCacheSetWay(SetWay:LongWord); assembler; nostackframe;
procedure ARMv7CleanAndInvalidateDataCacheSetWay(SetWay:LongWord); assembler; nostackframe;
procedure ARMv7FlushPrefetchBuffer; assembler; nostackframe;
procedure ARMv7FlushBranchTargetCache; assembler; nostackframe;
procedure ARMv7ContextSwitch(OldStack,NewStack:Pointer; NewThread:TThreadHandle); assembler; nostackframe;
procedure ARMv7ContextSwitchIRQ(OldStack,NewStack:Pointer; NewThread:TThreadHandle); assembler; nostackframe;
procedure ARMv7ContextSwitchFIQ(OldStack,NewStack:Pointer; NewThread:TThreadHandle); assembler; nostackframe;
procedure ARMv7ContextSwitchSWI(OldStack,NewStack:Pointer; NewThread:TThreadHandle); assembler; nostackframe;
function ARMv7InterlockedOr(var Target:LongInt; Value:LongInt):LongInt; assembler; nostackframe;
function ARMv7InterlockedXor(var Target:LongInt; Value:LongInt):LongInt; assembler; nostackframe;
function ARMv7InterlockedAnd(var Target:LongInt; Value:LongInt):LongInt; assembler; nostackframe;
function ARMv7InterlockedDecrement(var Target:LongInt):LongInt; assembler; nostackframe;
function ARMv7InterlockedIncrement(var Target:LongInt):LongInt; assembler; nostackframe;
function ARMv7InterlockedExchange(var Target:LongInt; Source:LongInt):LongInt; assembler; nostackframe;
function ARMv7InterlockedAddExchange(var Target:LongInt; Source:LongInt):LongInt; assembler; nostackframe;
function ARMv7InterlockedCompareExchange(var Target:LongInt; Source,Compare:LongInt):LongInt; assembler; nostackframe;
procedure ARMv7PageTableGetEntry(Address:PtrUInt; var Entry:TPageTableEntry);
function ARMv7PageTableSetEntry(const Entry:TPageTableEntry):LongWord;
function ARMv7VectorTableGetEntry(Number:LongWord):PtrUInt;
function ARMv7VectorTableSetEntry(Number:LongWord; Address:PtrUInt):LongWord;
function ARMv7FirstBitSet(Value:LongWord):LongWord; assembler; nostackframe;
function ARMv7CountLeadingZeros(Value:LongWord):LongWord; assembler; nostackframe;
ARMv7 thread functions
function ARMv7SpinLock(Spin:PSpinEntry):LongWord; assembler; nostackframe;
function ARMv7SpinUnlock(Spin:PSpinEntry):LongWord; assembler; nostackframe;
function ARMv7SpinLockIRQ(Spin:PSpinEntry):LongWord; assembler; nostackframe;
function ARMv7SpinUnlockIRQ(Spin:PSpinEntry):LongWord; assembler; nostackframe;
function ARMv7SpinLockFIQ(Spin:PSpinEntry):LongWord; assembler; nostackframe;
function ARMv7SpinUnlockFIQ(Spin:PSpinEntry):LongWord; assembler; nostackframe;
function ARMv7SpinLockIRQFIQ(Spin:PSpinEntry):LongWord; assembler; nostackframe;
function ARMv7SpinUnlockIRQFIQ(Spin:PSpinEntry):LongWord; assembler; nostackframe;
function ARMv7SpinExchangeIRQ(Spin1,Spin2:PSpinEntry):LongWord;
function ARMv7SpinExchangeFIQ(Spin1,Spin2:PSpinEntry):LongWord;
function ARMv7MutexLock(Mutex:PMutexEntry):LongWord; assembler; nostackframe;
function ARMv7MutexUnlock(Mutex:PMutexEntry):LongWord; assembler; nostackframe;
function ARMv7MutexTryLock(Mutex:PMutexEntry):LongWord; assembler; nostackframe;
function ARMv7ThreadGetCurrent:TThreadHandle; assembler; nostackframe;
function ARMv7ThreadSetCurrent(Thread:TThreadHandle):LongWord; assembler; nostackframe;
function ARMv7ThreadSetupStack(StackBase:Pointer; StartProc:TThreadStart; ReturnProc:TThreadEnd; Parameter:Pointer):Pointer;
ARMv7 IRQ functions
function ARMv7DispatchIRQ(CPUID:LongWord; Thread:TThreadHandle):TThreadHandle; inline;
ARMv7 FIQ functions
function ARMv7DispatchFIQ(CPUID:LongWord; Thread:TThreadHandle):TThreadHandle; inline;
ARMv7 SWI functions
function ARMv7DispatchSWI(CPUID:LongWord; Thread:TThreadHandle; Request:PSystemCallRequest):TThreadHandle; inline;
ARMv7 interrupt functions
procedure ARMv7UndefinedInstructionHandler; assembler; nostackframe;
procedure ARMv7SoftwareInterruptHandler; assembler; nostackframe;
procedure ARMv7PrefetchAbortHandler; assembler; nostackframe;
procedure ARMv7DataAbortHandler; assembler; nostackframe;
procedure ARMv7IRQHandler; assembler; nostackframe;
procedure ARMv7FIQHandler; assembler; nostackframe;
ARMv7 helper functions
function ARMv7GetTimerState(Timer:LongWord):LongWord; assembler; nostackframe;
procedure ARMv7SetTimerState(Timer,State:LongWord); assembler; nostackframe;
function ARMv7GetTimerCount(Timer:LongWord):Int64; assembler; nostackframe;
function ARMv7GetTimerValue(Timer:LongWord):LongWord; assembler; nostackframe;
procedure ARMV7SetTimerValue(Timer,Value:LongWord); assembler; nostackframe;
function ARMv7GetTimerCompare(Timer:LongWord):Int64; assembler; nostackframe;
procedure ARMV7SetTimerCompare(Timer,High,Low:LongWord); assembler; nostackframe;
function ARMv7GetTimerFrequency:LongWord; assembler; nostackframe;
function ARMv7GetPageTableCoarse(Address:PtrUInt):LongWord;
function ARMv7SetPageTableCoarse(Address,CoarseAddress:PtrUInt; Flags:Word):Boolean;
function ARMv7GetPageTableLarge(Address:PtrUInt):LongWord;
function ARMv7SetPageTableLarge(Address,PhysicalAddress:PtrUInt; Flags:Word):Boolean;
function ARMv7GetPageTableSmall(Address:PtrUInt):LongWord;
function ARMv7SetPageTableSmall(Address,PhysicalAddress:PtrUInt; Flags:Word):Boolean;
function ARMv7GetPageTableSection(Address:PtrUInt):LongWord;
function ARMv7SetPageTableSection(Address,PhysicalAddress:PtrUInt; Flags:LongWord):Boolean;
function ARMv7SetPageTableSupersection(Address,PhysicalAddress:PtrUInt; Flags:LongWord):Boolean;
Return to Unit Reference