diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2018-03-26 12:10:15 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2018-03-26 15:12:48 +0200 |
commit | fc2ec62978ac749d9f731fbc768e48e4f0c4a8f9 (patch) | |
tree | 32c2dfee817f51dfc689ddd2e132873b99360265 /bsps | |
parent | bsps/m68k: Remove unused define (diff) | |
download | rtems-fc2ec62978ac749d9f731fbc768e48e4f0c4a8f9.tar.bz2 |
bsps/m68k: Move libcpu content to bsps
This patch is a part of the BSP source reorganization.
Update #3285.
Diffstat (limited to 'bsps')
-rw-r--r-- | bsps/m68k/csb360/start/idle-mcf5272.c | 27 | ||||
-rw-r--r-- | bsps/m68k/shared/m68kidle.c | 27 | ||||
-rw-r--r-- | bsps/m68k/shared/memProbe.c | 105 |
3 files changed, 159 insertions, 0 deletions
diff --git a/bsps/m68k/csb360/start/idle-mcf5272.c b/bsps/m68k/csb360/start/idle-mcf5272.c new file mode 100644 index 0000000000..c645b288b8 --- /dev/null +++ b/bsps/m68k/csb360/start/idle-mcf5272.c @@ -0,0 +1,27 @@ +/* + * Motorola MC68xxx Dependent Idle Body Source + * + * This kernel routine is the idle thread. The idle thread runs any time + * no other thread is ready to run. This thread loops forever with + * interrupts enabled. + */ + +/* + * COPYRIGHT (c) 1989-2002. + * 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 <rtems/system.h> +#include <rtems/score/thread.h> + +void *_CPU_Thread_Idle_body( uintptr_t ignored ) +{ + for( ; ; ) { + __asm__ volatile( "nop" ); + __asm__ volatile( "nop" ); + } +} diff --git a/bsps/m68k/shared/m68kidle.c b/bsps/m68k/shared/m68kidle.c new file mode 100644 index 0000000000..f43651f49e --- /dev/null +++ b/bsps/m68k/shared/m68kidle.c @@ -0,0 +1,27 @@ +/* + * Motorola MC68xxx Dependent Idle Body Source + * + * This kernel routine is the idle thread. The idle thread runs any time + * no other thread is ready to run. This thread loops forever with + * interrupts enabled. + */ + +/* + * COPYRIGHT (c) 1989-2002. + * 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 <rtems/system.h> +#include <rtems/score/thread.h> + +void *_CPU_Thread_Idle_body( uintptr_t ignored ) +{ + for( ; ; ) { + /* supervisor mode, all interrupts on */ + __asm__ volatile( "stop #0x3000":::"cc" ); + } +} diff --git a/bsps/m68k/shared/memProbe.c b/bsps/m68k/shared/memProbe.c new file mode 100644 index 0000000000..d352f76b6e --- /dev/null +++ b/bsps/m68k/shared/memProbe.c @@ -0,0 +1,105 @@ +/* + * Address Probing for M68k/ColdFire + */ + +#include <bsp.h> +#include <string.h> +#include <rtems/m68k/sim.h> + +#if (M68K_COLDFIRE_ARCH == 1) +# define EXCEPTION_FRAME_PC_OFFSET "4" +#else +# define EXCEPTION_FRAME_PC_OFFSET "2" +#endif + +typedef int (*MemProber)(void *from, void *to); +int memProbeByte(void *from, void *to); +int memProbeShort(void *from, void *to); +int memProbeLong(void *from, void *to); +int memProbeCatcher(void); +rtems_status_code bspExtMemProbe(void *addr, int write, int size, void *pval); + +__asm__( + ".text\n" + "memProbeByte: \n" + " move.l %sp@(4),%a0\n" + " move.b %a0@,%d0 \n" + " move.l %sp@(8),%a0\n" + " move.b %d0,%a0@ \n" + " bra.b 1f \n" + "memProbeShort: \n" + " move.l %sp@(4),%a0\n" + " move.w %a0@,%d0 \n" + " move.l %sp@(8),%a0\n" + " move.w %d0,%a0@ \n" + " bra.b 1f \n" + "memProbeLong: \n" + " move.l %sp@(4),%a0\n" + " move.l %a0@,%d0 \n" + " move.l %sp@(8),%a0\n" + " move.l %d0,%a0@ \n" + "1: nop \n" + " moveq.l #1,%d0 \n" + " rts \n" + "memProbeCatcher: \n" + " move.l #1f,%d0 \n" + " move.l %d0,%sp@(" EXCEPTION_FRAME_PC_OFFSET ")\n" + " rte \n" + "1: clr.l %d0 \n" + " rts \n" +); + +rtems_status_code +bspExtMemProbe(void *addr, int write, int size, void *pval) +{ + rtems_status_code rval=RTEMS_SUCCESSFUL; + rtems_interrupt_level level; + unsigned long buf; + MemProber probe; + void *saveVector; + void **exceptionPointer; + void *vbr; + + /* + * Sanity check + */ + switch (size) { + case sizeof(char): probe=memProbeByte; break; + case sizeof(short): probe=memProbeShort; break; + case sizeof(long): probe=memProbeLong; break; + default: return RTEMS_INVALID_SIZE; + } + + /* + * use a buffer to make sure we don't end up probing 'pval'. + */ + if (write && pval) + memcpy(&buf, pval, size); + + /* + * Get location of access fault exception + */ + m68k_get_vbr(vbr); + exceptionPointer = (void **)((char *)vbr + (2 * 4)); + + /* + * Probe! + */ + rtems_interrupt_disable(level); + saveVector = *exceptionPointer; + *exceptionPointer = memProbeCatcher; + if (write) { + if (probe(&buf, addr) == 0) + rval = RTEMS_INVALID_ADDRESS; + } + else { + if (probe(addr, &buf) == 0) + rval = RTEMS_INVALID_ADDRESS; + } + *exceptionPointer = saveVector; + rtems_interrupt_enable(level); + + if (!write && pval && (rval == RTEMS_SUCCESSFUL)) + memcpy(pval, &buf, size); + return rval; +} |