/* * TOPPERS Software * Toyohashi Open Platform for Embedded Real-Time Systems * * Copyright (C) 2006-2016 by Embedded and Real-Time Systems Laboratory * Graduate School of Information Science, Nagoya Univ., JAPAN * Copyright (C) 2018,2019 by Naoki Saito * Nagoya Municipal Industrial Research Institute, JAPAN * * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー * スコード中に含まれていること. * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 * の無保証規定を掲載すること. * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ * と. * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 * 作権表示,この利用条件および下記の無保証規定を掲載すること. * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに * 報告すること. * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを * 免責すること. * * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ * の責任を負わない. * * $Id: arm64.h 386 2019-04-17 03:13:00Z nmir-saito $ */ #ifndef TOPPERS_ARM64_H #define TOPPERS_ARM64_H /* * PSTATE */ #define AARCH64_PSTATE_N (1 << 31) #define AARCH64_PSTATE_Z (1 << 30) #define AARCH64_PSTATE_C (1 << 29) #define AARCH64_PSTATE_V (1 << 28) #define AARCH64_PSTATE_SS (1 << 21) #define AARCH64_PSTATE_IL (1 << 20) #define AARCH64_PSTATE_D (1 << 9) #define AARCH64_PSTATE_A (1 << 8) #define AARCH64_PSTATE_I (1 << 7) #define AARCH64_PSTATE_F (1 << 6) #define AARCH64_PSTATE_MODE4 (1 << 4) #define AARCH64_PSTATE_MODE_MASK (AARCH64_PSTATE_MODE4 - 1) /* * DAIF */ #define AARCH64_DAIF_FIQ UINT64_C(1) #define AARCH64_DAIF_IRQ UINT64_C(2) #define AARCH64_DAIF_SERR UINT64_C(4) #define AARCH64_DAIF_DBG UINT64_C(8) #define AARCH64_DAIF_ALL (AARCH64_DAIF_DBG|AARCH64_DAIF_SERR|AARCH64_DAIF_IRQ|AARCH64_DAIF_FIQ) #ifndef TOPPERS_MACRO_ONLY /* * DAIFの設定および状態参照 */ Inline uint32_t aarch64_get_daif(void){ uint32_t daif; Asm ("mrs %0, daif\n\t":"=r"(daif): : "memory"); return daif; } Inline void aarch64_set_daif(uint32_t daif) { Asm ("msr daif, %0\n\t" : : "r"(daif): "cc", "memory"); } /* * DAIF.I のセット/クリア */ Inline void aarch64_set_daif_i(void) { Asm ("msr daifset, %0\n\t"::"i"(AARCH64_DAIF_IRQ): "cc", "memory"); } Inline void aarch64_clear_daif_i(void) { Asm ("msr daifclr, %0\n\t"::"i"(AARCH64_DAIF_IRQ): "cc", "memory"); } /* * DAIF.F のセット/クリア */ Inline void aarch64_set_daif_f(void) { Asm ("msr daifset, %0\n\t"::"i"(AARCH64_DAIF_FIQ): "cc", "memory"); } Inline void aarch64_clear_daif_f(void) { Asm ("msr daifclr, %0\n\t"::"i"(AARCH64_DAIF_FIQ): "cc", "memory"); } /* * DAIF.F および DAIF.I の同時セット/クリア */ Inline void aarch64_set_daif_if(void) { Asm ("msr daifset, %0\n\t"::"i"(AARCH64_DAIF_IRQ | AARCH64_DAIF_FIQ): "cc", "memory"); } Inline void aarch64_clear_daif_if(void) { Asm ("msr daifclr, %0\n\t"::"i"(AARCH64_DAIF_IRQ | AARCH64_DAIF_FIQ): "cc", "memory"); } /* * DAIF.I の状態参照 */ Inline bool_t aarch64_sense_daif_irq(void) { uint32_t daif; bool_t state; daif = aarch64_get_daif(); if(daif & AARCH64_PSTATE_I) { state = true; } else { state = false; } return state; } /* * DAIF.F の状態参照 */ Inline bool_t aarch64_sense_daif_fiq(void) { uint32_t daif; bool_t state; daif = aarch64_get_daif(); if(daif & AARCH64_PSTATE_F) { state = true; } else { state = false; } return state; } /* * クリティカル処理の出口(最適化防止) */ Inline void aarch64_exit_critical(void) { Asm("":::"memory"); } #endif /* TOPPERS_MACRO_ONLY */ #endif /* TOPPERS_ARM64_H */