@@ -334,25 +334,13 @@ pid_t fork_lazy_child(void)
334
334
335
335
static u32 hw_pkey_get (int pkey , unsigned long flags )
336
336
{
337
- u32 mask = (PKEY_DISABLE_ACCESS |PKEY_DISABLE_WRITE );
338
337
u64 pkey_reg = __read_pkey_reg ();
339
- u64 shifted_pkey_reg ;
340
- u32 masked_pkey_reg ;
341
338
342
339
dprintf1 ("%s(pkey=%d, flags=%lx) = %x / %d\n" ,
343
340
__func__ , pkey , flags , 0 , 0 );
344
341
dprintf2 ("%s() raw pkey_reg: %016llx\n" , __func__ , pkey_reg );
345
342
346
- shifted_pkey_reg = (pkey_reg >> (pkey * PKEY_BITS_PER_PKEY ));
347
- dprintf2 ("%s() shifted_pkey_reg: %016llx\n" , __func__ ,
348
- shifted_pkey_reg );
349
- masked_pkey_reg = shifted_pkey_reg & mask ;
350
- dprintf2 ("%s() masked pkey_reg: %x\n" , __func__ , masked_pkey_reg );
351
- /*
352
- * shift down the relevant bits to the lowest two, then
353
- * mask off all the other high bits.
354
- */
355
- return masked_pkey_reg ;
343
+ return (u32 ) get_pkey_bits (pkey_reg , pkey );
356
344
}
357
345
358
346
static int hw_pkey_set (int pkey , unsigned long rights , unsigned long flags )
@@ -364,12 +352,8 @@ static int hw_pkey_set(int pkey, unsigned long rights, unsigned long flags)
364
352
/* make sure that 'rights' only contains the bits we expect: */
365
353
assert (!(rights & ~mask ));
366
354
367
- /* copy old pkey_reg */
368
- new_pkey_reg = old_pkey_reg ;
369
- /* mask out bits from pkey in old value: */
370
- new_pkey_reg &= ~(mask << (pkey * PKEY_BITS_PER_PKEY ));
371
- /* OR in new bits for pkey: */
372
- new_pkey_reg |= (rights << (pkey * PKEY_BITS_PER_PKEY ));
355
+ /* modify bits accordingly in old pkey_reg and assign it */
356
+ new_pkey_reg = set_pkey_bits (old_pkey_reg , pkey , rights );
373
357
374
358
__write_pkey_reg (new_pkey_reg );
375
359
@@ -403,7 +387,7 @@ void pkey_disable_set(int pkey, int flags)
403
387
ret = hw_pkey_set (pkey , pkey_rights , syscall_flags );
404
388
assert (!ret );
405
389
/* pkey_reg and flags have the same format */
406
- shadow_pkey_reg |= flags << ( pkey * 2 );
390
+ shadow_pkey_reg = set_pkey_bits ( shadow_pkey_reg , pkey , pkey_rights );
407
391
dprintf1 ("%s(%d) shadow: 0x%016llx\n" ,
408
392
__func__ , pkey , shadow_pkey_reg );
409
393
@@ -437,7 +421,7 @@ void pkey_disable_clear(int pkey, int flags)
437
421
pkey_rights |= flags ;
438
422
439
423
ret = hw_pkey_set (pkey , pkey_rights , 0 );
440
- shadow_pkey_reg &= ~( flags << ( pkey * 2 ) );
424
+ shadow_pkey_reg = set_pkey_bits ( shadow_pkey_reg , pkey , pkey_rights );
441
425
pkey_assert (ret >= 0 );
442
426
443
427
pkey_rights = hw_pkey_get (pkey , syscall_flags );
@@ -513,7 +497,8 @@ int alloc_pkey(void)
513
497
shadow_pkey_reg );
514
498
if (ret ) {
515
499
/* clear both the bits: */
516
- shadow_pkey_reg &= ~(0x3 << (ret * 2 ));
500
+ shadow_pkey_reg = set_pkey_bits (shadow_pkey_reg , ret ,
501
+ ~PKEY_MASK );
517
502
dprintf4 ("%s()::%d, ret: %d pkey_reg: 0x%016llx"
518
503
" shadow: 0x%016llx\n" ,
519
504
__func__ ,
@@ -523,7 +508,8 @@ int alloc_pkey(void)
523
508
* move the new state in from init_val
524
509
* (remember, we cheated and init_val == pkey_reg format)
525
510
*/
526
- shadow_pkey_reg |= (init_val << (ret * 2 ));
511
+ shadow_pkey_reg = set_pkey_bits (shadow_pkey_reg , ret ,
512
+ init_val );
527
513
}
528
514
dprintf4 ("%s()::%d, ret: %d pkey_reg: 0x%016llx"
529
515
" shadow: 0x%016llx\n" ,
0 commit comments