libmicroemu 0.2.0
ARM Microcontroller Emulator Library
Loading...
Searching...
No Matches
predicates.h
Go to the documentation of this file.
1
5#pragma once
6
8#include "libmicroemu/register_details.h"
10#include "libmicroemu/types.h"
11#include <cstddef>
12#include <cstdint>
13#include <string_view>
14
15namespace libmicroemu::internal {
16
20class Predicates {
21public:
27 template <typename TCpuAccessor> static bool IsThreadMode(const TCpuAccessor &cpua) {
28 const auto sys_ctrl = cpua.template ReadSpecialRegister<SpecialRegisterId::kSysCtrl>();
29 const auto exec_mode = sys_ctrl & SysCtrlRegister::kExecModeMsk;
30 return exec_mode == SysCtrlRegister::kExecModeThread;
31 }
32
38 template <typename TCpuAccessor> static bool IsHandlerMode(const TCpuAccessor &cpua) {
39 const auto sys_ctrl = cpua.template ReadSpecialRegister<SpecialRegisterId::kSysCtrl>();
40 const auto exec_mode = sys_ctrl & SysCtrlRegister::kExecModeMsk;
41 return exec_mode == SysCtrlRegister::kExecModeHandler;
42 }
43
49 template <typename TCpuAccessor> static bool IsMainStack(const TCpuAccessor &cpua) {
50 using SId = SpecialRegisterId;
51 auto sys_ctrl = cpua.template ReadSpecialRegister<SId::kSysCtrl>();
52 auto spsel = sys_ctrl & SysCtrlRegister::kControlSpSelMsk;
53 return spsel == 0U;
54 }
55
61 template <typename TCpuAccessor> static bool IsProcessStack(const TCpuAccessor &cpua) {
62 using SId = SpecialRegisterId;
63 auto sys_ctrl = cpua.template ReadSpecialRegister<SId::kSysCtrl>();
64 auto spsel = sys_ctrl & SysCtrlRegister::kControlSpSelMsk;
65 return spsel != 0U;
66 }
67
73 template <typename TCpuAccessor> static bool IsCurrentModePrivileged(TCpuAccessor &cpua) {
74 // see Armv7-M Architecture Reference Manual Issue E.e p.512
75 auto sys_ctrl = cpua.template ReadSpecialRegister<SpecialRegisterId::kSysCtrl>();
76 const auto exec_mode = sys_ctrl & SysCtrlRegister::kExecModeMsk;
77 const auto is_handler_mode = exec_mode == SysCtrlRegister::kExecModeHandler;
78 const auto is_privileged = (sys_ctrl & SysCtrlRegister::kControlNPrivMsk) == 0U;
79
80 return (is_handler_mode || is_privileged);
81 }
82
88 template <typename TCpuAccessor> static bool IsThumbMode(TCpuAccessor &cpua) {
89 const auto epsr = cpua.template ReadSpecialRegister<SpecialRegisterId::kEpsr>();
90 const bool is_thumb = (epsr & static_cast<u32>(EpsrRegister::kTMsk)) != 0U;
91
92 return is_thumb;
93 }
94
95private:
96 Predicates() = delete;
97 ~Predicates() = delete;
98 Predicates(const Predicates &r_src) = delete;
99 Predicates &operator=(const Predicates &r_src) = delete;
100 Predicates(Predicates &&r_src) = delete;
101 Predicates &operator=(Predicates &&r_src) = delete;
102};
103
104} // namespace libmicroemu::internal
Provides predicates for certain cpu states.
Definition predicates.h:20
static bool IsCurrentModePrivileged(TCpuAccessor &cpua)
Check if the cpu is in privileged mode.
Definition predicates.h:73
static bool IsProcessStack(const TCpuAccessor &cpua)
Check if the cpu is using the process stack.
Definition predicates.h:61
static bool IsHandlerMode(const TCpuAccessor &cpua)
Check if the cpu is in handler mode.
Definition predicates.h:38
static bool IsMainStack(const TCpuAccessor &cpua)
Check if the cpu is using the main stack.
Definition predicates.h:49
static bool IsThumbMode(TCpuAccessor &cpua)
Check if the cpu is in thumb mode.
Definition predicates.h:88
static bool IsThreadMode(const TCpuAccessor &cpua)
Check if the cpu is in thread mode.
Definition predicates.h:27
The libmicroemu::internal namespace contains all classes and functions of libmicroemu which are priva...
Definition bkpt_flags.h:6
SpecialRegisterId
Enumeration of special register IDs.
Definition special_register_id.h:18
Contains the Result class which is used to return the result of a function.
This file contains the declaration of the SpecialRegisterId enumeration and related functions.