From 7924aae2d65e4ad2368e97cd6308e999bd1b1ca1 Mon Sep 17 00:00:00 2001
From: Jeffrey Lee <me@phlamethrower.co.uk>
Date: Thu, 14 Nov 2019 20:06:08 +0000
Subject: [PATCH] [RISCOS_]AccessPhysicalAddress uses page flags

Currently RISCOS_AccessPhysicalAddress allows the caller to specify the
permissions/properties of the mapped memory by directly specifying some
of the L1 page table entry flags. This will complicate things when
adding support for more page table formats, so change it so that
standard RISC OS page flags are used instead (like the alternate entry
point, RISCOS_AccessPhysicalAddressUnchecked, already uses).

Also, drop the "RISCOS_" prefix from RISCOS_AccessPhysicalAddress and
RISCOS_ReleasePhysicalAddress, and remove the references to these
routines from the HAL docs. These routines have never been exposed to
the HAL, so renaming them and removing them from the docs should make
their status clearer.

Version 6.52. Tagged as 'Kernel-6_52'
---
 Docs/HAL/Entries | 60 ------------------------------------------------
 Docs/HAL/HAL_API | 55 --------------------------------------------
 VersionASM       | 12 +++++-----
 VersionNum       | 20 ++++++++--------
 s/ChangeDyn      | 18 +++++++--------
 s/HAL            | 53 +++++++++++++++++++++++++++---------------
 s/MemInfo        |  8 +++----
 7 files changed, 63 insertions(+), 163 deletions(-)

diff --git a/Docs/HAL/Entries b/Docs/HAL/Entries
index 59e1341..6b01b5b 100644
--- a/Docs/HAL/Entries
+++ b/Docs/HAL/Entries
@@ -276,66 +276,6 @@ Usage:
 
 
 
-void *RISCOS_AccessPhysicalAddress(unsigned int flags, uint64_t phys, void **oldp)
-
-   flags: bit 2 => make memory bufferable
-          other bits must be zero
-    phys: physical address to access
-    oldp: pointer to location to store old state (or NULL)
-
-On entry:
-  Privileged mode
-  MMU on
-  FIQs on
-  Re-entrant
-
-On exit:
-  Returns logical address corresponding to phys
-
-Usage:
-  Arranges for the physical address phys to be mapped in to logical memory.
-  In fact, at least the whole megabyte containing "phys" is mapped in (ie if phys =
-  &12345678, then &12300000 to &123FFFFF become available). The memory is
-  supervisor access only, non-cacheable, non-bufferable by default, and will
-  remain available until the next call to RISCOS_Release/AccessPhysicalAddress
-  (although interrupt routines or subroutines may temporarily map in something
-  else).
-
-  When finished, the user should call RISCOS_ReleasePhysicalAddress.
-
-
-
-
-void RISCOS_ReleasePhysicalAddress(void *old)
-
-  old: state returned from a previous call to RISCOS_AccessPhysicalAddress
-
-On entry:
-  MMU on
-  FIQs on
-  Re-entrant
-
-Usage:
-  Call with the a value output from a previous RISCOS_ReleasePhysicalAddress.
-
-Example:
-
-  void *old;
-  uint64_t addr_physical = (uint64_t) 0x80005000;
-  uint64_t addr2_physical = (uint64_t) 0x90005000;
-  uint32_t *addr_logical;
-  uint32_t *addr2_logical;
-
-  addr_logical = (unsigned int *) RISCOS_AccessPhysicalAddress(0, addr_physical, &old);
-  addr_logical[0] = 3; addr_logical[1] = 5;
-
-  addr2_logical = (unsigned int *) RISCOS_AccessPhysicalAddress(0, addr2_physical, NULL);
-  *addr2_logical = 7;
-
-  RISCOS_ReleasePhysicalAddress(old);
-
-
-
 
 
 HAL entries
diff --git a/Docs/HAL/HAL_API b/Docs/HAL/HAL_API
index 1ad41a2..f45c9b0 100644
--- a/Docs/HAL/HAL_API
+++ b/Docs/HAL/HAL_API
@@ -1042,58 +1042,3 @@ if the virtual address space is exhausted.
 -- void *RISCOS_MapInIO64(unsigned int flags, uint64_t phys, unsigned int size)
 
 As for RISCOS_MapInIO, but accepting a 64-bit physical address argument.
