Difference between revisions of "Unit PlatformAARCH64"

From Ultibo.org
Jump to: navigation, search
 
(10 intermediate revisions by the same user not shown)
Line 5: Line 5:
 
----
 
----
  
'''Ultibo Platform interface unit for AARCH64 (ARM64)'''
+
'''Ultibo Platform Interface unit for AARCH64 (ARM64)'''
 
+
''To be documented''
+
  
 
=== Constants ===
 
=== Constants ===
Line 33: Line 31:
 
|  
 
|  
 
|-
 
|-
| <code>ATAG_INITRD2 = $54410005;</code>
+
| <code>ATAG_INITRD = $54410005;</code>
 +
| Deprecated
 +
|-
 +
| <code>ATAG_INITRD2 = $54420005;</code>
 
| &nbsp;
 
| &nbsp;
 
|-
 
|-
Line 52: Line 53:
 
| <code>ARMTAGS_INITIAL = $FFFFFFFF;</code>
 
| <code>ARMTAGS_INITIAL = $FFFFFFFF;</code>
 
| &nbsp;
 
| &nbsp;
 +
|-
 +
|}
 +
</div></div>
 +
<br />
 +
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;">
 +
<div style="font-size: 14px; padding-left: 12px;">'''Device tree blob''' <code> DTB_* </code></div>
 +
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 +
{| class="wikitable" style="font-size: 14px; background: white;"
 +
|-
 +
| <code>DTB_SIGNATURE = $d00dfeed;</code>
 +
| style="width: 50%;"|See: https://github.com/devicetree-org/devicetree-specification/releases/download/v0.3/devicetree-specification-v0.3.pdf
 
|-
 
|-
 
|}
 
|}
Line 72: Line 84:
 
| <code>ARM_MACHINE_BCM2710 = $00000C42;</code>
 
| <code>ARM_MACHINE_BCM2710 = $00000C42;</code>
 
| BCM2710 uses the same Machine Type as BCM2708
 
| BCM2710 uses the same Machine Type as BCM2708
 +
|-
 +
| <code>ARM_MACHINE_BCM2711 = $00000C42;</code>
 +
| BCM2711 uses the same Machine Type as BCM2708
 
|-
 
|-
 
|}
 
|}
Line 383: Line 398:
 
|-
 
|-
 
|}
 
|}
</div></div>  
+
</div></div>  
 +
 
 +
'''Device tree blob header'''
 +
 
 +
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;">
 +
<code>PDTBHeader = ^TDTBHeader;</code>
 +
 
 +
<code>TDTBHeader = packed record</code>
 +
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 +
{| class="wikitable" style="font-size: 14px; background: white;"
 +
|-
 +
| <code>Magic:LongWord;</code>
 +
| The value 0xd00dfeed (big-endian)
 +
|-
 +
| <code>TotalSize:LongWord;</code>
 +
| The total size in bytes of the devicetree data structure (big-endian)
 +
|-
 +
| <code>StructureOffset:LongWord;</code>
 +
| The offset in bytes of the structure block from the beginning of the header (big-endian)
 +
|-
 +
| <code>StringsOffset:LongWord;</code>
 +
| The offset in bytes of the strings block from the beginning of the header (big-endian)
 +
|-
 +
| <code>ReservationOffset:LongWord;</code>
 +
| The offset in bytes of the memory reservation block from the beginning of the header (big-endian)
 +
|-
 +
| <code>Version:LongWord;</code>
 +
| The version of the devicetree data structure (big-endian)
 +
|-
 +
| <code>CompatibleVersion:LongWord;</code>
 +
| The lowest version of the devicetree data structure with which the version used is backwards compatible (big-endian)
 +
|-
 +
| <code>BootCPUID:LongWord;</code>
 +
| The physical ID of the system’s boot CPU (big-endian)
 +
|-
 +
| <code>StringsSize:LongWord;</code>
 +
| The length in bytes of the strings block section of the devicetree blob (big-endian)
 +
|-
 +
| <code>StructureSize:LongWord;</code>
 +
| The length in bytes of the structure block section of the devicetree blob (big-endian)
 +
|-
 +
|}
 +
</div></div>   
  
 
'''AARCH64 wait'''
 
'''AARCH64 wait'''
Line 446: Line 503:
 
|-
 
|-
 
| <code>AARCH64BootMode:LongWord = 0;</code>
 
