From 8df1f408fd8c4f67629f32470b5b7d94123bc305 Mon Sep 17 00:00:00 2001 From: Christian Mauderer Date: Mon, 2 Jun 2014 16:31:51 +0200 Subject: score/sparc: Add support for paravirtualization Guest systems in paravirtualization environments run usually in user mode. Thus it is not possible to directly access the PSR and TBR registers. Use functions instead of inline assembler to access these registers if RTEMS_PARAVIRT is defined. --- c/src/lib/libbsp/sparc/erc32/Makefile.am | 1 + c/src/lib/libbsp/sparc/leon2/Makefile.am | 1 + c/src/lib/libbsp/sparc/leon3/Makefile.am | 1 + c/src/lib/libbsp/sparc/leon3/startup/bspsmp.c | 2 +- c/src/lib/libbsp/sparc/shared/cpu.c | 36 +++++++++++++++++++++++++++ c/src/lib/libcpu/sparc/syscall/syscall.S | 36 +++++++++++++++++++++++++++ 6 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 c/src/lib/libbsp/sparc/shared/cpu.c (limited to 'c') diff --git a/c/src/lib/libbsp/sparc/erc32/Makefile.am b/c/src/lib/libbsp/sparc/erc32/Makefile.am index abf8eca618..d5de3776fa 100644 --- a/c/src/lib/libbsp/sparc/erc32/Makefile.am +++ b/c/src/lib/libbsp/sparc/erc32/Makefile.am @@ -46,6 +46,7 @@ libbsp_a_SOURCES += startup/bspidle.c libbsp_a_SOURCES += startup/bspdelay.c libbsp_a_SOURCES += ../../sparc/shared/startup/early_malloc.c # ISR Handler +libbsp_a_SOURCES += ../../sparc/shared/cpu.c libbsp_a_SOURCES += ../../sparc/shared/irq_asm.S # gnatsupp libbsp_a_SOURCES += gnatsupp/gnatsupp.c ../../sparc/shared/gnatcommon.c diff --git a/c/src/lib/libbsp/sparc/leon2/Makefile.am b/c/src/lib/libbsp/sparc/leon2/Makefile.am index f913462a41..e808b33723 100644 --- a/c/src/lib/libbsp/sparc/leon2/Makefile.am +++ b/c/src/lib/libbsp/sparc/leon2/Makefile.am @@ -62,6 +62,7 @@ libbsp_a_SOURCES += startup/bspdelay.c libbsp_a_SOURCES += ../../sparc/shared/startup/early_malloc.c # ISR Handler +libbsp_a_SOURCES += ../../sparc/shared/cpu.c libbsp_a_SOURCES += ../../sparc/shared/irq_asm.S # gnatsupp libbsp_a_SOURCES += gnatsupp/gnatsupp.c ../../sparc/shared/gnatcommon.c diff --git a/c/src/lib/libbsp/sparc/leon3/Makefile.am b/c/src/lib/libbsp/sparc/leon3/Makefile.am index 789c3d09fc..5dd43c3be9 100644 --- a/c/src/lib/libbsp/sparc/leon3/Makefile.am +++ b/c/src/lib/libbsp/sparc/leon3/Makefile.am @@ -43,6 +43,7 @@ libbsp_a_SOURCES += startup/bspreset.c libbsp_a_SOURCES += startup/cpucounter.c # ISR Handler +libbsp_a_SOURCES += ../../sparc/shared/cpu.c libbsp_a_SOURCES += ../../sparc/shared/irq_asm.S # gnatsupp libbsp_a_SOURCES += gnatsupp/gnatsupp.c ../../sparc/shared/gnatcommon.c diff --git a/c/src/lib/libbsp/sparc/leon3/startup/bspsmp.c b/c/src/lib/libbsp/sparc/leon3/startup/bspsmp.c index 6eec341f93..567eecc819 100644 --- a/c/src/lib/libbsp/sparc/leon3/startup/bspsmp.c +++ b/c/src/lib/libbsp/sparc/leon3/startup/bspsmp.c @@ -20,7 +20,7 @@ #include #include -#if !defined(__leon__) +#if !defined(__leon__) || defined(RTEMS_PARAVIRT) uint32_t _CPU_SMP_Get_current_processor( void ) { return _LEON3_Get_current_processor(); diff --git a/c/src/lib/libbsp/sparc/shared/cpu.c b/c/src/lib/libbsp/sparc/shared/cpu.c new file mode 100644 index 0000000000..12d347547b --- /dev/null +++ b/c/src/lib/libbsp/sparc/shared/cpu.c @@ -0,0 +1,36 @@ +/** + * @file + * + * @brief SPARC CPU Dependent Source + */ + +/* + * COPYRIGHT (c) 1989-2007. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.org/license/LICENSE. + */ + +#include + +/* + * This initializes the set of opcodes placed in each trap + * table entry. The routine which installs a handler is responsible + * for filling in the fields for the _handler address and the _vector + * trap type. + * + * The constants following this structure are masks for the fields which + * must be filled in when the handler is installed. + * + * This table is defined here to allow BSP specific versions, e.g. for guest + * systems under paravirtualization. + */ + +const CPU_Trap_table_entry _CPU_Trap_slot_template = { + 0xa1480000, /* mov %psr, %l0 */ + 0x29000000, /* sethi %hi(_handler), %l4 */ + 0x81c52000, /* jmp %l4 + %lo(_handler) */ + 0xa6102000 /* mov _vector, %l3 */ +}; diff --git a/c/src/lib/libcpu/sparc/syscall/syscall.S b/c/src/lib/libcpu/sparc/syscall/syscall.S index a36ffaf220..9ce7fa54ef 100644 --- a/c/src/lib/libcpu/sparc/syscall/syscall.S +++ b/c/src/lib/libcpu/sparc/syscall/syscall.S @@ -83,4 +83,40 @@ SYM(sparc_syscall_exit): mov %o1, %g3 ! Additional exit code 2 ta 0 +#if defined(RTEMS_PARAVIRT) + + PUBLIC(_SPARC_Get_PSR) + +SYM(_SPARC_Get_PSR): + + retl + rd %psr, %o0 + + PUBLIC(_SPARC_Set_PSR) + +SYM(_SPARC_Set_PSR): + + mov %o0, %psr + nop + nop + nop + retl + nop + + PUBLIC(_SPARC_Get_TBR) + +SYM(_SPARC_Get_TBR): + + retl + rd %tbr, %o0 + + PUBLIC(_SPARC_Set_TBR) + +SYM(_SPARC_Set_TBR): + + retl + wr %o0, 0, %tbr + +#endif /* defined(RTEMS_PARAVIRT) */ + /* end of file */ -- cgit v1.2.3