Lines 680-698
futex_atomic_op(struct thread *td, int encoded_op, uint32_t *uaddr)
Link Here
|
680 |
|
680 |
|
681 |
switch (op) { |
681 |
switch (op) { |
682 |
case FUTEX_OP_SET: |
682 |
case FUTEX_OP_SET: |
683 |
ret = futex_xchgl(oparg, uaddr, &oldval); |
683 |
// ret = futex_xchgl(oparg, uaddr, &oldval); |
|
|
684 |
|
685 |
ret = fueword32(uaddr, &oldval); |
686 |
if (ret != 0) |
687 |
return (ret); |
688 |
oldval = atomic_swap_int(&oldval, oparg); |
689 |
ret = suword32(uaddr, oldval); |
690 |
if (ret != 0) |
691 |
return (ret); |
692 |
|
684 |
break; |
693 |
break; |
685 |
case FUTEX_OP_ADD: |
694 |
case FUTEX_OP_ADD: |
686 |
ret = futex_addl(oparg, uaddr, &oldval); |
695 |
// ret = futex_addl(oparg, uaddr, &oldval); |
|
|
696 |
|
697 |
ret = fueword32(uaddr, &oldval); |
698 |
if (ret != 0) |
699 |
return (ret); |
700 |
oldval = atomic_fetchadd_int(&oldval, oparg); |
701 |
ret = suword32(uaddr, oldval); |
702 |
if (ret != 0) |
703 |
return (ret); |
704 |
|
687 |
break; |
705 |
break; |
688 |
case FUTEX_OP_OR: |
706 |
case FUTEX_OP_OR: |
689 |
ret = futex_orl(oparg, uaddr, &oldval); |
707 |
// ret = futex_orl(oparg, uaddr, &oldval); |
|
|
708 |
|
709 |
ret = fueword32(uaddr, &oldval); |
710 |
if (ret != 0) |
711 |
return (ret); |
712 |
while (!atomic_fcmpset_int(&oldval, &oldval, oldval | oparg)) |
713 |
; |
714 |
ret = suword32(uaddr, oldval); |
715 |
if (ret != 0) |
716 |
return (ret); |
717 |
|
690 |
break; |
718 |
break; |
691 |
case FUTEX_OP_ANDN: |
719 |
case FUTEX_OP_ANDN: |
692 |
ret = futex_andl(~oparg, uaddr, &oldval); |
720 |
// ret = futex_andl(~oparg, uaddr, &oldval); |
|
|
721 |
|
722 |
ret = fueword32(uaddr, &oldval); |
723 |
if (ret != 0) |
724 |
return (ret); |
725 |
while (!atomic_fcmpset_int(&oldval, &oldval, oldval & (~oparg))) |
726 |
; |
727 |
ret = suword32(uaddr, oldval); |
728 |
if (ret != 0) |
729 |
return (ret); |
730 |
|
693 |
break; |
731 |
break; |
694 |
case FUTEX_OP_XOR: |
732 |
case FUTEX_OP_XOR: |
695 |
ret = futex_xorl(oparg, uaddr, &oldval); |
733 |
// ret = futex_xorl(oparg, uaddr, &oldval); |
|
|
734 |
|
735 |
ret = fueword32(uaddr, &oldval); |
736 |
if (ret != 0) |
737 |
return (ret); |
738 |
while (!atomic_fcmpset_int(&oldval, &oldval, oldval ^ oparg)) |
739 |
; |
740 |
ret = suword32(uaddr, oldval); |
741 |
if (ret != 0) |
742 |
return (ret); |
743 |
|
696 |
break; |
744 |
break; |
697 |
default: |
745 |
default: |
698 |
LIN_SDT_PROBE1(futex, futex_atomic_op, unimplemented_op, op); |
746 |
LIN_SDT_PROBE1(futex, futex_atomic_op, unimplemented_op, op); |