diff --git a/Docs/HAL/Entries b/Docs/HAL/Entries index 59e134130ed9d97c8454d97812a632decd4a18e2..6b01b5b88f4e6c20e3721e5300654448cba57653 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 1ad41a24df2bb071a6c4edd422f10eb2ea44cbc0..f45c9b0822b3e8930ab98bdcb9de4c7083cd0dd2 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 5f3ed41e26e1a3d0e3373493484b922ea8ac9398..b5c551e90b02435f65f838c0610823c9b26454b9 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 1e72e5a98a2b30d03770e102dae737e31031531c..93443cf1f32aa86d12640c459c71e23c406256b7 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 91944e821f7430f931dcfe1f87e4f1e23edbe666..67baf0997f4236189b917d4d6ddaaaf890005e15 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 53564e2df9c5d878000a753b46206e00ff7ac99e..c1a608b3d83b618ff046891ba8ed2bba32abab7c 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 ae9d343de8e075fa69854007132689f9608bf3de..cfad075d1c3049ef2b2ff9945dc8b54808e8c3f9 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