| <code>AARCH64BootMode:LongWord = 0;</code>
| style="width: 40%;"|The ARM Mode that the processor was in at boot time (Set by Startup). Must be initialized to remain in .data or else rewritten to zero with .bss
+
| style="width: 40%;"|The ARM Mode that the processor was in at boot time (Set by Startup)
 
|-
 
|-
 
|}
 
|}
Line 452: Line 509:
 
|-
 
|-
 
| <code>AARCH64BootVectors:LongWord = 0;</code>
 
| <code>AARCH64BootVectors:LongWord = 0;</code>
| style="width: 40%;"|The Vector Base Address that was current at boot time (Set by Startup). Must be initialized to remain in .data or else rewritten to zero with .bss
+
| style="width: 40%;"|The Vector Base Address that was current at boot time (Set by Startup)
 +
|-
 +
|}
 +
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 +
|-
 +
| <code>AARCH64TagsAddress:PtrUInt = ARMTAGS_INITIAL</code>
 +
| style="width: 40%;"|Pointer to the ARM TAGS provided by the bootloader at startup (Set by Startup)
 +
|-
 +
|}
 +
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 +
|-
 +
| <code>AARCH64MachineType:LongWord = 0;</code>
 +
| style="width: 40%;"|ARM Machine Type provided by the bootloader at startup (Set by Startup)
 
|-
 
|-
 
|}
 
|}
 
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 
|-
 
|-
| <code>ARMTagsAddress:LongWord = ARMTAGS_INITIAL;</code>
+
| <code>AARCH64SecureBoot:LongWord = 1;</code>
| style="width: 40%;"|Pointer to the ARM TAGS provided by the bootloader at startup (Set by Startup). Must be initialized to remain in .data or else rewritten to zero with .bss
+
| style="width: 40%;"|If 1 then startup will attempt to switch back to secure world during boot process (If supported by the AARCH64 boot stub)
 
|-
 
|-
 
|}
 
|}
 
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 
|-
 
|-
| <code>ARMMachineType:LongWord = 0;</code>
+
| <code>AARCH64EmulatorMode:LongWord = 0;</code>
| style="width: 40%;"|ARM Machine Type provided by the bootloader at startup (Set by Startup). Must be initialized to remain in .data or else rewritten to zero with .bss
+
| style="width: 40%;"|If 1 then startup detected that the machine is running in an emulator (If applicable)
 +
Note: These variables must be initialized to remain in .data or else they are rewritten to zero with .bss
 
|-
 
|-
 
|}
 
|}
 
   
 
   
'''ARM tags variables'''
+
'''ARM tags'''
  
 
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
Line 477: Line 547:
 
|}
 
|}
 
   
 
   
'''Tag none variables'''
+
'''Tag none'''
  
 
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
Line 486: Line 556:
 
|}
 
|}
 
   
 
   
'''Tag core variables'''
+
'''Tag core'''
  
 
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
Line 513: Line 583:
 
|}
 
|}
 
   
 
   
'''Tag memory variables'''
+
'''Tag memory'''
  
 
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
Line 529: Line 599:
 
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 
|-
 
|-
| <code>TagMemoryStart:LongWord;</code>
+
| <code>TagMemoryStart:PtrUInt;</code>
 
| style="width: 40%;"|Start of the last block reported by ARM Tags
 
| style="width: 40%;"|Start of the last block reported by ARM Tags
 
|-
 
|-
Line 541: Line 611:
 
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 
|-
 
|-
| <code>TagMemoryAddress:LongWord;</code>
+
| <code>TagMemoryAddress:PtrUInt;</code>
 
| style="width: 40%;"|Adjusted Address of the last block reported by ARM Tags
 
| style="width: 40%;"|Adjusted Address of the last block reported by ARM Tags
 
|-
 
|-
 
|}
 
|}
 
   
 
   
'''Tag video text variables'''
+
'''Tag video text'''
  
 
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
Line 555: Line 625:
 
|}
 
|}
 
   
 
   
'''Tag ramdisk variables'''
+
'''Tag ramdisk'''
  
 
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
Line 561: Line 631:
 
| <code>TagRamdiskCount:LongWord;</code>
 
| <code>TagRamdiskCount:LongWord;</code>
 
| style="width: 40%;"|Number of ARM RAMDISK Tags found during parse
 
| style="width: 40%;"|Number of ARM RAMDISK Tags found during parse
 +
