what is the current execution mode/exception level, etc?
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}
I am new to ARMv8 architecture. I have following basic questions on my mind:
How do I know what is the current execution mode AArch32 or AArch64? Should I read CPSR or SPSR to ascertain this?
What is the current Exception level, EL0/1/2/3?
Once an exception comes, can i read any register to determine whether I am in Serror/Synchronous/IRQ/FIQ exception handler.
TIA.
exception-handling arm arm64
add a comment |
I am new to ARMv8 architecture. I have following basic questions on my mind:
How do I know what is the current execution mode AArch32 or AArch64? Should I read CPSR or SPSR to ascertain this?
What is the current Exception level, EL0/1/2/3?
Once an exception comes, can i read any register to determine whether I am in Serror/Synchronous/IRQ/FIQ exception handler.
TIA.
exception-handling arm arm64
2
"How do I know what is the current execution mode AArch32 or AArch64?" - I figure if the the code trying to check the mode is compiled for 64-bit, the mode is 64-bit; if it's compiled for 32-bit the mode is 32-bit.
– JimmyB
Aug 3 '15 at 12:59
add a comment |
I am new to ARMv8 architecture. I have following basic questions on my mind:
How do I know what is the current execution mode AArch32 or AArch64? Should I read CPSR or SPSR to ascertain this?
What is the current Exception level, EL0/1/2/3?
Once an exception comes, can i read any register to determine whether I am in Serror/Synchronous/IRQ/FIQ exception handler.
TIA.
exception-handling arm arm64
I am new to ARMv8 architecture. I have following basic questions on my mind:
How do I know what is the current execution mode AArch32 or AArch64? Should I read CPSR or SPSR to ascertain this?
What is the current Exception level, EL0/1/2/3?
Once an exception comes, can i read any register to determine whether I am in Serror/Synchronous/IRQ/FIQ exception handler.
TIA.
exception-handling arm arm64
exception-handling arm arm64
asked Aug 3 '15 at 12:43
chetanchetan
498
498
2
"How do I know what is the current execution mode AArch32 or AArch64?" - I figure if the the code trying to check the mode is compiled for 64-bit, the mode is 64-bit; if it's compiled for 32-bit the mode is 32-bit.
– JimmyB
Aug 3 '15 at 12:59
add a comment |
2
"How do I know what is the current execution mode AArch32 or AArch64?" - I figure if the the code trying to check the mode is compiled for 64-bit, the mode is 64-bit; if it's compiled for 32-bit the mode is 32-bit.
– JimmyB
Aug 3 '15 at 12:59
2
2
"How do I know what is the current execution mode AArch32 or AArch64?" - I figure if the the code trying to check the mode is compiled for 64-bit, the mode is 64-bit; if it's compiled for 32-bit the mode is 32-bit.
– JimmyB
Aug 3 '15 at 12:59
"How do I know what is the current execution mode AArch32 or AArch64?" - I figure if the the code trying to check the mode is compiled for 64-bit, the mode is 64-bit; if it's compiled for 32-bit the mode is 32-bit.
– JimmyB
Aug 3 '15 at 12:59
add a comment |
2 Answers
2
active
oldest
votes
- The assembly instructions and their binary encoding are entirely different for 32 and 64 bit. So the information what mode you are currently in is something that you/ the compiler already needs to know during compilation. checking for them at runtime doesn't make sense. For C, C++ checking can be done at compile time (
#ifdef) through compiler provided macros like the ones provided byarmclang:__aarch64__for 64 bit,__arm__for 32 bit - depends on the execution mode:
- aarch32:
MRS <Rn>, CPSRread the current state into register number n. Then extract bits 3:0 that contain the current mode. - aarch64:
MRS <Xn>, CurrentELread the current EL into register number n
- aarch32:
- short answer: you can't. long answer: the assumption is that by the structure of the code and the state of any user defined variables, you already know what you are doing. i.e. whether you came to a position in code through regular code or through an exception.
For the 2nd point I am able to find the current mode when I am in EL1, EL2, or EL3 mode by reading through CPSR register. However, if I am in EL0 mode reading cpsr causes exception.
– chetan
May 4 '16 at 9:00
@chetan: "if I am in EL0 mode reading cpsr causes exception." AFAIK, that of course is the whole point! EL0 is the unprivileged 'app' mode; apps cannot/must not have access to info like this..So, my understanding is, write a kernel module to read register values. It should work as it runs in EL1, if not EL2.
– kaiwan
Jul 27 '17 at 6:30
add a comment |
aarch64 C code:
register uint64_t x0 __asm__ ("x0");
__asm__ ("mrs x0, CurrentEL;" : : : "%x0");
printf("EL = %" PRIu64 "n", x0 >> 2);
arm C code:
register uint32_t r0 __asm__ ("r0");
__asm__ ("mrs r0, CPSR" : : : "%r0");
printf("EL = %" PRIu32 "n", r0 & 0x1F);
Those registers are normally (always?) protected in userland though, so you must to this from the Linux kernel or a baremetal example.
Tested on QEMU and gem5 with this setup.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f31787617%2fwhat-is-the-current-execution-mode-exception-level-etc%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
- The assembly instructions and their binary encoding are entirely different for 32 and 64 bit. So the information what mode you are currently in is something that you/ the compiler already needs to know during compilation. checking for them at runtime doesn't make sense. For C, C++ checking can be done at compile time (
#ifdef) through compiler provided macros like the ones provided byarmclang:__aarch64__for 64 bit,__arm__for 32 bit - depends on the execution mode:
- aarch32:
MRS <Rn>, CPSRread the current state into register number n. Then extract bits 3:0 that contain the current mode. - aarch64:
MRS <Xn>, CurrentELread the current EL into register number n
- aarch32:
- short answer: you can't. long answer: the assumption is that by the structure of the code and the state of any user defined variables, you already know what you are doing. i.e. whether you came to a position in code through regular code or through an exception.
For the 2nd point I am able to find the current mode when I am in EL1, EL2, or EL3 mode by reading through CPSR register. However, if I am in EL0 mode reading cpsr causes exception.
– chetan
May 4 '16 at 9:00
@chetan: "if I am in EL0 mode reading cpsr causes exception." AFAIK, that of course is the whole point! EL0 is the unprivileged 'app' mode; apps cannot/must not have access to info like this..So, my understanding is, write a kernel module to read register values. It should work as it runs in EL1, if not EL2.
– kaiwan
Jul 27 '17 at 6:30
add a comment |
- The assembly instructions and their binary encoding are entirely different for 32 and 64 bit. So the information what mode you are currently in is something that you/ the compiler already needs to know during compilation. checking for them at runtime doesn't make sense. For C, C++ checking can be done at compile time (
#ifdef) through compiler provided macros like the ones provided byarmclang:__aarch64__for 64 bit,__arm__for 32 bit - depends on the execution mode:
- aarch32:
MRS <Rn>, CPSRread the current state into register number n. Then extract bits 3:0 that contain the current mode. - aarch64:
MRS <Xn>, CurrentELread the current EL into register number n
- aarch32:
- short answer: you can't. long answer: the assumption is that by the structure of the code and the state of any user defined variables, you already know what you are doing. i.e. whether you came to a position in code through regular code or through an exception.
For the 2nd point I am able to find the current mode when I am in EL1, EL2, or EL3 mode by reading through CPSR register. However, if I am in EL0 mode reading cpsr causes exception.
– chetan
May 4 '16 at 9:00
@chetan: "if I am in EL0 mode reading cpsr causes exception." AFAIK, that of course is the whole point! EL0 is the unprivileged 'app' mode; apps cannot/must not have access to info like this..So, my understanding is, write a kernel module to read register values. It should work as it runs in EL1, if not EL2.
– kaiwan
Jul 27 '17 at 6:30
add a comment |
- The assembly instructions and their binary encoding are entirely different for 32 and 64 bit. So the information what mode you are currently in is something that you/ the compiler already needs to know during compilation. checking for them at runtime doesn't make sense. For C, C++ checking can be done at compile time (
#ifdef) through compiler provided macros like the ones provided byarmclang:__aarch64__for 64 bit,__arm__for 32 bit - depends on the execution mode:
- aarch32:
MRS <Rn>, CPSRread the current state into register number n. Then extract bits 3:0 that contain the current mode. - aarch64:
MRS <Xn>, CurrentELread the current EL into register number n
- aarch32:
- short answer: you can't. long answer: the assumption is that by the structure of the code and the state of any user defined variables, you already know what you are doing. i.e. whether you came to a position in code through regular code or through an exception.
- The assembly instructions and their binary encoding are entirely different for 32 and 64 bit. So the information what mode you are currently in is something that you/ the compiler already needs to know during compilation. checking for them at runtime doesn't make sense. For C, C++ checking can be done at compile time (
#ifdef) through compiler provided macros like the ones provided byarmclang:__aarch64__for 64 bit,__arm__for 32 bit - depends on the execution mode:
- aarch32:
MRS <Rn>, CPSRread the current state into register number n. Then extract bits 3:0 that contain the current mode. - aarch64:
MRS <Xn>, CurrentELread the current EL into register number n
- aarch32:
- short answer: you can't. long answer: the assumption is that by the structure of the code and the state of any user defined variables, you already know what you are doing. i.e. whether you came to a position in code through regular code or through an exception.
answered Aug 3 '15 at 15:48
Martin KeßlerMartin Keßler
322138
322138
For the 2nd point I am able to find the current mode when I am in EL1, EL2, or EL3 mode by reading through CPSR register. However, if I am in EL0 mode reading cpsr causes exception.
– chetan
May 4 '16 at 9:00
@chetan: "if I am in EL0 mode reading cpsr causes exception." AFAIK, that of course is the whole point! EL0 is the unprivileged 'app' mode; apps cannot/must not have access to info like this..So, my understanding is, write a kernel module to read register values. It should work as it runs in EL1, if not EL2.
– kaiwan
Jul 27 '17 at 6:30
add a comment |
For the 2nd point I am able to find the current mode when I am in EL1, EL2, or EL3 mode by reading through CPSR register. However, if I am in EL0 mode reading cpsr causes exception.
– chetan
May 4 '16 at 9:00
@chetan: "if I am in EL0 mode reading cpsr causes exception." AFAIK, that of course is the whole point! EL0 is the unprivileged 'app' mode; apps cannot/must not have access to info like this..So, my understanding is, write a kernel module to read register values. It should work as it runs in EL1, if not EL2.
– kaiwan
Jul 27 '17 at 6:30
For the 2nd point I am able to find the current mode when I am in EL1, EL2, or EL3 mode by reading through CPSR register. However, if I am in EL0 mode reading cpsr causes exception.
– chetan
May 4 '16 at 9:00
For the 2nd point I am able to find the current mode when I am in EL1, EL2, or EL3 mode by reading through CPSR register. However, if I am in EL0 mode reading cpsr causes exception.
– chetan
May 4 '16 at 9:00
@chetan: "if I am in EL0 mode reading cpsr causes exception." AFAIK, that of course is the whole point! EL0 is the unprivileged 'app' mode; apps cannot/must not have access to info like this..So, my understanding is, write a kernel module to read register values. It should work as it runs in EL1, if not EL2.
– kaiwan
Jul 27 '17 at 6:30
@chetan: "if I am in EL0 mode reading cpsr causes exception." AFAIK, that of course is the whole point! EL0 is the unprivileged 'app' mode; apps cannot/must not have access to info like this..So, my understanding is, write a kernel module to read register values. It should work as it runs in EL1, if not EL2.
– kaiwan
Jul 27 '17 at 6:30
add a comment |
aarch64 C code:
register uint64_t x0 __asm__ ("x0");
__asm__ ("mrs x0, CurrentEL;" : : : "%x0");
printf("EL = %" PRIu64 "n", x0 >> 2);
arm C code:
register uint32_t r0 __asm__ ("r0");
__asm__ ("mrs r0, CPSR" : : : "%r0");
printf("EL = %" PRIu32 "n", r0 & 0x1F);
Those registers are normally (always?) protected in userland though, so you must to this from the Linux kernel or a baremetal example.
Tested on QEMU and gem5 with this setup.
add a comment |
aarch64 C code:
register uint64_t x0 __asm__ ("x0");
__asm__ ("mrs x0, CurrentEL;" : : : "%x0");
printf("EL = %" PRIu64 "n", x0 >> 2);
arm C code:
register uint32_t r0 __asm__ ("r0");
__asm__ ("mrs r0, CPSR" : : : "%r0");
printf("EL = %" PRIu32 "n", r0 & 0x1F);
Those registers are normally (always?) protected in userland though, so you must to this from the Linux kernel or a baremetal example.
Tested on QEMU and gem5 with this setup.
add a comment |
aarch64 C code:
register uint64_t x0 __asm__ ("x0");
__asm__ ("mrs x0, CurrentEL;" : : : "%x0");
printf("EL = %" PRIu64 "n", x0 >> 2);
arm C code:
register uint32_t r0 __asm__ ("r0");
__asm__ ("mrs r0, CPSR" : : : "%r0");
printf("EL = %" PRIu32 "n", r0 & 0x1F);
Those registers are normally (always?) protected in userland though, so you must to this from the Linux kernel or a baremetal example.
Tested on QEMU and gem5 with this setup.
aarch64 C code:
register uint64_t x0 __asm__ ("x0");
__asm__ ("mrs x0, CurrentEL;" : : : "%x0");
printf("EL = %" PRIu64 "n", x0 >> 2);
arm C code:
register uint32_t r0 __asm__ ("r0");
__asm__ ("mrs r0, CPSR" : : : "%r0");
printf("EL = %" PRIu32 "n", r0 & 0x1F);
Those registers are normally (always?) protected in userland though, so you must to this from the Linux kernel or a baremetal example.
Tested on QEMU and gem5 with this setup.
edited Nov 23 '18 at 11:36
answered Nov 23 '18 at 11:30
Ciro SantilliCiro Santilli
760218
760218
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f31787617%2fwhat-is-the-current-execution-mode-exception-level-etc%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
2
"How do I know what is the current execution mode AArch32 or AArch64?" - I figure if the the code trying to check the mode is compiled for 64-bit, the mode is 64-bit; if it's compiled for 32-bit the mode is 32-bit.
– JimmyB
Aug 3 '15 at 12:59