261 static void
262 zulu_ctx_tsb_lock_enter(struct zulu_hat *zhat)
263 {
264 uint64_t lck;
265 uint64_t *plck;
266
267 ASSERT(mutex_owned(&zhat->lock));
268
269 if (zhat->zulu_ctx < 0) {
270 return;
271 }
272 plck = (uint64_t *)&zulu_ctx_tab[zhat->zulu_ctx];
273
274 for (; ; ) {
275 lck = *plck;
276 if (!(lck & ZULU_CTX_LOCK)) {
277 uint64_t old_lck, new_lck;
278
279 new_lck = lck | ZULU_CTX_LOCK;
280
281 old_lck = cas64(plck, lck, new_lck);
282
283 if (old_lck == lck) {
284 /*
285 * success
286 */
287 break;
288 }
289 }
290 }
291 }
292
293 static void
294 zulu_ctx_tsb_lock_exit(struct zulu_hat *zhat)
295 {
296 uint64_t lck;
297 int zulu_ctx = zhat->zulu_ctx;
298
299 if (zulu_ctx < 0) {
300 return;
301 }
|
261 static void
262 zulu_ctx_tsb_lock_enter(struct zulu_hat *zhat)
263 {
264 uint64_t lck;
265 uint64_t *plck;
266
267 ASSERT(mutex_owned(&zhat->lock));
268
269 if (zhat->zulu_ctx < 0) {
270 return;
271 }
272 plck = (uint64_t *)&zulu_ctx_tab[zhat->zulu_ctx];
273
274 for (; ; ) {
275 lck = *plck;
276 if (!(lck & ZULU_CTX_LOCK)) {
277 uint64_t old_lck, new_lck;
278
279 new_lck = lck | ZULU_CTX_LOCK;
280
281 old_lck = atomic_cas_64(plck, lck, new_lck);
282
283 if (old_lck == lck) {
284 /*
285 * success
286 */
287 break;
288 }
289 }
290 }
291 }
292
293 static void
294 zulu_ctx_tsb_lock_exit(struct zulu_hat *zhat)
295 {
296 uint64_t lck;
297 int zulu_ctx = zhat->zulu_ctx;
298
299 if (zulu_ctx < 0) {
300 return;
301 }
|