|-
 +
|}
 +
 +
'''Tag initialize RD'''
 +
 +
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 +
|-
 +
| <code>TagInitRdCount:LongWord;</code>
 +
| style="width: 40%;"|Number of ARM INITRD Tags found during parse (Deprecated)
 
|-
 
|-
 
|}
 
|}
 
   
 
   
'''Tag Init RD2 variables'''
+
'''Tag initialize RD2'''
  
 
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
Line 570: Line 649:
 
| <code>TagInitRd2Count:LongWord;</code>
 
| <code>TagInitRd2Count:LongWord;</code>
 
| style="width: 40%;"|Number of ARM INITRD2 Tags found during parse
 
| style="width: 40%;"|Number of ARM INITRD2 Tags found during parse
 +
|-
 +
|}
 +
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 +
|-
 +
| <code>TagInitRd2Start:LongWord;</code>
 +
| style="width: 40%;"|
 +
|-
 +
|}
 +
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 +
|-
 +
| <code>TagInitRd2Size:LongWord;</code>
 +
| style="width: 40%;"|
 
|-
 
|-
 
|}
 
|}
 
   
 
   
'''Tag serial variables'''
+
'''Tag serial'''
  
 
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
Line 594: Line 685:
 
|}
 
|}
  
'''Tag revision variables'''
+
'''Tag revision'''
  
 
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
Line 609: Line 700:
 
|}
 
|}
 
   
 
   
'''Tag video FB variables'''
+
'''Tag video framebuffer'''
  
 
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
Line 618: Line 709:
 
|}
 
|}
  
'''Tag command variables'''
+
'''Tag command'''
  
 
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
Line 694: Line 785:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
 
| None documented
 
| None documented
 
|-
 
|-
Line 709: Line 800:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! 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 ExtractCommandLine(Value:PChar):Boolean;</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 ExtractMemoryBlock(Address,Size:LongWord):Boolean;</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 ExtractInitialRamdisk(Address,Size:LongWord):Boolean;</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
 
| None documented
 
|-
 
|-
Line 721: Line 848:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
 
| None documented
 
| None documented
 
|-
 
|-
Line 733: Line 860:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
 
| None documented
 
| None documented
 
|-
 
|-
Line 745: Line 872:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
 
| None documented
 
| None documented
 
|-
 
|-
Line 757: Line 884:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
 
| None documented
 
| None documented
 
|-
 
|-
Line 769: Line 896:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Return'''
+
! Return
| True is enabled, False if disabled (Returned in R0)
+
| True is enabled, False if disabled (Returned in R0).
 
|-
 
|-
 
|}
 
|}
Line 781: Line 908:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
 
| None documented
 
| None documented
 
|-
 
|-
Line 793: Line 920:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
 
| None documented
 
| None documented
 
|-
 
|-
Line 805: Line 932:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Return'''
+
! Return
 
| IRQ state when called (Returned in R0)
 
| IRQ state when called (Returned in R0)
 
|-
 
|-
Line 817: Line 944:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''IRQMask'''
+
! IRQMask
 
| IRQ state to restore (Passed in R0)
 
| IRQ state to restore (Passed in R0)
 
|-
 
|-
! '''Return'''
+
! Return
 
| IRQ state when called (Returned in R0)
 
| IRQ state when called (Returned in R0)
 
|-
 
|-
Line 832: Line 959:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Return'''
+
! Return
| True is enabled, False if disabled (Returned in R0)
+
| True is enabled, False if disabled (Returned in R0).
 
|-
 
|-
 
|}
 
|}
Line 844: Line 971:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
 
| None documented
 
| None documented
 
|-
 
|-
Line 856: Line 983:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
 
| None documented
 
| None documented
 
|-
 
|-
Line 868: Line 995:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Return'''
+
! Return
 
| FIQ state when called (Returned in R0)
 
| FIQ state when called (Returned in R0)
 
|-
 
|-
Line 880: Line 1,007:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''FIQMask'''
+
! FIQMask
 
| FIQ state to restore (Passed in R0)
 
| FIQ state to restore (Passed in R0)
 
|-
 
|-
! '''Return'''
+
! Return
 
| FIQ state when called (Returned in R0)
 
| FIQ state when called (Returned in R0)
 
|-
 
|-
Line 895: Line 1,022:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
 
| None documented
 
| None documented
 
|-
 
