First of all: Thanks for your comments. You will find answers below. Am 20.05.2014 16:58, schrieb Gedare Bloom: > On Tue, May 20, 2014 at 5:16 AM, Christian Mauderer > <christian.maude...@embedded-brains.de> wrote: >> From: Christian Mauderer <christian.maude...@embedded-brains.de> >> >> --- >> c/src/lib/libbsp/shared/include/fatal.h | 6 +- >> c/src/lib/libbsp/sparc/acinclude.m4 | 2 + >> c/src/lib/libbsp/sparc/shared/irq_asm.S | 97 ++++++++++++++++ >> c/src/lib/libbsp/sparc/shared/start/start.S | 58 +++++++++- >> .../lib/libbsp/sparc/shared/startup/linkcmds.base | 19 ++++ >> c/src/lib/libbsp/sparc/xtratum/Makefile.am | 119 >> ++++++++++++++++++++ >> c/src/lib/libbsp/sparc/xtratum/README | 8 ++ >> c/src/lib/libbsp/sparc/xtratum/bsp_specs | 17 +++ >> .../sparc/xtratum/clock/clock-xtratum-exec.c | 23 ++++ >> .../libbsp/sparc/xtratum/clock/clock-xtratum-hw.c | 21 ++++ >> .../lib/libbsp/sparc/xtratum/clock/clock-xtratum.h | 103 +++++++++++++++++ >> c/src/lib/libbsp/sparc/xtratum/configure.ac | 33 ++++++ >> .../libbsp/sparc/xtratum/console/console-config.c | 27 +++++ >> .../libbsp/sparc/xtratum/console/printk-support.c | 28 +++++ >> .../sparc/xtratum/console/xtratum-hyper-console.c | 71 ++++++++++++ >> c/src/lib/libbsp/sparc/xtratum/include/bsp.h | 52 +++++++++ >> c/src/lib/libbsp/sparc/xtratum/include/cache_.h | 113 +++++++++++++++++++ >> .../sparc/xtratum/include/clock-xtratum-exec.h | 26 +++++ >> c/src/lib/libbsp/sparc/xtratum/include/irq.h | 2 + >> c/src/lib/libbsp/sparc/xtratum/include/tm27.h | 30 +++++ >> .../sparc/xtratum/include/xtratum-hyper-console.h | 30 +++++ >> c/src/lib/libbsp/sparc/xtratum/include/xtratum.h | 87 +++++++++++++++ >> c/src/lib/libbsp/sparc/xtratum/irq/irq.c | 77 +++++++++++++ >> .../libbsp/sparc/xtratum/make/custom/xtratum.cfg | 55 +++++++++ >> c/src/lib/libbsp/sparc/xtratum/preinstall.am | 123 >> +++++++++++++++++++++ >> .../libbsp/sparc/xtratum/startup/bsppredriver.c | 7 ++ >> c/src/lib/libbsp/sparc/xtratum/startup/bspreset.c | 52 +++++++++ >> c/src/lib/libbsp/sparc/xtratum/startup/bspsmp.c | 104 +++++++++++++++++ >> c/src/lib/libbsp/sparc/xtratum/startup/bspstart.c | 22 ++++ >> .../libbsp/sparc/xtratum/startup/example_xm_cf.xml | 66 +++++++++++ >> .../lib/libbsp/sparc/xtratum/startup/isr-en-dis.S | 50 +++++++++ >> .../libbsp/sparc/xtratum/startup/linkcmds.xtratum | 20 ++++ >> c/src/lib/libbsp/sparc/xtratum/startup/psr.c | 26 +++++ >> c/src/lib/libbsp/sparc/xtratum/startup/setvec.c | 61 ++++++++++ >> c/src/lib/libbsp/sparc/xtratum/startup/spurious.c | 35 ++++++ >> c/src/lib/libbsp/sparc/xtratum/startup/tbr.c | 30 +++++ >> c/src/lib/libbsp/sparc/xtratum/xm/xmhdr.c | 36 ++++++ >> cpukit/score/cpu/sparc/rtems/score/cpu.h | 11 +- >> testsuites/smptests/smpfatal08/init.c | 3 +- >> 39 files changed, 1735 insertions(+), 15 deletions(-) >> create mode 100644 c/src/lib/libbsp/sparc/xtratum/Makefile.am >> create mode 100644 c/src/lib/libbsp/sparc/xtratum/README >> create mode 100644 c/src/lib/libbsp/sparc/xtratum/bsp_specs >> create mode 100644 c/src/lib/libbsp/sparc/xtratum/clock/clock-xtratum-exec.c >> create mode 100644 c/src/lib/libbsp/sparc/xtratum/clock/clock-xtratum-hw.c >> create mode 100644 c/src/lib/libbsp/sparc/xtratum/clock/clock-xtratum.h >> create mode 100644 c/src/lib/libbsp/sparc/xtratum/configure.ac >> create mode 100644 c/src/lib/libbsp/sparc/xtratum/console/console-config.c >> create mode 100644 c/src/lib/libbsp/sparc/xtratum/console/printk-support.c >> create mode 100644 >> c/src/lib/libbsp/sparc/xtratum/console/xtratum-hyper-console.c >> create mode 100644 c/src/lib/libbsp/sparc/xtratum/include/bsp.h >> create mode 100644 c/src/lib/libbsp/sparc/xtratum/include/cache_.h >> create mode 100644 >> c/src/lib/libbsp/sparc/xtratum/include/clock-xtratum-exec.h >> create mode 100644 c/src/lib/libbsp/sparc/xtratum/include/irq.h >> create mode 100644 c/src/lib/libbsp/sparc/xtratum/include/tm27.h >> create mode 100644 >> c/src/lib/libbsp/sparc/xtratum/include/xtratum-hyper-console.h >> create mode 100644 c/src/lib/libbsp/sparc/xtratum/include/xtratum.h >> create mode 100644 c/src/lib/libbsp/sparc/xtratum/irq/irq.c >> create mode 100644 c/src/lib/libbsp/sparc/xtratum/make/custom/xtratum.cfg >> create mode 100644 c/src/lib/libbsp/sparc/xtratum/preinstall.am >> create mode 100644 c/src/lib/libbsp/sparc/xtratum/startup/bsppredriver.c >> create mode 100644 c/src/lib/libbsp/sparc/xtratum/startup/bspreset.c >> create mode 100644 c/src/lib/libbsp/sparc/xtratum/startup/bspsmp.c >> create mode 100644 c/src/lib/libbsp/sparc/xtratum/startup/bspstart.c >> create mode 100644 c/src/lib/libbsp/sparc/xtratum/startup/example_xm_cf.xml >> create mode 100644 c/src/lib/libbsp/sparc/xtratum/startup/isr-en-dis.S >> create mode 100644 c/src/lib/libbsp/sparc/xtratum/startup/linkcmds.xtratum >> create mode 100644 c/src/lib/libbsp/sparc/xtratum/startup/psr.c >> create mode 100644 c/src/lib/libbsp/sparc/xtratum/startup/setvec.c >> create mode 100644 c/src/lib/libbsp/sparc/xtratum/startup/spurious.c >> create mode 100644 c/src/lib/libbsp/sparc/xtratum/startup/tbr.c >> create mode 100644 c/src/lib/libbsp/sparc/xtratum/xm/xmhdr.c >> >> diff --git a/c/src/lib/libbsp/shared/include/fatal.h >> b/c/src/lib/libbsp/shared/include/fatal.h >> index e928bba..8ca90bb 100644 >> --- a/c/src/lib/libbsp/shared/include/fatal.h >> +++ b/c/src/lib/libbsp/shared/include/fatal.h >> @@ -101,7 +101,11 @@ typedef enum { >> PPC_FATAL_EXCEPTION_INITIALIZATION = BSP_FATAL_CODE_BLOCK(7), >> >> /* Libchip fatal codes */ >> - DWMAC_FATAL_TOO_MANY_RBUFS_CONFIGURED = BSP_FATAL_CODE_BLOCK(8) >> + DWMAC_FATAL_TOO_MANY_RBUFS_CONFIGURED = BSP_FATAL_CODE_BLOCK(8), >> + >> + /* XtratuM fatal codes */ >> + XTRATUM_FATAL_CLOCK_IRQ_INSTALL = BSP_FATAL_CODE_BLOCK(9), >> + XTRATUM_FATAL_CPU_SMP_INITIALIZE >> } bsp_fatal_code; >> >> RTEMS_COMPILER_NO_RETURN_ATTRIBUTE static inline void >> diff --git a/c/src/lib/libbsp/sparc/acinclude.m4 >> b/c/src/lib/libbsp/sparc/acinclude.m4 >> index 4d40305..0e053fa 100644 >> --- a/c/src/lib/libbsp/sparc/acinclude.m4 >> +++ b/c/src/lib/libbsp/sparc/acinclude.m4 >> @@ -8,6 +8,8 @@ AC_DEFUN([RTEMS_CHECK_BSPDIR], >> AC_CONFIG_SUBDIRS([leon2]);; >> leon3 ) >> AC_CONFIG_SUBDIRS([leon3]);; >> + xtratum ) >> + AC_CONFIG_SUBDIRS([xtratum]);; >> *) >> AC_MSG_ERROR([Invalid BSP]);; >> esac >> diff --git a/c/src/lib/libbsp/sparc/shared/irq_asm.S >> b/c/src/lib/libbsp/sparc/shared/irq_asm.S >> index bf2dca9..69522a2 100644 >> --- a/c/src/lib/libbsp/sparc/shared/irq_asm.S >> +++ b/c/src/lib/libbsp/sparc/shared/irq_asm.S >> @@ -23,6 +23,10 @@ >> #include <rtems/score/percpu.h> >> #include <bspopts.h> >> >> +#ifdef RTEMS_PARAVIRT_XTRATUM >> +#include <xm.h> > What is this header file? I don't see it in the commit, is it part of > the installed XtratuM? >
That is correct. It's part of XtratuM. Is there some preferred way of marking such headers? >> +#endif /* RTEMS_PARAVIRT_XTRATUM */ >> + >> /* >> * void _CPU_Context_switch( >> * Context_Control *run, >> @@ -54,7 +58,15 @@ SYM(_CPU_Context_switch): >> ld [%g6 + SPARC_PER_CPU_ISR_DISPATCH_DISABLE], %o4 >> ! save it a bit later so we do not waste a couple of cycles >> >> +#ifdef RTEMS_PARAVIRT_XTRATUM >> + mov %o0, %l6 >> + mov sparc_get_psr_nr, %o0 >> + __XM_AHC > I'm guessing these symbols are defined in xm.h? Again, your assumption is right. > >> + mov %o0, %o2 >> + mov %l6, %o0 >> +#else /* RTEMS_PARAVIRT_XTRATUM */ >> rd %psr, %o2 >> +#endif /* RTEMS_PARAVIRT_XTRATUM */ > It would be cleaner code if you can write this get_psr as an assembler > macro, e.g. > > .macro GET_PSR REG, TMP0 > #ifdef RTEMS_PARAVIRT_XTRATUM > mov %o0, \TMP > mov sparc_get_psr_nr, %o0 > __XM_AHC > mov %o0, \REG > mov \TMP, %o0 > #else > rd %psr, \REG > #endif > > Same for some of the other functions that get used multiple times in > this file, such as set_psr, set_pil, and clear_pil. Putting these in a > header file would make them useful in start.S also. > > [...] > >> diff --git a/c/src/lib/libbsp/sparc/shared/start/start.S >> b/c/src/lib/libbsp/sparc/shared/start/start.S >> index 65dd559..158883a 100644 >> --- a/c/src/lib/libbsp/sparc/shared/start/start.S >> +++ b/c/src/lib/libbsp/sparc/shared/start/start.S > [...] >> @@ -354,12 +397,19 @@ zerobss: >> bleu,a zerobss >> nop >> >> +#ifdef RTEMS_PARAVIRT_XTRATUM >> + mov %g7, %o0 >> + call init_libxm ! initialize libxm > Where is this function? > It is a function delivered by XtratuM. It initializes the libxm which provides high-level access to para-virtualised services. >> diff --git a/c/src/lib/libbsp/sparc/xtratum/include/irq.h >> b/c/src/lib/libbsp/sparc/xtratum/include/irq.h >> new file mode 100644 >> index 0000000..afa99c0 >> --- /dev/null >> +++ b/c/src/lib/libbsp/sparc/xtratum/include/irq.h >> @@ -0,0 +1,2 @@ >> +#define BSP_INTERRUPT_VECTOR_MIN 0 >> +#define BSP_INTERRUPT_VECTOR_MAX (CPU_INTERRUPT_NUMBER_OF_VECTORS - 1) >> diff --git a/c/src/lib/libbsp/sparc/xtratum/include/tm27.h >> b/c/src/lib/libbsp/sparc/xtratum/include/tm27.h >> new file mode 100644 >> index 0000000..85c4963 >> --- /dev/null >> +++ b/c/src/lib/libbsp/sparc/xtratum/include/tm27.h >> @@ -0,0 +1,30 @@ >> +/* >> + * tm27.h >> + * >> + * 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. >> + */ >> + >> +#ifndef _RTEMS_TMTEST27 >> +#error "This is an RTEMS internal file you must not include directly." >> +#endif >> + >> +#ifndef __tm27_h >> +#define __tm27_h >> + >> +#define TEST_VECTOR SPARC_SYNCHRONOUS_TRAP( 0x90 ) >> + >> +#define MUST_WAIT_FOR_INTERRUPT 1 >> + >> +#define Install_tm27_vector( handler ) \ >> + set_vector( (handler), TEST_VECTOR, 1 ); >> + >> +#define Cause_tm27_intr() \ >> + __asm__ volatile( "ta 0x10; nop " ); >> + > I guess this won't actually work? > It did work. The synchronous traps can be nested. > >> diff --git a/c/src/lib/libbsp/sparc/xtratum/irq/irq.c >> b/c/src/lib/libbsp/sparc/xtratum/irq/irq.c >> new file mode 100644 >> index 0000000..c061f9c >> --- /dev/null >> +++ b/c/src/lib/libbsp/sparc/xtratum/irq/irq.c >> @@ -0,0 +1,77 @@ > File needs copyright/license header. > I just forgot it. Sorry for that. I'll add it. >> diff --git a/c/src/lib/libbsp/sparc/xtratum/startup/bsppredriver.c >> b/c/src/lib/libbsp/sparc/xtratum/startup/bsppredriver.c >> new file mode 100644 >> index 0000000..f99c528 >> --- /dev/null >> +++ b/c/src/lib/libbsp/sparc/xtratum/startup/bsppredriver.c >> @@ -0,0 +1,7 @@ > File needs copyright/license header, although I'm not sure why this > file is included anyway since the hook is empty. > You are right. This file is not longer necessary. It is a relic of my development process. I'll remove it and use the default one. >> diff --git a/c/src/lib/libbsp/sparc/xtratum/startup/bspreset.c >> b/c/src/lib/libbsp/sparc/xtratum/startup/bspreset.c >> new file mode 100644 >> index 0000000..ec80be4 >> --- /dev/null >> +++ b/c/src/lib/libbsp/sparc/xtratum/startup/bspreset.c >> @@ -0,0 +1,52 @@ >> +/* >> + * Copyright (c) 2014 embedded brains GmbH. All rights reserved. >> + * >> + * embedded brains GmbH >> + * Dornierstr. 4 >> + * 82178 Puchheim >> + * Germany >> + * <i...@embedded-brains.de> >> + * >> + * 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 <xm.h> >> +#include <bsp/bootcard.h> >> + >> +#ifdef RTEMS_SMP >> +void bsp_reset(void) >> +{ >> + uint32_t self_cpu = rtems_get_current_processor(); >> + >> + if (self_cpu == 0) { >> + /* Value should give us roughly something in the range of a few >> + * milliseconds. */ >> + uint32_t max_wait = 1234567; >> + uint32_t cpu_count = rtems_get_processor_count(); >> + uint32_t cpus_halted = 0; >> + >> + /* Wait some time for secondary processors to halt */ >> + do { >> + xmVirtualCpuStatus_t status; >> + cpus_halted = 0; >> + uint32_t i; >> + >> + for (i=1; i<cpu_count; ++i) { >> + XM_get_vcpu_status(i, &status); >> + if (status.state == XM_STATUS_HALTED) { >> + ++cpus_halted; >> + } >> + } >> + --max_wait; >> + } while (cpus_halted < cpu_count - 1 && max_wait > 0); >> + >> + XM_halt_partition(XM_PARTITION_SELF); >> + } else { >> + XM_halt_vcpu(XM_VCPU_SELF); >> + } >> + >> + while (1); >> +} >> +#endif > What if it is not RTEMS_SMP? > In this case there is a implementation for singleprocessor systems in the shared start.S for all sparc-bsps. >> diff --git a/c/src/lib/libbsp/sparc/xtratum/startup/spurious.c >> b/c/src/lib/libbsp/sparc/xtratum/startup/spurious.c >> new file mode 100644 >> index 0000000..2d4428a >> --- /dev/null >> +++ b/c/src/lib/libbsp/sparc/xtratum/startup/spurious.c >> @@ -0,0 +1,35 @@ >> +/* >> + * LEON Spurious Trap Handler >> + * >> + * This is just enough of a trap handler to let us know what >> + * the likely source of the trap was. >> + * >> + * Developed as part of the port of RTEMS to the LEON implementation >> + * of the SPARC by On-Line Applications Research Corporation (OAR) >> + * under contract to the European Space Agency (ESA). >> + * >> + * COPYRIGHT (c) 1995. European Space Agency. >> + * >> + * Modified for LEON3 BSP. >> + * COPYRIGHT (c) 2004. >> + * Gaisler Research. >> + * >> + * This terms of the RTEMS license apply to this file. >> + */ >> + >> +#include <bsp.h> >> +#include <rtems/bspIo.h> >> + >> +void _BSP_Exception_frame_print( const CPU_Exception_frame *frame ) >> +{ >> + uint32_t trap; >> + uint32_t real_trap; >> + const CPU_Interrupt_frame *isf; >> + >> + trap = frame->trap; >> + real_trap = SPARC_REAL_TRAP_NUMBER(trap); >> + isf = frame->isf; >> + >> + printk( "Unexpected trap (0x%02x) at address 0x%08x\n", real_trap, >> isf->tpc); >> +} >> + > I don't think this code will get called ever? > The _BSP_Exception_frame_print of the sparc gets called by the _CPU_Exception_frame_print. This again is called by rtems_exception_frame_print which is called i.E. in the bsp_fatal_extension or in spfatal26-test. >> diff --git a/cpukit/score/cpu/sparc/rtems/score/cpu.h >> b/cpukit/score/cpu/sparc/rtems/score/cpu.h >> index 216fc59..18a8c96 100644 >> --- a/cpukit/score/cpu/sparc/rtems/score/cpu.h >> +++ b/cpukit/score/cpu/sparc/rtems/score/cpu.h >> @@ -975,15 +975,8 @@ extern const CPU_Trap_table_entry >> _CPU_Trap_slot_template; >> * actually provides. Currently, interrupt levels which do not >> * map onto the CPU in a straight fashion are undefined. >> */ >> -#ifdef RTEMS_PARAVIRT >> - #define _CPU_ISR_Set_level( _newlevel ) \ >> - _SPARC_ISR_Set_level( _newlevel << 8) >> - >> -void _SPARC_ISR_Set_level( uint32_t pil ); >> -#else >> - #define _CPU_ISR_Set_level( _newlevel ) \ >> - sparc_enable_interrupts( _newlevel << 8) >> -#endif >> +#define _CPU_ISR_Set_level( _newlevel ) \ >> + sparc_enable_interrupts( _newlevel << 8) >> >> /** >> * @brief Obtain the current interrupt disable level. > I don't think this revert is intended? > Sebastian already stumbled across this one. In the development process, I first separated the Set_level and enable_interrupts function to optimize the later one. But I had to change the enable_interrupts due to another bug so that Set_level and enable_interrupts ended up doing the same thing again. I'll remove the changes in both patches. -- -------------------------------------------- embedded brains GmbH Christian Mauderer Dornierstr. 4 D-82178 Puchheim Germany email: christian.maude...@embedded-brains.de Phone: +49-89-18 94 741 - 18 Fax: +49-89-18 94 741 - 08 PGP: Public key available on request. Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG. _______________________________________________ rtems-devel mailing list rtems-devel@rtems.org http://www.rtems.org/mailman/listinfo/rtems-devel