Weird SPSR behaviour

I was trying to write a register context saving/restoring when I came across a weird behaviour.

My code (sorry, tried to format tens of times, but the editor WANTS to make asm a table):

asm volatile (
...
"pop {r0 - r3}"
"push {r0 - r3}"
"mov r0, r3"
"bl dbg_out" - outputs 60000013
"pop {r0 - r3}"
"msr cpsr_fsxc, r2"
"@dsb"
"@isb"
"msr spsr_fsxc, r3" - set value
"@dsb"
"@isb"
"mov lr, r1"
"mov sp, r0"
"push {r0 - r4, lr}"
"mov r0, lr"
"bl dbg_out"
"mov r0, sp"
"bl dbg_out"
"mrs r2, cpsr"
"mrs r3, spsr" - read value
"mov r0, r2"
"bl dbg_out"
"mov r0, r3" - outputs 00000002
"bl dbg_out"
...
);

When the exception is returned from, the calling function:

asm volatile ("svc #0\n\t");

    msg = "returned from SVC\r\n";

    serial_io.put_string(msg, util_str_len(msg)+1);

    asm volatile (

"mrs %[retreg], cpsr\n\t"
:[retreg] "=r" (tmp1) ::

    );

    msg = "cpsr = ";

    serial_io.put_string(msg, util_str_len(msg)+1);

    util_word_to_hex(scratchpad, tmp1);

    serial_io.put_string(scratchpad, 9);

    serial_io.put_string("\r\n", 3);

outputs "returned from SVC" and "cpsr = 60000013".

Why the "00000002"? the barriers don't seem to have any effect.

Parents
  • Hello turboscrew,

    do you wonder why  "00000002" was read as SPSR?

    If it would be correct, I think "msr cpsr_fsxc, r2" would affect it.

    By changing CSPR, the execution mode was changed.

    After that, the SPSR would be read from the new execution mode.

    Probably it would be unknown value.

    I guess you did recover CPSR to SVC mode after reading SPSR.

    Therefore, the correct CPSR was read in the main function.

    Best regards,

    Yasuhiko Koumoto.

Reply
  • Hello turboscrew,

    do you wonder why  "00000002" was read as SPSR?

    If it would be correct, I think "msr cpsr_fsxc, r2" would affect it.

    By changing CSPR, the execution mode was changed.

    After that, the SPSR would be read from the new execution mode.

    Probably it would be unknown value.

    I guess you did recover CPSR to SVC mode after reading SPSR.

    Therefore, the correct CPSR was read in the main function.

    Best regards,

    Yasuhiko Koumoto.

Children
More questions in this forum