[OpenBIOS] [PATCH 6/9] SPARC64: add spacec@, spacew@, spacel@ and spacex@ Forth words
Mark Cave-Ayland
mark.cave-ayland at ilande.co.uk
Sun Oct 23 16:22:41 CEST 2016
These perform reads using the given ASI and are used by the Milax
startup code.
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland at ilande.co.uk>
---
arch/sparc64/openbios.c | 135 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 135 insertions(+)
diff --git a/arch/sparc64/openbios.c b/arch/sparc64/openbios.c
index 3b7bc46..d624eb2 100644
--- a/arch/sparc64/openbios.c
+++ b/arch/sparc64/openbios.c
@@ -128,6 +128,135 @@ sparc64_set_tas_register(unsigned long val)
: : "r" (val), "r" (addr) : "memory");
}
+/* space?@ and and space?! words */
+static uint8_t
+sparc64_asi_loadb(uint8_t asi, unsigned long address)
+{
+ uint8_t asi_save;
+ uint8_t ret = 0;
+
+ __asm__ __volatile__("rd %%asi, %0" : "=r" (asi_save));
+ __asm__ __volatile__("wr %0, 0, %%asi" : : "r" (asi));
+
+ __asm__ __volatile__("ldub [%1], %0"
+ : "=r" (ret)
+ : "r" (address));
+
+ __asm__ __volatile__("wr %0, 0, %%asi" : : "r" (asi_save));
+
+ return ret;
+}
+
+/* spacec@ */
+static void
+spacec_read(void)
+{
+ uint8_t ret;
+
+ uint8_t asi = POP();
+ ucell address = POP();
+
+ ret = sparc64_asi_loadb(asi, address);
+
+ PUSH(ret);
+}
+
+static uint16_t
+sparc64_asi_loadw(uint8_t asi, unsigned long address)
+{
+ uint8_t asi_save;
+ uint16_t ret;
+
+ __asm__ __volatile__("rd %%asi, %0" : "=r" (asi_save));
+ __asm__ __volatile__("wr %0, 0, %%asi" : : "r" (asi));
+
+ __asm__ __volatile__("lduw [%1], %0"
+ : "=r" (ret)
+ : "r" (address));
+
+ __asm__ __volatile__("wr %0, 0, %%asi" : : "r" (asi_save));
+
+ return ret;
+}
+
+/* spacew@ */
+static void
+spacew_read(void)
+{
+ uint16_t ret;
+
+ uint8_t asi = POP();
+ ucell address = POP();
+
+ ret = sparc64_asi_loadw(asi, address);
+
+ PUSH(ret);
+}
+
+static uint32_t
+sparc64_asi_loadl(uint8_t asi, unsigned long address)
+{
+ uint8_t asi_save;
+ uint32_t ret;
+
+ __asm__ __volatile__("rd %%asi, %0" : "=r" (asi_save));
+ __asm__ __volatile__("wr %0, 0, %%asi" : : "r" (asi));
+
+ __asm__ __volatile__("ld [%1], %0"
+ : "=r" (ret)
+ : "r" (address));
+
+ __asm__ __volatile__("wr %0, 0, %%asi" : : "r" (asi_save));
+
+ return ret;
+}
+
+/* spacel@ */
+static void
+spacel_read(void)
+{
+ uint32_t ret;
+
+ uint8_t asi = POP();
+ ucell address = POP();
+
+ ret = sparc64_asi_loadl(asi, address);
+
+ PUSH(ret);
+}
+
+static uint64_t
+sparc64_asi_loadx(uint8_t asi, unsigned long address)
+{
+ uint8_t asi_save;
+ uint64_t ret = 0;
+
+ __asm__ __volatile__("rd %%asi, %0" : "=r" (asi_save));
+ __asm__ __volatile__("wr %0, 0, %%asi" : : "r" (asi));
+
+ __asm__ __volatile__("ldx [%1], %0"
+ : "=r" (ret)
+ : "r" (address));
+
+ __asm__ __volatile__("wr %0, 0, %%asi" : : "r" (asi_save));
+
+ return ret;
+}
+
+/* spacex@ */
+static void
+spacex_read(void)
+{
+ uint64_t ret;
+
+ uint8_t asi = POP();
+ ucell address = POP();
+
+ ret = sparc64_asi_loadx(asi, address);
+
+ PUSH(ret);
+}
+
static void cpu_generic_init(const struct cpudef *cpu, uint32_t clock_frequency)
{
unsigned long iu_version;
@@ -586,6 +715,12 @@ arch_init( void )
fword("obp-ticks");
obp_ticks_pointer = cell2pointer(POP());
+ /* Bind to space?@ functions */
+ bind_func("spacec@", spacec_read);
+ bind_func("spacew@", spacew_read);
+ bind_func("spacel@", spacel_read);
+ bind_func("spacex@", spacex_read);
+
bind_func("platform-boot", boot );
}
--
1.7.10.4
More information about the OpenBIOS
mailing list