ARM: Add a cmpxchg implementation to the "comm page".
This implementation does what it's supposed to (I think), but it's not atomic and doesn't have memory barriers like the kernel's version.
This commit is contained in:
parent
37ac2871d5
commit
3ff1e922c2
1 changed files with 12 additions and 0 deletions
|
@ -482,6 +482,18 @@ ArmLinuxProcess::startup()
|
|||
swiNeg1, sizeof(swiNeg1));
|
||||
}
|
||||
|
||||
// This -should- be atomic, but I don't think all the support that we'd
|
||||
// need is implemented. There should also be memory barriers around it.
|
||||
uint8_t cmpxchg[] =
|
||||
{
|
||||
0x00, 0x30, 0x92, 0xe5, //ldr r3, [r2]
|
||||
0x00, 0x30, 0x53, 0xe0, //subs r3, r3, r0
|
||||
0x00, 0x10, 0x92, 0x05, //streq r1, [r2]
|
||||
0x03, 0x00, 0xa0, 0xe1, //mov r0, r3
|
||||
0x0e, 0xf0, 0xa0, 0xe1 //usr_ret lr
|
||||
};
|
||||
tc->getMemPort()->writeBlob(commPage + 0x0fc0, cmpxchg, sizeof(cmpxchg));
|
||||
|
||||
uint8_t get_tls[] =
|
||||
{
|
||||
0x08, 0x00, 0x9f, 0xe5, //ldr r0, [pc, #(16 - 8)]
|
||||
|
|
Loading…
Reference in a new issue