/* * SPDX-FileCopyrightText: Copyright The TrustedFirmware-M Contributor * Copyright (c) 2023 Cypress Semiconductor Corporation (an Infineon * company) or an affiliate of Cypress Semiconductor Corporation. All rights * reserved. * * SPDX-License-Identifier: BSD-3-Clause * */ #ifndef __M_THREAD_H__ /* Add an extra M as thread.h is common. */ #define __M_THREAD_H__ #include #include #include "tfm_arch.h" /* State codes */ #define THRD_STATE_CREATING 0 #define THRD_STATE_RUNNABLE 1 #define THRD_STATE_BLOCK 2 #define THRD_STATE_DETACH 3 #define THRD_STATE_INVALID 4 #define THRD_STATE_RET_VAL_AVAIL 5 /* Priorities. Lower value has higher priority */ #define THRD_PRIOR_HIGHEST 0x0 #define THRD_PRIOR_HIGH 0xF #define THRD_PRIOR_MEDIUM 0x1F #define THRD_PRIOR_LOW 0x7F #define THRD_PRIOR_LOWEST 0xFF /* Error codes */ #define THRD_SUCCESS 0 #define THRD_ERR_GENERIC 1 /* Thread entry function type */ typedef void (*thrd_fn_t)(void *); /* An address causes exceptions (invalid address and security bit). */ #define THRD_GENERAL_EXIT ((thrd_fn_t)(0xFFFFFFFE)) /* Thread context */ struct thread_t { uint16_t priority; /* Priority */ uint8_t state; /* State */ uint16_t flags; /* Flags and align, DO NOT REMOVE! */ struct context_ctrl_t *p_context_ctrl; /* Context control (sp, splimit, lr) */ struct thread_t *next; /* Next thread in list */ }; /* Query thread state function type */ typedef uint32_t (*thrd_query_state_t)(const struct thread_t *p_thrd, uint32_t *p_retval); /* * Definition for the current thread and its access helper preprocessor. * The definition needs to be declared in one of the sources. */ extern struct thread_t *p_curr_thrd; #define CURRENT_THREAD p_curr_thrd /* * Initialize the thread_t struct with the given inputs. * * Parameters: * p_thrd - Pointer of caller provided thread_t struct to be init * p_ctx_ctrl - Initial Context control (sp, splimit, lr) * priority - Initial priority */ #define THRD_INIT(p_thrd, p_ctx_ctrl, prio) do { \ (p_thrd)->priority = (uint16_t)(prio); \ (p_thrd)->state = THRD_STATE_CREATING; \ (p_thrd)->flags = 0; \ (p_thrd)->p_context_ctrl = p_ctx_ctrl; \ } while (0) /* * Set thread priority. * * Parameters : * p_thrd - Pointer of thread_t struct * priority - Priority value * * Note : * The new priority may not take effect immediately. */ #define THRD_SET_PRIORITY(p_thrd, priority) \ p_thrd->priority = (uint16_t)(priority) /* * Update current thread's bound context pointer. * * Parameters : * x - Context pointer to be bound with the current thread. */ #define THRD_UPDATE_CUR_CTXCTRL(x) \ CURRENT_THREAD->p_context_ctrl = (x) /* * Init the global query state callback function pointer. * * Parameters : * fn - Query state function pointer. */ void thrd_set_query_callback(thrd_query_state_t fn); /* * Set thread state, and updates the runnable head. * * Parameters : * p_thrd - Pointer of thread_t struct * new_state - New state of thread */ void thrd_set_state(struct thread_t *p_thrd, uint32_t new_state); /* * Prepare thread context with given info and insert it into schedulable list. * * Parameters : * p_thrd - Pointer of thread_t struct * fn - Thread entry function * exit_fn - The function to go when 'fn' exited * param - Parameter passed to fn * * Note : * - The thread is not "started" immediately. */ void thrd_start(struct thread_t *p_thrd, thrd_fn_t fn, thrd_fn_t exit_fn, void *param); /* * Get the next thread to run in list. * * Return : * Pointer of next thread to run. */ struct thread_t *thrd_next(void); /* * Start scheduling. * * ppth [out] - The first runnable thread * * Return : * The EXC_RETURN payload of the first runnable thread for caller usage. */ uint32_t thrd_start_scheduler(struct thread_t **ppth); #endif /* __M_THREAD_H__ */