riscv-openocd/src/rtos
Andrew Ruder afb083625c rtos: handle STKALIGN adjustments on cortex m
In the case that the STKALIGN bit is set on Cortex M processors, on
entry to an exception - the processor can store an additional 4 bytes
of padding before regular stacking to achieve 8-byte alignment on
exception entry.  In the case that this padding is present, the
processor will set bit (1 << 9) in the stacked xPSR register.  Use the
new calculate_process_stack callback to take into account the xPSR
register and use it on the standard Cortex_M3 stacking.

Note: Change #2301 had some misinformation regarding the padding.  On
Cortex-M the padding is stored BEFORE stacking so xPSR is always
available at a fixed offset.

Tested on a Cortex-M0+ (Atmel SAMR21) board which has STKALIGN fixed
to a '1' such that this alignment always occurs on non-aligned stacks.

Behavior of xPSR verified via the (bad-sorry) assembly program below by
setting a breakpoint on the SVC_Handler symbol.  The first time
SVC_Handler is triggered the stack was 0x20000ff8, the second time
SVC_Handler is triggered the stack was 0x20000ffc.  Note that in both
cases the interrupt handler gets 0x20000fd8 for a stack pointer.

GDB exerpt:

Breakpoint 1, 0x000040b6 in Reset_Handler ()
(gdb) hbreak SVC_Handler
Hardware assisted breakpoint 2 at 0x40f8
(gdb) cont
Continuing.

Breakpoint 2, 0x000040f8 in SVC_Handler ()
(gdb) print $msp
$3 = (void *) 0x20000fd8
(gdb) x/9w $msp
0x20000fd8:     0x1     0x2     0x3     0x4
0x20000fe8:     0x88160082      0xa53   0x40ce  0x21000000
0x20000ff8:     0x0
(gdb) cont
Continuing.

Breakpoint 2, 0x000040f8 in SVC_Handler ()
(gdb) print $msp
$4 = (void *) 0x20000fd8
(gdb) x/9w $msp
0x20000fd8:     0x1     0x2     0x3     0x4
0x20000fe8:     0x88160082      0xa53   0x40e8  0x21000200
0x20000ff8:     0x0

Assembly program:

	.cpu cortex-m0plus
	.fpu softvfp
	.thumb
	.syntax unified

.section .vectors
@ pvStack:
	.word	0x20001000
@ pfnReset_Handler:
	.word	Reset_Handler + 1
@ pfnNMI_Handler:
	.word	0
@ pfnHardFault_Handler:
	.word	0
@ pfnReservedM12:
	.word	0
@ pfnReservedM11:
	.word	0
@ pfnReservedM10:
	.word	0
@ pfnReservedM9:
	.word	0
@ pfnReservedM8:
	.word	0
@ pfnReservedM7:
	.word	0
@ pfnReservedM6:
	.word	0
@ pfnSVC_Handler:
	.word	SVC_Handler + 1

.section .text
.global Reset_Handler
Reset_Handler:
    cpsie i
    ldr r0, .stack_start
    ldr r2, .stack_last
    eors r1, r1
.loop_clear:
    str r1, [r0]
    adds r0, r0, #4
    cmp r0, r2
    bne .loop_clear
    subs r2, r2, #4
    mov sp, r2
    movs r0, #1
    movs r1, #2
    movs r2, #3
    movs r3, #4
    svc #0
    ldr r0, .stack_start
    ldr r2, .stack_last
    eors r1, r1
.loop_clear2:
    str r1, [r0]
    adds r0, r0, #4
    cmp r0, r2
    bne .loop_clear2
    mov sp, r2
    movs r0, #1
    movs r1, #2
    movs r2, #3
    movs r3, #4
    svc #0
.loop:
	b .loop
.align 4
.stack_start:
    .word 0x20000f00
.stack_last:
    .word 0x20000ffc

@ first call - 0x2000fff8 -- should already be aligned
@ second call - 0x2000fffc -- should hit the alignment code
.global SVC_Handler
SVC_Handler:
    bx lr

Change-Id: Id0940e6bbd6a59adee1378c0e86fe86830f0c8fc
Signed-off-by: Andrew Ruder <andrew.ruder@elecsyscorp.com>
Cc: Paul Fertser <fercerpav@gmail.com>
Cc: Andreas Fritiofson <andreas.fritiofson@gmail.com>
Cc: Evan Hunter <evanhunter920@gmail.com>
Cc: Jon Burgess <jburgess777@gmail.com>
Reviewed-on: http://openocd.zylin.com/3003
Tested-by: jenkins
Reviewed-by: Freddie Chopin <freddie.chopin@gmail.com>
2015-10-30 23:44:04 +00:00
..
ChibiOS.c ChibiOS: fix crash on auto detection 2015-04-14 12:16:50 +01:00
FreeRTOS.c rtos: add instructions and helper code to make FreeRTOS work again 2015-04-16 20:23:46 +01:00
Makefile.am rtos: Freescale MQX rtos support 2015-03-09 06:29:17 +00:00
ThreadX.c rtos: turn stack alignment into a function pointer 2015-10-30 23:41:44 +00:00
eCos.c rtos: allow symbols to be optional for a particular RTOS 2014-11-24 22:21:37 +00:00
embKernel.c rtos: allow symbols to be optional for a particular RTOS 2014-11-24 22:21:37 +00:00
linux.c rtos: free gdb packet allocated memory 2015-01-09 00:19:11 +00:00
linux_header.h rtos : linux awareness 2012-01-15 22:17:16 +00:00
mqx.c rtos/mqx: prevent crash with -rtos auto 2015-04-24 14:49:06 +01:00
rtos.c rtos: turn stack alignment into a function pointer 2015-10-30 23:41:44 +00:00
rtos.h rtos: turn stack alignment into a function pointer 2015-10-30 23:41:44 +00:00
rtos_chibios_stackings.c rtos: turn stack alignment into a function pointer 2015-10-30 23:41:44 +00:00
rtos_chibios_stackings.h Added FPU support for ChibiOS/RT 2014-11-24 22:22:11 +00:00
rtos_ecos_stackings.c rtos: turn stack alignment into a function pointer 2015-10-30 23:41:44 +00:00
rtos_ecos_stackings.h update files to correct FSF address 2013-06-05 19:52:42 +00:00
rtos_embkernel_stackings.c rtos: turn stack alignment into a function pointer 2015-10-30 23:41:44 +00:00
rtos_embkernel_stackings.h cortex_m: target implementation renames cortex_m3 to cortex_m 2013-10-10 20:51:03 +00:00
rtos_mqx_stackings.c rtos: turn stack alignment into a function pointer 2015-10-30 23:41:44 +00:00
rtos_mqx_stackings.h rtos: Freescale MQX rtos support 2015-03-09 06:29:17 +00:00
rtos_standard_stackings.c rtos: handle STKALIGN adjustments on cortex m 2015-10-30 23:44:04 +00:00
rtos_standard_stackings.h rtos: handle STKALIGN adjustments on cortex m 2015-10-30 23:44:04 +00:00