|-
Line 907: Line 1,034:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
 
| None documented
 
| None documented
 
|-
 
|-
Line 919: Line 1,046:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Return'''
+
! Return
 
| IRQ/FIQ state when called (Returned in R0)
 
| IRQ/FIQ state when called (Returned in R0)
 
|-
 
|-
Line 931: Line 1,058:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''IRQFIQMask'''
+
! IRQFIQMask
 
| IRQ/FIQ state to restore (Passed in R0)
 
| IRQ/FIQ state to restore (Passed in R0)
 
|-
 
|-
! '''Return'''
+
! Return
 
| IRQ/FIQ state when called (Returned in R0)
 
| IRQ/FIQ state when called (Returned in R0)
 
|-
 
|-
Line 946: Line 1,073:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Return'''
+
! Return
| True is enabled, False if disabled (Returned in R0)
+
| True is enabled, False if disabled (Returned in R0).
 
|-
 
|-
 
|}
 
|}
Line 958: Line 1,085:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
 
| None documented
 
| None documented
 
|-
 
|-
Line 970: Line 1,097:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
 
| None documented
 
| None documented
 
|-
 
|-
Line 982: Line 1,109:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Return'''
+
! Return
 
| Abort state when called (Returned in R0)
 
| Abort state when called (Returned in R0)
 
|-
 
