This adds lazy floating point context switching. On svc/irq entrance, the VFP is disabled and a pointer to the exception stack frame is saved away. If the esf pointer is still valid on exception exit, then no other context used the VFP so the context is still valid and nothing needs to be restored. If the esf pointer is NULL on exception exit, then some other context used the VFP and the floating point context is restored from the esf. The undefined instruction handler is responsible for saving away the floating point context if needed. If the handler is in the first irq/svc context and the current thread uses the VFP, then the float context needs to be saved. Also, if the handler is in a nested context and the previous context was using the FVP, save the float context. Signed-off-by: Bradley Bolen <bbolen@lexmark.com>
120 lines
2.8 KiB
C
120 lines
2.8 KiB
C
/*
|
|
* Copyright (c) 2013-2014 Wind River Systems, Inc.
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
#include <device.h>
|
|
|
|
#include <pm/device.h>
|
|
|
|
#ifndef ZEPHYR_KERNEL_INCLUDE_KERNEL_OFFSETS_H_
|
|
#define ZEPHYR_KERNEL_INCLUDE_KERNEL_OFFSETS_H_
|
|
|
|
#include <syscall_list.h>
|
|
|
|
/* All of this is build time magic, but LCOV gets confused. Disable coverage
|
|
* for this whole file.
|
|
*
|
|
* LCOV_EXCL_START
|
|
*/
|
|
|
|
/*
|
|
* The final link step uses the symbol _OffsetAbsSyms to force the linkage of
|
|
* offsets.o into the ELF image.
|
|
*/
|
|
|
|
GEN_ABS_SYM_BEGIN(_OffsetAbsSyms)
|
|
|
|
GEN_OFFSET_SYM(_cpu_t, current);
|
|
GEN_OFFSET_SYM(_cpu_t, nested);
|
|
GEN_OFFSET_SYM(_cpu_t, irq_stack);
|
|
GEN_OFFSET_SYM(_cpu_t, arch);
|
|
|
|
GEN_ABSOLUTE_SYM(___cpu_t_SIZEOF, sizeof(struct _cpu));
|
|
|
|
GEN_OFFSET_SYM(_kernel_t, cpus);
|
|
|
|
#if defined(CONFIG_FPU_SHARING)
|
|
GEN_OFFSET_SYM(_cpu_t, fp_ctx);
|
|
#endif
|
|
|
|
#if defined(CONFIG_THREAD_MONITOR)
|
|
GEN_OFFSET_SYM(_kernel_t, threads);
|
|
#endif
|
|
|
|
#ifdef CONFIG_PM
|
|
GEN_OFFSET_SYM(_kernel_t, idle);
|
|
#endif
|
|
|
|
#ifndef CONFIG_SCHED_CPU_MASK_PIN_ONLY
|
|
GEN_OFFSET_SYM(_kernel_t, ready_q);
|
|
#endif
|
|
|
|
#ifndef CONFIG_SMP
|
|
GEN_OFFSET_SYM(_ready_q_t, cache);
|
|
#endif
|
|
|
|
#ifdef CONFIG_FPU_SHARING
|
|
GEN_OFFSET_SYM(_kernel_t, current_fp);
|
|
#endif
|
|
|
|
GEN_ABSOLUTE_SYM(_STRUCT_KERNEL_SIZE, sizeof(struct z_kernel));
|
|
|
|
GEN_OFFSET_SYM(_thread_base_t, user_options);
|
|
GEN_OFFSET_SYM(_thread_base_t, thread_state);
|
|
GEN_OFFSET_SYM(_thread_base_t, prio);
|
|
GEN_OFFSET_SYM(_thread_base_t, sched_locked);
|
|
GEN_OFFSET_SYM(_thread_base_t, preempt);
|
|
GEN_OFFSET_SYM(_thread_base_t, swap_data);
|
|
|
|
GEN_OFFSET_SYM(_thread_t, base);
|
|
GEN_OFFSET_SYM(_thread_t, callee_saved);
|
|
GEN_OFFSET_SYM(_thread_t, arch);
|
|
|
|
#ifdef CONFIG_USE_SWITCH
|
|
GEN_OFFSET_SYM(_thread_t, switch_handle);
|
|
#endif
|
|
|
|
#ifdef CONFIG_THREAD_STACK_INFO
|
|
GEN_OFFSET_SYM(_thread_stack_info_t, start);
|
|
GEN_OFFSET_SYM(_thread_stack_info_t, size);
|
|
|
|
GEN_OFFSET_SYM(_thread_t, stack_info);
|
|
#endif
|
|
|
|
#if defined(CONFIG_THREAD_MONITOR)
|
|
GEN_OFFSET_SYM(_thread_t, next_thread);
|
|
#endif
|
|
|
|
#ifdef CONFIG_THREAD_CUSTOM_DATA
|
|
GEN_OFFSET_SYM(_thread_t, custom_data);
|
|
#endif
|
|
|
|
#ifdef CONFIG_THREAD_LOCAL_STORAGE
|
|
GEN_OFFSET_SYM(_thread_t, tls);
|
|
#endif
|
|
|
|
GEN_ABSOLUTE_SYM(K_THREAD_SIZEOF, sizeof(struct k_thread));
|
|
|
|
/* size of the device structure. Used by linker scripts */
|
|
GEN_ABSOLUTE_SYM(_DEVICE_STRUCT_SIZEOF, sizeof(const struct device));
|
|
|
|
/* member offsets in the device structure. Used in image post-processing */
|
|
GEN_ABSOLUTE_SYM(_DEVICE_STRUCT_HANDLES_OFFSET,
|
|
offsetof(struct device, handles));
|
|
|
|
#ifdef CONFIG_PM_DEVICE
|
|
GEN_ABSOLUTE_SYM(_DEVICE_STRUCT_PM_OFFSET,
|
|
offsetof(struct device, pm));
|
|
#endif
|
|
|
|
/* member offsets in the pm_device structure. Used in image post-processing */
|
|
|
|
GEN_ABSOLUTE_SYM(_PM_DEVICE_STRUCT_FLAGS_OFFSET,
|
|
offsetof(struct pm_device, flags));
|
|
|
|
GEN_ABSOLUTE_SYM(_PM_DEVICE_FLAG_PD, PM_DEVICE_FLAG_PD);
|
|
|
|
/* LCOV_EXCL_STOP */
|
|
#endif /* ZEPHYR_KERNEL_INCLUDE_KERNEL_OFFSETS_H_ */
|