|
|
1.1 root 1: #include <u.h>
2: #include <libc.h>
3: #include <lock.h>
4:
5: enum
6: {
7: Pagesize = 4096,
8: Semperpg = Pagesize/(16*sizeof(uint)),
9: Lockaddr = 0x60000000,
10:
11: POWER = 0x320,
12: MAGNUM = 0x330,
13: MAGNUMII = 0x340,
14: R4K = 0x500,
15: };
16:
17: static int arch;
18: extern int C_3ktas(int*);
19: extern int C_4ktas(int*);
20: extern int C_fcr0(void);
21:
22: void
23: lockinit()
24: {
25: int n;
26:
27: arch = C_fcr0();
28: switch(arch) {
29: case POWER:
30: n = segattach(SG_CEXEC, "lock", (void*)Lockaddr, Pagesize);
31: if(n < 0) {
32: arch = MAGNUM;
33: break;
34: }
35: memset((void*)Lockaddr, 0, Pagesize);
36: break;
37: case MAGNUM:
38: case MAGNUMII:
39: case R4K:
40: break;
41: default:
42: abort();
43: }
44:
45: }
46:
47: void
48: lock(Lock *lk)
49: {
50: int *hwsem;
51: int hash;
52:
53: switch(arch) {
54: case MAGNUM:
55: case MAGNUMII:
56: while(C_3ktas(&lk->val))
57: sleep(0);
58: return;
59: case R4K:
60: for(;;){
61: while(lk->val)
62: ;
63: if(C_4ktas(&lk->val) == 0)
64: return;
65: }
66: break;
67: case POWER:
68: /* Use low order lock bits to generate hash */
69: hash = ((int)lk/sizeof(int)) & (Semperpg-1);
70: hwsem = (int*)Lockaddr+hash;
71:
72: for(;;) {
73: if((*hwsem & 1) == 0) {
74: if(lk->val)
75: *hwsem = 0;
76: else {
77: lk->val = 1;
78: *hwsem = 0;
79: return;
80: }
81: }
82: while(lk->val)
83: ;
84: }
85: }
86: }
87:
88: int
89: canlock(Lock *lk)
90: {
91: int *hwsem;
92: int hash;
93:
94: switch(arch) {
95: case MAGNUM:
96: case MAGNUMII:
97: if(C_3ktas(&lk->val))
98: return 0;
99: return 1;
100: case R4K:
101: if(C_4ktas(&lk->val))
102: return 0;
103: return 1;
104: case POWER:
105: /* Use low order lock bits to generate hash */
106: hash = ((int)lk/sizeof(int)) & (Semperpg-1);
107: hwsem = (int*)Lockaddr+hash;
108:
109: if((*hwsem & 1) == 0) {
110: if(lk->val)
111: *hwsem = 0;
112: else {
113: lk->val = 1;
114: *hwsem = 0;
115: return 1;
116: }
117: }
118: return 0;
119: }
120: }
121:
122: void
123: unlock(Lock *lk)
124: {
125: lk->val = 0;
126: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.