Blame


1 e5c26b01 2004-09-20 devnull #include "u.h"
2 e5c26b01 2004-09-20 devnull #include "libc.h"
3 e5c26b01 2004-09-20 devnull
4 e5c26b01 2004-09-20 devnull /*
5 e5c26b01 2004-09-20 devnull * first argument (l) is in r3 at entry.
6 e5c26b01 2004-09-20 devnull * r3 contains return value upon return.
7 e5c26b01 2004-09-20 devnull */
8 e5c26b01 2004-09-20 devnull int
9 e5c26b01 2004-09-20 devnull _tas(int *x)
10 e5c26b01 2004-09-20 devnull {
11 e5c26b01 2004-09-20 devnull int v;
12 e5c26b01 2004-09-20 devnull int tmp, tmp2, tmp3;
13 e5c26b01 2004-09-20 devnull
14 e5c26b01 2004-09-20 devnull /*
15 e5c26b01 2004-09-20 devnull * this __asm__ works with gcc on linux
16 e5c26b01 2004-09-20 devnull */
17 e5c26b01 2004-09-20 devnull __asm__("\n sync\n"
18 e5c26b01 2004-09-20 devnull " li %1,0\n"
19 e5c26b01 2004-09-20 devnull " mr %2,%4 /* &x->val */\n"
20 e5c26b01 2004-09-20 devnull " lis %3,0xdead /* assemble constant 0xdeaddead */\n"
21 e5c26b01 2004-09-20 devnull " ori %3,%3,0xdead /* \" */\n"
22 e5c26b01 2004-09-20 devnull "tas1:\n"
23 e5c26b01 2004-09-20 devnull " dcbf %2,%1 /* cache flush; \"fix for 603x bug\" */\n"
24 e5c26b01 2004-09-20 devnull " lwarx %0,%2,%1 /* v = x->val with reservation */\n"
25 e5c26b01 2004-09-20 devnull " cmp cr0,0,%0,%1 /* v == 0 */\n"
26 e5c26b01 2004-09-20 devnull " bne tas0\n"
27 e5c26b01 2004-09-20 devnull " stwcx. %3,%2,%1 /* if (x->val same) x->val = 0xdeaddead */\n"
28 e5c26b01 2004-09-20 devnull " bne tas1\n"
29 e5c26b01 2004-09-20 devnull "tas0:\n"
30 e5c26b01 2004-09-20 devnull " sync\n"
31 e5c26b01 2004-09-20 devnull " isync\n"
32 e5c26b01 2004-09-20 devnull : "=r" (v), "=&r" (tmp), "=&r"(tmp2), "=&r"(tmp3)
33 e5c26b01 2004-09-20 devnull : "r" (x)
34 e5c26b01 2004-09-20 devnull : "cr0", "memory"
35 e5c26b01 2004-09-20 devnull );
36 e5c26b01 2004-09-20 devnull switch(v) {
37 e5c26b01 2004-09-20 devnull case 0: return 0;
38 e5c26b01 2004-09-20 devnull case 0xdeaddead: return 1;
39 e5c26b01 2004-09-20 devnull default: fprint(2, "tas: corrupted 0x%lux\n", v);
40 e5c26b01 2004-09-20 devnull }
41 e5c26b01 2004-09-20 devnull return 0;
42 e5c26b01 2004-09-20 devnull }