;/***************************************************************************
; * Copyright (c) 2024 Microsoft Corporation
; *
; * This program and the accompanying materials are made available under the
; * terms of the MIT License which is available at
; * https://opensource.org/licenses/MIT.
; *
; * SPDX-License-Identifier: MIT
; **************************************************************************/
;
;
;/**************************************************************************/
;/**************************************************************************/
;/**                                                                       */
;/** ThreadX Component                                                     */
;/**                                                                       */
;/**   Module Manager                                                      */
;/**                                                                       */
;/**************************************************************************/
;/**************************************************************************/
;
    EXTERN  _txm_module_manager_kernel_dispatch


;/**************************************************************************/
;/*                                                                        */
;/*  FUNCTION                                               RELEASE        */
;/*                                                                        */
;/*    tx                                              Cortex-A7/MMU/IAR   */
;/*                                                           6.3.0        */
;/*  AUTHOR                                                                */
;/*                                                                        */
;/*    Scott Larson, Microsoft Corporation                                 */
;/*                                                                        */
;/*  DESCRIPTION                                                           */
;/*                                                                        */
;/*    This function allows modules to enter kernel mode.                  */
;/*                                                                        */
;/*  INPUT                                                                 */
;/*                                                                        */
;/*    None                                                                */
;/*                                                                        */
;/*  OUTPUT                                                                */
;/*                                                                        */
;/*    None                                                                */
;/*                                                                        */
;/*  CALLS                                                                 */
;/*                                                                        */
;/*    SVC 1                                 Enter kernel mode             */
;/*    SVC 2                                 Exit kernel mode              */
;/*                                                                        */
;/*  CALLED BY                                                             */
;/*                                                                        */
;/*    Modules in user mode                                                */
;/*                                                                        */
;/**************************************************************************/
    RSEG    .text:CODE:NOROOT(2)
    PUBLIC  _txm_module_manager_user_mode_entry
#ifdef THUMB_MODE
    THUMB
#else
    ARM
#endif
_txm_module_manager_user_mode_entry

    PUBLIC  _txm_system_mode_enter
#ifdef THUMB_MODE
    THUMB
#else
    ARM
#endif
_txm_system_mode_enter
    SVC     1                               ; Get out of user mode

    ; At this point, we are in system mode.
    ; Save LR (and r3 for 8 byte aligned stack) and call the kernel dispatch function.
    PUSH    {r3, lr}
    BL      _txm_module_manager_kernel_dispatch
    POP     {r3, lr}

    PUBLIC _txm_system_mode_exit
#ifdef THUMB_MODE
    THUMB
#else
    ARM
#endif
_txm_system_mode_exit
    ; Trap to restore user mode while inside of ThreadX
    SVC     2

    BX      lr                              ; Return to the caller
    NOP
    NOP

    ; Fill up 4kB page.
    SECTION page_align:CONST:ROOT(2)

_txm_module_manager_user_mode_end

    END
