require '_h2ph_pre.ph'; no warnings 'redefine'; unless(defined(&__ASM_ARM_ATOMIC_H)) { eval 'sub __ASM_ARM_ATOMIC_H () {1;}' unless defined(&__ASM_ARM_ATOMIC_H); require 'linux/compiler.ph'; eval 'sub ATOMIC_INIT { my($i) = @_; eval q({ ($i) }); }' unless defined(&ATOMIC_INIT); if(defined(&__KERNEL__)) { eval 'sub atomic_read { my($v) = @_; eval q((($v)-> &counter)); }' unless defined(&atomic_read); if((defined(&__LINUX_ARM_ARCH__) ? &__LINUX_ARM_ARCH__ : 0) >= 6) { eval 'sub atomic_add_return { my($i,$v) = @_; eval q(\\"(assembly code)\\"); }' unless defined(&atomic_add_return); eval 'sub atomic_sub_return { my($i,$v) = @_; eval q(\\"(assembly code)\\"); }' unless defined(&atomic_sub_return); eval 'sub atomic_cmpxchg { my($ptr,$old,$new) = @_; eval q(\\"(assembly code)\\"); }' unless defined(&atomic_cmpxchg); eval 'sub atomic_clear_mask { my($mask,$addr) = @_; eval q(\\"(assembly code)\\"); }' unless defined(&atomic_clear_mask); } else { require 'asm/system.ph'; if(defined(&CONFIG_SMP)) { die("SMP\ not\ supported\ on\ pre\-ARMv6\ CPUs"); } eval 'sub atomic_set { my($v,$i) = @_; eval q(((($v)-> &counter) = ($i))); }' unless defined(&atomic_set); eval 'sub atomic_add_return { my($i,$v) = @_; eval q({ my $flags; \'int\' &val; &local_irq_save( $flags); &val = ($v->{counter}); ($v->{counter}) = &val += $i; &local_irq_restore( $flags); &val; }); }' unless defined(&atomic_add_return); eval 'sub atomic_sub_return { my($i,$v) = @_; eval q({ my $flags; \'int\' &val; &local_irq_save( $flags); &val = ($v->{counter}); ($v->{counter}) = &val -= $i; &local_irq_restore( $flags); &val; }); }' unless defined(&atomic_sub_return); eval 'sub atomic_cmpxchg { my($v,$old,$new) = @_; eval q({ \'int\' &ret; my $flags; &local_irq_save( $flags); &ret = ($v->{counter}); &if ( &likely( &ret == $old)) ($v->{counter}) = $new; &local_irq_restore( $flags); &ret; }); }' unless defined(&atomic_cmpxchg); eval 'sub atomic_clear_mask { my($mask,$addr) = @_; eval q({ my $flags; &local_irq_save( $flags); *$addr &= ~$mask; &local_irq_restore( $flags); }); }' unless defined(&atomic_clear_mask); } eval 'sub atomic_xchg { my($v, $new) = @_; eval q(( &xchg((($v)-> &counter), $new))); }' unless defined(&atomic_xchg); eval 'sub atomic_add_unless { my($v,$a,$u) = @_; eval q({ \'int\' &c, &old; &c = &atomic_read($v); &while ( &c != $u && ( &old = &atomic_cmpxchg(($v), &c, &c + $a)) != &c) &c = &old; &c != $u; }); }' unless defined(&atomic_add_unless); eval 'sub atomic_inc_not_zero { my($v) = @_; eval q( &atomic_add_unless(($v), 1, 0)); }' unless defined(&atomic_inc_not_zero); eval 'sub atomic_add { my($i, $v) = @_; eval q(( &void) &atomic_add_return($i, $v)); }' unless defined(&atomic_add); eval 'sub atomic_inc { my($v) = @_; eval q(( &void) &atomic_add_return(1, $v)); }' unless defined(&atomic_inc); eval 'sub atomic_sub { my($i, $v) = @_; eval q(( &void) &atomic_sub_return($i, $v)); }' unless defined(&atomic_sub); eval 'sub atomic_dec { my($v) = @_; eval q(( &void) &atomic_sub_return(1, $v)); }' unless defined(&atomic_dec); eval 'sub atomic_inc_and_test { my($v) = @_; eval q(( &atomic_add_return(1, $v) == 0)); }' unless defined(&atomic_inc_and_test); eval 'sub atomic_dec_and_test { my($v) = @_; eval q(( &atomic_sub_return(1, $v) == 0)); }' unless defined(&atomic_dec_and_test); eval 'sub atomic_inc_return { my($v) = @_; eval q(( &atomic_add_return(1, $v))); }' unless defined(&atomic_inc_return); eval 'sub atomic_dec_return { my($v) = @_; eval q(( &atomic_sub_return(1, $v))); }' unless defined(&atomic_dec_return); eval 'sub atomic_sub_and_test { my($i, $v) = @_; eval q(( &atomic_sub_return($i, $v) == 0)); }' unless defined(&atomic_sub_and_test); eval 'sub atomic_add_negative { my($i,$v) = @_; eval q(( &atomic_add_return($i, $v) < 0)); }' unless defined(&atomic_add_negative); eval 'sub smp_mb__before_atomic_dec () { eval q( &barrier()); }' unless defined(&smp_mb__before_atomic_dec); eval 'sub smp_mb__after_atomic_dec () { eval q( &barrier()); }' unless defined(&smp_mb__after_atomic_dec); eval 'sub smp_mb__before_atomic_inc () { eval q( &barrier()); }' unless defined(&smp_mb__before_atomic_inc); eval 'sub smp_mb__after_atomic_inc () { eval q( &barrier()); }' unless defined(&smp_mb__after_atomic_inc); require 'asm-generic/atomic.ph'; } } 1;