1
0
Fork 0
forked from len0rd/rockbox
foxbox/firmware/asm/arm/thread.h
Aidan MacDonald 1c96d51717 arm: add ARMv7-M support for thread context switching
On ARMv7-M, stm/ldm instructions can't include SP, so we must
load and store that separately. This changes the order of
registers in the context struct, but it doesn't seem to be
accessed anywhere else so this shouldn't cause any problems.

Change-Id: Ie1cd23272f23384e030f51f0b76739624fa7332b
2025-04-18 10:55:32 -04:00

56 lines
1.9 KiB
C

/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2002 by Ulf Ralberg
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
#include "config.h"
#if defined(CPU_ARM_MICRO) && ARCH_VERSION >= 7
/*
* Cortex-M cannot load/store SP with ldm/stm so we need to store it
* separately. This makes it slightly more efficient to store SP last
* so as not to split the register list.
*/
struct regs
{
uint32_t r[8]; /* 0-28 - Registers r4-r11 */
uint32_t lr; /* 32 - r14 (lr) */
uint32_t sp; /* 36 - Stack pointer (r13) */
uint32_t start; /* 40 - Thread start address, or NULL when started */
};
#else
struct regs
{
uint32_t r[8]; /* 0-28 - Registers r4-r11 */
uint32_t sp; /* 32 - Stack pointer (r13) */
uint32_t lr; /* 36 - r14 (lr) */
uint32_t start; /* 40 - Thread start address, or NULL when started */
};
#endif
#if (CONFIG_PLATFORM & PLATFORM_HOSTED)
#include <errno.h>
#if defined(DX50) || defined (DX90)
#define DEFAULT_STACK_SIZE 0x2000 /* Bytes */
#else
#define DEFAULT_STACK_SIZE 0x1000 /* Bytes */
#endif
#else
#define DEFAULT_STACK_SIZE 0x400 /* Bytes */
#endif