Rtos API example

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers api.h Source File

api.h

00001 /*
00002  * Copyright (c) 2016, ARM Limited, All Rights Reserved
00003  * SPDX-License-Identifier: Apache-2.0
00004  *
00005  * Licensed under the Apache License, Version 2.0 (the "License"); you may
00006  * not use this file except in compliance with the License.
00007  * You may obtain a copy of the License at
00008  *
00009  * http://www.apache.org/licenses/LICENSE-2.0
00010  *
00011  * Unless required by applicable law or agreed to in writing, software
00012  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
00013  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00014  * See the License for the specific language governing permissions and
00015  * limitations under the License.
00016  */
00017 #ifndef __UVISOR_API_H__
00018 #define __UVISOR_API_H__
00019 
00020 #include "rt_OsEventObserver.h"
00021 #include "api/inc/uvisor_exports.h"
00022 #include "api/inc/virq_exports.h"
00023 #include "api/inc/debug_exports.h"
00024 #include "api/inc/halt_exports.h"
00025 #include "api/inc/pool_queue_exports.h"
00026 #include "api/inc/page_allocator_exports.h"
00027 #include "api/inc/uvisor_spinlock_exports.h"
00028 #include <stdint.h>
00029 
00030 #define UVISOR_API_MAGIC 0x5C9411B4
00031 #define UVISOR_API_VERSION (10)
00032 
00033 UVISOR_EXTERN_C_BEGIN
00034 
00035 extern void uvisor_init(void);
00036 /* This method is an api method which initializes the g_semihosting_magic variable.
00037  * This function will only work if called in privileged mode or from secure code,
00038  * it is only intended to be called by debugger after reset.
00039  */
00040 void debug_semihosting_enable(void);
00041 
00042 typedef struct {
00043     uint32_t magic;
00044     uint32_t (*get_version)(uint32_t);
00045 
00046     void (*init)(uint32_t caller);
00047 
00048     void     (*irq_enable)(uint32_t irqn);
00049     void     (*irq_disable)(uint32_t irqn);
00050     void     (*irq_disable_all)(void);
00051     void     (*irq_enable_all)(void);
00052     void     (*irq_set_vector)(uint32_t irqn, uint32_t vector);
00053     uint32_t (*irq_get_vector)(uint32_t irqn);
00054     void     (*irq_set_priority)(uint32_t irqn, uint32_t priority);
00055     uint32_t (*irq_get_priority)(uint32_t irqn);
00056     void     (*irq_set_pending)(uint32_t irqn);
00057     uint32_t (*irq_get_pending)(uint32_t irqn);
00058     void     (*irq_clear_pending)(uint32_t irqn);
00059     int      (*irq_get_level)(void);
00060     void     (*irq_system_reset)(TResetReason reason);
00061 
00062     int (*page_malloc)(UvisorPageTable * const table);
00063     int (*page_free)(const UvisorPageTable * const table);
00064 
00065     int (*box_namespace)(int box_id, char *box_namespace, size_t length);
00066     int (*box_id_for_namespace)(int * const box_id, const char * const box_namespace);
00067 
00068     void (*error)(THaltUserError reason);
00069     void (*start)(void);
00070     void (*vmpu_mem_invalidate)(void);
00071 
00072     int                (*pool_init)(uvisor_pool_t *, void *, size_t, size_t);
00073     int                (*pool_queue_init)(uvisor_pool_queue_t *, uvisor_pool_t *, void *, size_t, size_t);
00074     uvisor_pool_slot_t (*pool_allocate)(uvisor_pool_t *);
00075     uvisor_pool_slot_t (*pool_try_allocate)(uvisor_pool_t *);
00076     uvisor_pool_slot_t (*pool_queue_enqueue)(uvisor_pool_queue_t *, uvisor_pool_slot_t);
00077     uvisor_pool_slot_t (*pool_queue_try_enqueue)(uvisor_pool_queue_t *, uvisor_pool_slot_t);
00078     uvisor_pool_slot_t (*pool_free)(uvisor_pool_t *, uvisor_pool_slot_t);
00079     uvisor_pool_slot_t (*pool_try_free)(uvisor_pool_t *, uvisor_pool_slot_t);
00080     uvisor_pool_slot_t (*pool_queue_dequeue)(uvisor_pool_queue_t *, uvisor_pool_slot_t);
00081     uvisor_pool_slot_t (*pool_queue_try_dequeue)(uvisor_pool_queue_t *, uvisor_pool_slot_t);
00082     uvisor_pool_slot_t (*pool_queue_dequeue_first)(uvisor_pool_queue_t *);
00083     uvisor_pool_slot_t (*pool_queue_try_dequeue_first)(uvisor_pool_queue_t *);
00084     uvisor_pool_slot_t (*pool_queue_find_first)(uvisor_pool_queue_t *, TQueryFN_Ptr, void *);
00085     uvisor_pool_slot_t (*pool_queue_try_find_first)(uvisor_pool_queue_t *, TQueryFN_Ptr, void *);
00086 
00087     void (*spin_init)(UvisorSpinlock * spinlock);
00088     bool (*spin_trylock)(UvisorSpinlock * spinlock);
00089     void (*spin_lock)(UvisorSpinlock * spinlock);
00090     void (*spin_unlock)(UvisorSpinlock * spinlock);
00091 
00092     void (*debug_semihosting_enable)(void);
00093 
00094     OsEventObserver os_event_observer;
00095 } UVISOR_PACKED UvisorApi;
00096 
00097 extern UvisorApi uvisor_api;
00098 
00099 static UVISOR_FORCEINLINE uint32_t uvisor_get_version(void)
00100 {
00101     return uvisor_api.get_version(UVISOR_API_VERSION);
00102 }
00103 
00104 UVISOR_EXTERN_C_END
00105 
00106 #endif /* __UVISOR_API_H__ */