-
-
--- void *RISCOS_AccessPhysicalAddress(unsigned int flags, uint64_t phys, void **oldp)
-
-   flags: bit 2 => make memory bufferable
-          other bits must be zero
-    phys: physical address to access
-    oldp: pointer to location to store old state (or NULL)
-
-On entry:
-  Privileged mode
-  MMU on
-  FIQs on
-  Re-entrant
-
-On exit:
-  Returns logical address corresponding to phys
-
-Arranges for the physical address phys to be mapped in to logical memory. In
-fact, at least the whole megabyte containing "phys" is mapped in (ie if phys =
-&12345678, then &12300000 to &123FFFFF become available). The memory is
-supervisor access only, non-cacheable, non-bufferable by default, and will
-remain available until the next call to RISCOS_Release/AccessPhysicalAddress
-(although interrupt routines or subroutines may temporarily map in something
-else).
-
-When finished, the user should call RISCOS_ReleasePhysicalAddress.
-
--- void RISCOS_ReleasePhysicalAddress(void *old)
-
-  old: state returned from a previous call to RISCOS_AccessPhysicalAddress
-
-On entry:
-  MMU on
-  FIQs on
-  Re-entrant
-
-Usage:
-  Call with the a value output from a previous RISCOS_ReleasePhysicalAddress.
-
-Example:
-
-  void *old;
-  uint64_t addr_physical = (uint64_t) 0x80005000;
-  uint64_t addr2_physical = (uint64_t) 0x90005000;
-  uint32_t *addr_logical;
-  uint32_t *addr2_logical;
-
-  addr_logical = (uint32_t *) RISCOS_AccessPhysicalAddress(0, addr_physical, &old);
-  addr_logical[0] = 3; addr_logical[1] = 5;
-
-  addr2_logical = (uint32_t *) RISCOS_AccessPhysicalAddress(0, addr2_physical, NULL);
-  *addr2_logical = 7;
-
-  RISCOS_ReleasePhysicalAddress(old);
diff --git a/VersionASM b/VersionASM
index 5f3ed41..b5c551e 100644
--- a/VersionASM
+++ b/VersionASM
@@ -9,12 +9,12 @@
                         GBLS    Module_ApplicationDate
                         GBLS    Module_HelpVersion
                         GBLS    Module_ComponentName
-Module_MajorVersion     SETS    "6.51"
-Module_Version          SETA    651
+Module_MajorVersion     SETS    "6.52"
+Module_Version          SETA    652
 Module_MinorVersion     SETS    ""
-Module_Date             SETS    "10 Feb 2021"
-Module_ApplicationDate  SETS    "10-Feb-21"
+Module_Date             SETS    "13 Feb 2021"
+Module_ApplicationDate  SETS    "13-Feb-21"
 Module_ComponentName    SETS    "Kernel"
-Module_FullVersion      SETS    "6.51"
-Module_HelpVersion      SETS    "6.51 (10 Feb 2021)"
+Module_FullVersion      SETS    "6.52"
+Module_HelpVersion      SETS    "6.52 (13 Feb 2021)"
                         END
diff --git a/VersionNum b/VersionNum
index 1e72e5a..93443cf 100644
--- a/VersionNum
+++ b/VersionNum
@@ -1,21 +1,21 @@
-/* (6.51)
+/* (6.52)
  *
  * This file is automatically maintained by srccommit, do not edit manually.
  *
  */
-#define Module_MajorVersion_CMHG        6.51
+#define Module_MajorVersion_CMHG        6.52
 #define Module_MinorVersion_CMHG
-#define Module_Date_CMHG                10 Feb 2021
+#define Module_Date_CMHG                13 Feb 2021
 
-#define Module_MajorVersion             "6.51"
-#define Module_Version                  651
+#define Module_MajorVersion             "6.52"
+#define Module_Version                  652
 #define Module_MinorVersion             ""
-#define Module_Date                     "10 Feb 2021"
+#define Module_Date                     "13 Feb 2021"
 
-#define Module_ApplicationDate          "10-Feb-21"
+#define Module_ApplicationDate          "13-Feb-21"
 
 #define Module_ComponentName            "Kernel"
 
-#define Module_FullVersion              "6.51"
-#define Module_HelpVersion              "6.51 (10 Feb 2021)"
-#define Module_LibraryVersionInfo       "6:51"
+#define Module_FullVersion              "6.52"
+#define Module_HelpVersion              "6.52 (13 Feb 2021)"
+#define Module_LibraryVersionInfo       "6:52"
diff --git a/s/ChangeDyn b/s/ChangeDyn
index 91944e8..67baf09 100644
--- a/s/ChangeDyn
+++ b/s/ChangeDyn
@@ -5934,11 +5934,11 @@ DoTheGrowPagesSpecified ROUT
 ReplacePage_DestUnmapped
         Push    "r1"
         FastCDA_ProfStart AccessPhysical, r2, r1, lr
