blob: 5dfd3104e30f38d6a992485a179decffb8aa461d [file]
/*
* FreeRTOS Kernel <DEVELOPMENT BRANCH>
* Copyright (C) 2015-2024 Cadence Design Systems, Inc.
* Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* SPDX-License-Identifier: MIT
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* https://www.FreeRTOS.org
* https://github.com/FreeRTOS
*
*/
#include "xtensa_rtos.h"
#include "portmacro.h"
#include "asm-offsets.h"
#include <xtensa/hal.h>
/*******************************************************************************
_xt_mpu_restore
!! MUST BE CALLED ONLY BY 'CALL0' INSTRUCTION !!
Restores task's MPU state
Entry Conditions:
A0 = Return address in caller.
*******************************************************************************/
#if portUSING_MPU_WRAPPERS
#if XCHAL_HAVE_XEA3 && (!defined __XTENSA_CALL0_ABI__)
#define A2 a10
#define A3 a11
#define A4 a12
#define A5 a13
#define A6 a14
#else
#define A2 a2
#define A3 a3
#define A4 a4
#define A5 a5
#define A6 a6
#endif
.altmacro
.macro mpu_set_entry entry
/*
* Load both first and last entry for a range to avoid memory access
* when region is partially modified which may result in a TLB multihit.
*/
l32i A3, A2, (TCB_MPU_SETTINGS_OFF + (MPU_ENTRY_SIZE * ((portNUM_MAX_SWAPPED_MPU_PAIRS - \entry) * 2 + 1)) + MPU_ENTRY_AT_OFF)
l32i A4, A2, (TCB_MPU_SETTINGS_OFF + (MPU_ENTRY_SIZE * ((portNUM_MAX_SWAPPED_MPU_PAIRS - \entry) * 2 + 1)) + MPU_ENTRY_AS_OFF)
l32i A5, A2, (TCB_MPU_SETTINGS_OFF + (MPU_ENTRY_SIZE * ((portNUM_MAX_SWAPPED_MPU_PAIRS - \entry) * 2 + 0)) + MPU_ENTRY_AT_OFF)
l32i A6, A2, (TCB_MPU_SETTINGS_OFF + (MPU_ENTRY_SIZE * ((portNUM_MAX_SWAPPED_MPU_PAIRS - \entry) * 2 + 0)) + MPU_ENTRY_AS_OFF)
wptlb A3, A4
wptlb A5, A6
.endm
.section "privileged_functions"
.global _xt_mpu_restore
.type _xt_mpu_restore,@function
.align 4
_xt_mpu_restore:
movi A2, pxCurrentTCB
l32i A2, A2, 0
beqz A2, .Lset
movi A3, g_num_used_mpu_entries
l32i A3, A3, 0
movi A4, .Lset
/*
* A3 = .Lset - 18 * g_num_used_mpu_entries -- is the address of code
* that loads MPU entries of the first g_num_used_mpu_entries regions.
* 18 is the size of piece of code generated by one mpu_set_entry macro
*/
slli A5, A3, 4
addx2 A5, A3, A5
sub A3, A4, A5
jx A3
.begin no-transform
/* Load MPU entries from last to first (not in MPU order,
* in pxCurrentTCB->xMPUSettings order).
*/
.set i, 1
.rept portNUM_MAX_SWAPPED_MPU_PAIRS
mpu_set_entry %i
.set i, i+1
.endr
.Lset:
.end no-transform
isync
ret
#ifdef portALIGN_SECTIONS
.section privileged_functions
.align XCHAL_MPU_ALIGN
.section privileged_data
.align XCHAL_MPU_ALIGN
.section freertos_system_calls
.align XCHAL_MPU_ALIGN
.section .text
.align XCHAL_MPU_ALIGN
.section .data
.align XCHAL_MPU_ALIGN
.section .literal
.align XCHAL_MPU_ALIGN
.section .bss
.align XCHAL_MPU_ALIGN
.section .rodata
.align XCHAL_MPU_ALIGN
.section private_region1
.align XCHAL_MPU_ALIGN
.section private_region2
.align XCHAL_MPU_ALIGN
.section private_region3
.align XCHAL_MPU_ALIGN
.section private_stack
.align XCHAL_MPU_ALIGN
#endif
#endif // portUSING_MPU_WRAPPERS