|-
Line 994: Line 1,121:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''AbortMask'''
+
! AbortMask
 
| Abort state to restore (Passed in R0)
 
| Abort state to restore (Passed in R0)
 
|-
 
|-
! '''Return'''
+
! Return
| bort state when called (Returned in R0)
+
| Abort state when called (Returned in R0)
 
|-
 
|-
 
|}
 
|}
Line 1,012: Line 1,139:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
 
| None documented
 
| None documented
 
|-
 
|-
Line 1,024: Line 1,151:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
 
| None documented
 
| None documented
 
|-
 
|-
Line 1,036: Line 1,163:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
 
| None documented
 
| None documented
 
|-
 
|-
Line 1,048: Line 1,175:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
 
| None documented
 
| None documented
 
|-
 
|-
Line 1,060: Line 1,187:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
 
| None documented
 
| None documented
 
|-
 
|-
Line 1,072: Line 1,199:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
 
| None documented
 
| None documented
 
|-
 
|-

Latest revision as of 04:12, 29 October 2021

Return to Unit Reference


Description


Ultibo Platform Interface unit for AARCH64 (ARM64)

Constants



ARM boot tag ATAG_*
ATAG_NONE = $00000000;  
ATAG_CORE = $54410001;  
ATAG_MEM = $54410002;  
ATAG_VIDEOTEXT = $54410003;  
ATAG_RAMDISK = $54410004;  
ATAG_INITRD = $54410005; Deprecated
ATAG_INITRD2 = $54420005;  
ATAG_SERIAL = $54410006;  
ATAG_REVISION = $54410007;  
ATAG_VIDEOLFB = $54410008;  
ATAG_CMDLINE = $54410009;  
 
ARMTAGS_INITIAL = $FFFFFFFF;  



ARM machine type ARM_MACHINE_*
ARM_MACHINE_VERSATILE_PB = $00000183;  
ARM_MACHINE_BCM2708 = $00000C42;  
ARM_MACHINE_BCM2709 = $00000C42; BCM2709 uses the same Machine Type as BCM2708
ARM_MACHINE_BCM2710 = $00000C42; BCM2710 uses the same Machine Type as BCM2708
ARM_MACHINE_BCM2711 = $00000C42; BCM2711 uses the same Machine Type as BCM2708


Type definitions



ARM boot tag header

PARMTagHeader = ^TARMTagHeader;

TARMTagHeader = record

Note: ARM Boot Tag Structure Definitions
Size:LongWord; Size of tag, in words (32bit), including the header
Tag:LongWord; One of the ATAG_* values from above

ARM tag core

PARMTagCore = ^TARMTagCore;

TARMTagCore = record

Note: Core parameters (ATAG_CORE)
Flags:LongWord; Bit 0 = read-only
PageSize:LongWord; Systems page size (usually 4k)
RootDev:LongWord; Root device number

ARM tag memory

PARMTagMemory = ^TARMTagMemory;

TARMTagMemory = record

Note: Description of memory region (ATAG_MEM)
Size:LongWord;  
Start:LongWord;  

ARM tag video text

PARMTagVideoText = ^TARMTagVideoText;

TARMTagVideoText = record

Note: Description of VGA text type displays (ATAG_VIDEOTEXT)
X:Byte; Width of display
Y:Byte; Height of display
Video_page:Word;  
Video_mode:Byte;  
Video_cols:Byte;  
Video_ega_bx:Word;  
Video_lines:Byte;  
Video_isvga:Byte;  
Video_points:Word;  

ARM tag ramdisk

PARMTagRamdisk = ^TARMTagRamdisk;

TARMTagRamdisk = record

Note: Description of how the ramdisk will be used by the kernel (ATAG_RAMDISK)
Flags:LongWord; Bit 0 = load, Bit 1 = prompt
Size:LongWord; Decompressed ramdisk size in _kilo_ bytes
Start:LongWord; Starting block of floppy-based RAM disk image

ARM tag initialize ramdisk

PARMTagInitRd2 = ^TARMTagInitRd2;

TARMTagInitRd2 = record

Note: Description of the physical location of the compressed ramdisk image (ATAG_INITRD2)
Start:LongWord; Physical start address
Size:LongWord; Size of compressed ramdisk image in bytes

ARM tag serial

PARMTagSerial = ^TARMTagSerial;

TARMTagSerial = record

Note: Board serial number (ATAG_SERIAL)
Low:LongWord;  
High:LongWord;  

ARM tag revision

PARMTagRevision = ^TARMTagRevision;

TARMTagRevision = record

Note: Board revision (ATAG_REVISION)
Revision:LongWord;  

ARM tag video framebuffer

PARMTagVideoFB = ^TARMTagVideoFB;

TARMTagVideoFB = record

Note: Description of the parameters for a linear framebuffer type display (ATAG_VIDEOLFB)
Lfb_width:Word;  
Lfb_height:Word;  
Lfb_depth:Word;  
Lfb_linelength:Word;  
Lfb_base:LongWord;  
Lfb_size:LongWord;  
Red_size:Byte;  
Red_pos:Byte;  
Green_size:Byte;  
Green_pos:Byte;  
Blue_size:Byte;  
Blue_pos:Byte;  
Rsvd_size:Byte;  
Rsvd_pos:Byte;  

ARM tag command

PARMTagCommand = ^TARMTagCommand;

TARMTagCommand = record

Note: Commandline for the kernel (ATAG_CMDLINE)
Cmdline:array[0..0] of Char; This is the minimum size

ARM boot tag

PARMTag = ^TARMTag;

TARMTag = record

Note: Format of ARM Boot Tag
Header:TARMTagHeader;  
case Integer of  
0:(Core:TARMTagCore);  
1:(Memory:TARMTagMemory);  
2:(VideoText:TARMTagVideoText);  
3:(Ramdisk:TARMTagRamdisk);  
4:(InitRd2:TARMTagInitRd2);  
5:(Serial:TARMTagSerial);  
6:(Revision:TARMTagRevision);  
7:(VideoFB:TARMTagVideoFB);  
8:(Command:TARMTagCommand)  

Device tree blob header

PDTBHeader = ^TDTBHeader;

TDTBHeader = packed record

Magic:LongWord; The value 0xd00dfeed (big-endian)
TotalSize:LongWord; The total size in bytes of the devicetree data structure (big-endian)
StructureOffset:LongWord; The offset in bytes of the structure block from the beginning of the header (big-endian)
StringsOffset:LongWord; The offset in bytes of the strings block from the beginning of the header (big-endian)
ReservationOffset:LongWord; The offset in bytes of the memory reservation block from the beginning of the header (big-endian)
Version:LongWord; The version of the devicetree data structure (big-endian)
CompatibleVersion:LongWord; The lowest version of the devicetree data structure with which the version used is backwards compatible (big-endian)
BootCPUID:LongWord; The physical ID of the system’s boot CPU (big-endian)
StringsSize:LongWord; The length in bytes of the strings block section of the devicetree blob (big-endian)
StructureSize:LongWord; The length in bytes of the structure block section of the devicetree blob (big-endian)

AARCH64 wait

TAARCH64Wait = procedure;

AARCH64 long wait

TAARCH64LongWait = procedure;

AARCH64 short wait

TAARCH64ShortWait = procedure;

AARCH64 slow blink

TAARCH64SlowBlink = procedure;

AARCH64 fast blink

TAARCH64FastBlink = procedure;


Public variables



AARCH64 specific variables

AARCH64Initialized:Boolean;
AARCH64BootMode:LongWord = 0; The ARM Mode that the processor was in at boot time (Set by Startup)
AARCH64BootVectors:LongWord = 0; The Vector Base Address that was current at boot time (Set by Startup)
AARCH64TagsAddress:PtrUInt = ARMTAGS_INITIAL Pointer to the ARM TAGS provided by the bootloader at startup (Set by Startup)
AARCH64MachineType:LongWord = 0; ARM Machine Type provided by the bootloader at startup (Set by Startup)
AARCH64SecureBoot:LongWord = 1; If 1 then startup will attempt to switch back to secure world during boot process (If supported by the AARCH64 boot stub)
AARCH64EmulatorMode:LongWord = 0; If 1 then startup detected that the machine is running in an emulator (If applicable)

Note: These variables must be initialized to remain in .data or else they are rewritten to zero with .bss

ARM tags

ARMTagsCount:LongWord; Number of ARM Tags found during parse

Tag none

TagNoneCount:LongWord; Number of ARM NONE Tags found during parse

Tag core

TagCoreCount:LongWord; Number of ARM CORE Tags found during parse
TagCoreFlags:LongWord;
TagCorePageSize:LongWord;
TagCoreRootDevice:LongWord;

Tag memory

TagMemoryCount:LongWord; Number of ARM MEM Tags found during parse
TagMemorySize:LongWord; Size of the last block reported by ARM Tags
TagMemoryStart:PtrUInt; Start of the last block reported by ARM Tags
TagMemoryLength:LongWord; Adjusted Size of the last block reported by ARM Tags
TagMemoryAddress:PtrUInt; Adjusted Address of the last block reported by ARM Tags

Tag video text

TagVideoTextCount:LongWord; Number of ARM VIDEOTEXT Tags found during parse

Tag ramdisk

TagRamdiskCount:LongWord; Number of ARM RAMDISK Tags found during parse

Tag initialize RD

TagInitRdCount:LongWord; Number of ARM INITRD Tags found during parse (Deprecated)

Tag initialize RD2

TagInitRd2Count:LongWord; Number of ARM INITRD2 Tags found during parse
TagInitRd2Start:LongWord;
TagInitRd2Size:LongWord;

Tag serial

TagSerialCount:LongWord; Number of ARM SERIAL Tags found during parse
TagSerialNoLow:LongWord;
TagSerialNoHigh:LongWord;

Tag revision

TagRevisionCount:LongWord; Number of ARM REVISION Tags found during parse
TagRevisionNo:LongWord;

Tag video framebuffer

TagVideoFBCount:LongWord; Number of ARM VIDEOLFB Tags found during parse

Tag command

TagCmdCount:LongWord; Number of ARM CMDLINE Tags found during parse
TagCommandSize:LongWord; Length of the command line in characters (Including null terminator)
TagCommandCount:LongInt; Count of parameters (space delimited) in the command line
TagCommandAddress:PChar; Pointer to the start of the command line

Wait handlers

AARCH64WaitHandler:TAARCH64Wait;
AARCH64LongWaitHandler:TAARCH64LongWait;
AARCH64ShortWaitHandler:TAARCH64ShortWait;

Blink handlers

AARCH64SlowBlinkHandler:TAARCH64SlowBlink;
AARCH64FastBlinkHandler:TAARCH64FastBlink;


Function declarations



Initialization functions

procedure AARCH64Init;
Description: To be documented
Note None documented


AARCH64 platform functions

procedure AARCH64ParseBootTags;
Description: Extract some information from the ARM boot tag list and use it to load the memory manager, some other information is stored in variables for future use
Note None documented


function ExtractCommandLine(Value:PChar):Boolean;
Description: To be documented
Note None documented


function ExtractMemoryBlock(Address,Size:LongWord):Boolean;
Description: To be documented
Note None documented


function ExtractInitialRamdisk(Address,Size:LongWord):Boolean;
Description: To be documented
Note None documented


procedure AARCH64ParseCommandLine;
Description: Setup argc, argv and cmdline and process known command line options
Note None documented


procedure AARCH64ParseEnvironment;
Description: Setup envp and process known environment options
Note None documented


function AARCH64GetSP:PtrUInt; assembler; nostackframe;
Description: Get the current stack pointer (SP)
Note None documented


function AARCH64GetPC:PtrUInt; assembler; nostackframe;
Description: Get the current program counter (PC)
Note None documented


function AARCH64GetIRQ:Boolean; assembler; nostackframe;
Description: Get Interrupts (IRQ) state
Return True is enabled, False if disabled (Returned in R0).


procedure AARCH64EnableIRQ; assembler; nostackframe;
Description: Enable Interrupts (IRQ) unconditionally
Note None documented


procedure AARCH64DisableIRQ; assembler; nostackframe;
Description: Disable Interrupts (IRQ) unconditionally
Note None documented


function AARCH64SaveIRQ:TIRQMask; assembler; nostackframe;
Description: Disable Interrupts (IRQ) and return the previous state
Return IRQ state when called (Returned in R0)


function AARCH64RestoreIRQ(IRQMask:TIRQMask):TIRQMask; assembler; nostackframe;
Description: Restore Interrupts (IRQ) to a previous state
IRQMask IRQ state to restore (Passed in R0)
Return IRQ state when called (Returned in R0)


function AARCH64GetFIQ:Boolean; assembler; nostackframe;
Description: Get Fast Interrupts (FIQ) state
Return True is enabled, False if disabled (Returned in R0).


procedure AARCH64EnableFIQ; assembler; nostackframe;
Description: Enable Fast Interrupts (FIQ) unconditionally
Note None documented


procedure AARCH64DisableFIQ; assembler; nostackframe;
Description: Disable Fast Interrupts (FIQ) unconditionally
Note None documented


function AARCH64SaveFIQ:TFIQMask; assembler; nostackframe;
Description: Disable Fast Interrupts (FIQ) and return the previous state
Return FIQ state when called (Returned in R0)


function AARCH64RestoreFIQ(FIQMask:TFIQMask):TFIQMask; assembler; nostackframe;
Description: Restore Fast Interrupts (FIQ) to a previous state
FIQMask FIQ state to restore (Passed in R0)
Return FIQ state when called (Returned in R0)


procedure AARCH64EnableIRQFIQ; assembler; nostackframe;
Description: Enable Interrupts and Fast Interrupts (IRQ/FIQ) unconditionally
Note None documented


procedure AARCH64DisableIRQFIQ; assembler; nostackframe;
Description: Disable Interrupts and Fast Interrupts (IRQ/FIQ) unconditionally
Note None documented


function AARCH64SaveIRQFIQ:TIRQFIQMask; assembler; nostackframe;
Description: Disable Interrupts and Fast Interrupts (IRQ/FIQ) and return the previous state
Return IRQ/FIQ state when called (Returned in R0)


function AARCH64RestoreIRQFIQ(IRQFIQMask:TIRQFIQMask):TIRQFIQMask; assembler; nostackframe;
Description: Restore Interrupts and Fast Interrupts (IRQ/FIQ) to a previous state
IRQFIQMask IRQ/FIQ state to restore (Passed in R0)
Return IRQ/FIQ state when called (Returned in R0)


function AARCH64GetAbort:Boolean; assembler; nostackframe;
Description: Get Abort state
Return True is enabled, False if disabled (Returned in R0).


procedure AARCH64EnableAbort; assembler; nostackframe;
Description: Enable Aborts unconditionally
Note None documented


procedure AARCH64DisableAbort; assembler; nostackframe;
Description: Disable Aborts unconditionally
Note None documented


function AARCH64SaveAbort:TAbortMask; assembler; nostackframe;
Description: Disable Aborts and return the previous state
Return Abort state when called (Returned in R0)


function AARCH64RestoreAbort(AbortMask:TAbortMask):TAbortMask; assembler; nostackframe;
Description: Restore Aborts to a previous state
AbortMask Abort state to restore (Passed in R0)
Return Abort state when called (Returned in R0)


AARCH64 helper functions

procedure AARCH64Wait; inline;
Description: To be documented
Note None documented


procedure AARCH64LongWait; inline;
Description: To be documented
Note None documented


procedure AARCH64ShortWait; inline;
Description: To be documented
Note None documented


procedure AARCH64SlowBlink; inline;
Description: To be documented
Note None documented


procedure AARCH64FastBlink; inline;
Description: To be documented
Note None documented


function AARCH64ModeToString(AARCH64Mode:LongWord):String;
Description: To be documented
Note None documented


Return to Unit Reference