-        MOV     r0, #L1_B
+        LDR     r0, =OSAP_None+DynAreaFlags_NotCacheable
         LDR     r1, [r8, #PageBlockSize+8]      ; r1 = physical address of dest for copy
         MOV     r2, #0
         ADD     r3, sp, #4
-        BL      RISCOS_AccessPhysicalAddress
+        BL      AccessPhysicalAddress
         ; r0 = logical address of dest for copy
         FastCDA_ProfEnd AccessPhysical, r2, r1, lr
         Pull    "r1"
@@ -5954,11 +5954,11 @@ ReplacePage_BothUnmapped
         ; than the SVC stack
         Push    "r0,r1"
         FastCDA_ProfStart AccessPhysical, r0, r1, lr
-        MOV     r0, #L1_B
+        LDR     r0, =OSAP_None+DynAreaFlags_NotCacheable
         LDR     r1, [r8, #8]                    ; r1 = physical address of src for copy
         MOV     r2, #0
         ADD     r3, sp, #8
-        BL      RISCOS_AccessPhysicalAddress
+        BL      AccessPhysicalAddress
         MOV     r6, r0                          ; r6 = logical address of src for copy
         FastCDA_ProfEnd AccessPhysical, r0, r1, lr
 
@@ -5977,11 +5977,11 @@ ReplacePage_BothUnmapped
         FastCDA_ProfEnd CopyPage, r2, r3, r4
 
         ; Now map in dest
-        MOV     r0, #L1_B
+        LDR     r0, =OSAP_None+DynAreaFlags_NotCacheable
         LDR     r1, [r8, #PageBlockSize+8]      ; r1 = physical address of dest for copy
         MOV     r2, #0
         MOV     r3, #0                          ; no oldp needed
-        BL      RISCOS_AccessPhysicalAddress
+        BL      AccessPhysicalAddress
         ; r0 = logical address of dest for copy
         MOV     r6, sp
         FastCDA_ProfStart CopyPage, r2, r3, r4
@@ -6003,11 +6003,11 @@ ReplacePage_BothUnmapped
 ReplacePage_SrcUnmapped
         Push    "r0,r1"
         FastCDA_ProfStart AccessPhysical, r0, r1, lr
-        MOV     r0, #L1_B
+        LDR     r0, =OSAP_None+DynAreaFlags_NotCacheable
         LDR     r1, [r8, #8]                    ; r1 = physical address of src for copy
         MOV     r2, #0
         ADD     r3, sp, #8
-        BL      RISCOS_AccessPhysicalAddress
+        BL      AccessPhysicalAddress
         MOV     r6, r0                          ; r6 = logical address of src for copy
         FastCDA_ProfEnd AccessPhysical, r0, r1, lr
         Pull    "r0,r1"
@@ -6032,7 +6032,7 @@ ReplacePage_Done
         BEQ     %FT80
         FastCDA_ProfStart ReleasePhysical, r2, r3, r4
       ]
-        BLNE    RISCOS_ReleasePhysicalAddress
+        BLNE    ReleasePhysicalAddress
       [ FastCDA_Prof
         FastCDA_ProfEnd ReleasePhysical, r2, r3, r4
 80
diff --git a/s/HAL b/s/HAL
index 53564e2..c1a608b 100644
--- a/s/HAL
+++ b/s/HAL
@@ -982,7 +982,7 @@ MMUon_nol1ptoverlap
         ChangedProcVecs a1
 
         MOV     a1, #L1_Fault
-        BL      RISCOS_ReleasePhysicalAddress
+        BL      ReleasePhysicalAddress
 
         LDR     a1, =HALWorkspace
         LDR     a2, =ZeroPage
@@ -1808,12 +1808,12 @@ AllocateL2PT ROUT
 
         TEQ     v3, #0                          ; MMU on?
         MOVNE   a1, v4                          ; if not, just access v4
-        MOVEQ   a1, #L1_B                       ; if so, map in v4
+        LDREQ   a1, =OSAP_None+DynAreaFlags_NotCacheable ; if so, map in v4
         MOVEQ   a2, v4
         SUBEQ   sp, sp, #4
         MOVEQ   a3, #0
         MOVEQ   a4, sp
-        BLEQ    RISCOS_AccessPhysicalAddress
+        BLEQ    AccessPhysicalAddress
 
         MOV     a2, #0
         MOV     a3, #4*1024
@@ -1821,7 +1821,7 @@ AllocateL2PT ROUT
 
         TEQ     v3, #0
         LDREQ   a1, [sp], #4
-        BLEQ    RISCOS_ReleasePhysicalAddress
+        BLEQ    ReleasePhysicalAddress
 
         ; Get the correct page table entry flags for Init_MapInPage
         TEQ     v3, #0
@@ -1893,15 +1893,25 @@ $lab    ANDS    $tmp, $flags, #L1_SS
         MEND
 
 
-; void *RISCOS_AccessPhysicalAddress(unsigned int flags, uint64_t addr, void **oldp)
-RISCOS_AccessPhysicalAddress ROUT
-        ; Only flag user can ask for is bufferable
-        ; Convert to appropriate DA flags
-        ; (n.b. since this is an internal routine we should really change it to pass in DA flags directly)
-        TST     a1, #L1_B
-        LDR     a1, =OSAP_None + DynAreaFlags_NotCacheable ; SVC RW, USR none
-        ORREQ   a1, a1, #DynAreaFlags_NotBufferable
-RISCOS_AccessPhysicalAddressUnchecked                   ; well OK then, I trust you know what you're doing
+; void *AccessPhysicalAddress(unsigned int flags, uint64_t phys, void **oldp)
+;
+; APCS calling convention.
+;
+; flags: RISC OS page flags
+; phys: Physical address to access
+; oldp: Pointer to word to store old state (or NULL)
+;
+; On exit: Returns logical address corresponding to 'phys'.
+;
+; Arranges for the physical address 'phys' to be (temporarily) mapped into
+; logical memory. In fact, at least the whole megabyte containing 'phys' is
+; mapped in. All mappings use the same shared logical window; the current state
+; of the window will be returned in 'oldp', to allow it to be restored (via
+; ReleasePhysicalAddress) once you've finised with it.
+;
+; Note: No cache maintenance performed. Assumption is that mappings will be
+; non-cacheable.
+AccessPhysicalAddress ROUT
         ; Check physical address is valid on current CPU
         LDR     ip, =ZeroPage
         Push    "a1,v3,lr"
@@ -1948,8 +1958,13 @@ RISCOS_AccessPhysicalAddressUnchecked                   ; well OK then, I trust
         MOV     a1, #0
         Pull    "v3,pc"
 
-; void RISCOS_ReleasePhysicalAddress(void *old)
-RISCOS_ReleasePhysicalAddress
+; void ReleasePhysicalAddress(void *old)
+;
+; APCS calling convention.
+;
+; Call with the 'oldp' value from a previous AccessPhysicalAddress call to
+; restore previous physical access window state.
+ReleasePhysicalAddress
         LDR     ip, =L1PT + (PhysicalAccess:SHR:18)     ; ip -> L1PT entry
         MOV     a4, #15
         STR     a1, [ip], #4                            ; restore first of 16 L1PT entries
@@ -2151,7 +2166,7 @@ ClearFreePoolSection ROUT
         MOV     a2, r8
         MOV     a3, r9
         MOV     a4, #0
-        BL      RISCOS_AccessPhysicalAddressUnchecked
+        BL      AccessPhysicalAddress
 
         MOV     r5, r8, LSR #20
         ORR     r5, r5, r9, LSL #12                     ; r5 = physical MB
@@ -2227,11 +2242,11 @@ ClearFreePoolSection ROUT
         ; Make page uncacheable so the following is safe
         MOV     r4, r0
 
-        MOV     r0, #L1_B
+        LDR     r0, =OSAP_None+DynAreaFlags_NotCacheable
         MOV     r1, r10, LSL #20
         MOV     r2, r10, LSR #12
         MOV     r3, #0
-        BL      RISCOS_AccessPhysicalAddress
+        BL      AccessPhysicalAddress
 
         MOV     r0, r4
 
@@ -2256,7 +2271,7 @@ ClearFreePoolSection ROUT
  ]
 91
         MOV     a1, #L1_Fault
-        BL      RISCOS_ReleasePhysicalAddress           ; reset to default
+        BL      ReleasePhysicalAddress                  ; reset to default
 
         Pull    "r0-r12"
 
diff --git a/s/MemInfo b/s/MemInfo
index ae9d343..cfad075 100644
--- a/s/MemInfo
+++ b/s/MemInfo
@@ -963,11 +963,11 @@ AccessPhysAddr ROUT
 AccessPhysAddr64
         Push    "r0-r3,r12,lr"
 10      TST     r0, #&100           ;test bufferable bit
-        MOVNE   r0, #L1_B
-        MOVEQ   r0, #0
+        LDR     r0, =OSAP_None+DynAreaFlags_NotCacheable
+        ORREQ   r0, r0, #DynAreaFlags_NotBufferable
         SUB     sp, sp, #4          ; word for old state
         MOV     r3, sp              ; pointer to word
-        BL      RISCOS_AccessPhysicalAddress
+        BL      AccessPhysicalAddress
         MOVS    r2, r0              ; null pointer means invalid physical address
         LDMIB   sp, {r0,r1}
         BEQ     %FT90
@@ -989,7 +989,7 @@ AccessPhysAddr64
 ReleasePhysAddr
         Push    "r0-r3,r12,lr"
         MOV     r0, r1
-        BL      RISCOS_ReleasePhysicalAddress
+        BL      ReleasePhysicalAddress
         Pull    "r0-r3,r12,pc"
 
         LTORG
-- 
GitLab