qemu-arm
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-arm] [PATCH v8 16/25] cputlb and arm/sparc targets: convert mm


From: Alex Bennée
Subject: Re: [Qemu-arm] [PATCH v8 16/25] cputlb and arm/sparc targets: convert mmuidx flushes from varg to bitmap
Date: Wed, 01 Feb 2017 07:42:36 +0000
User-agent: mu4e 0.9.19; emacs 25.1.91.6

Richard Henderson <address@hidden> writes:

> On 01/27/2017 02:39 AM, Alex Bennée wrote:
>> +    for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++) {
>>
>> -        tlb_debug("%d\n", mmu_idx);
>> +        if (test_bit(mmu_idx, &mmu_idx_bitmask)) {
>> +            tlb_debug("%d\n", mmu_idx);
>>
>> -        memset(env->tlb_table[mmu_idx], -1, sizeof(env->tlb_table[0]));
>> -        memset(env->tlb_v_table[mmu_idx], -1, sizeof(env->tlb_v_table[0]));
>> +            memset(env->tlb_table[mmu_idx], -1, sizeof(env->tlb_table[0]));
>> +            memset(env->tlb_v_table[mmu_idx], -1, 
>> sizeof(env->tlb_v_table[0]));
>> +        }
>
> Perhaps it doesn't matter since NB_MMU_MODES is so small but
>
>    for (; idxmap != 0; idxmap &= idxmap - 1) {
>      int mmu_idx = ctz32(idxmap);
>      ...
>    }
>
> iterates only for the bits that are set.
>
>> -typedef enum ARMMMUIdx {
>> -    ARMMMUIdx_S12NSE0 = 0,
>> -    ARMMMUIdx_S12NSE1 = 1,
>> -    ARMMMUIdx_S1E2 = 2,
>> -    ARMMMUIdx_S1E3 = 3,
>> -    ARMMMUIdx_S1SE0 = 4,
>> -    ARMMMUIdx_S1SE1 = 5,
>> -    ARMMMUIdx_S2NS = 6,
>> +typedef enum ARMMMUBitMap {
>> +    ARMMMUBit_S12NSE0 = 1 << 0,
>> +    ARMMMUBit_S12NSE1 = 1 << 1,
>> +    ARMMMUBit_S1E2 = 1 << 2,
>> +    ARMMMUBit_S1E3 = 1 << 3,
>> +    ARMMMUBit_S1SE0 = 1 << 4,
>> +    ARMMMUBit_S1SE1 = 1 << 5,
>> +    ARMMMUBit_S2NS = 1 << 6,
>>      /* Indexes below here don't have TLBs and are used only for AT system
>>       * instructions or for the first stage of an S12 page table walk.
>>       */
>> -    ARMMMUIdx_S1NSE0 = 7,
>> -    ARMMMUIdx_S1NSE1 = 8,
>> -} ARMMMUIdx;
>> +    ARMMMUBit_S1NSE0 = 1 << 7,
>> +    ARMMMUBit_S1NSE1 = 1 << 8,
>> +} ARMMMUBitMap;
>>
>> -#define MMU_USER_IDX 0
>> +typedef int ARMMMUIdx;
>> +
>> +static inline ARMMMUIdx arm_mmu_bit_to_idx(ARMMMUBitMap bit)
>> +{
>> +    g_assert(ctpop16(bit) == 1);
>> +    return ctz32(bit);
>> +}
>> +
>> +static inline ARMMMUBitMap arm_mmu_idx_to_bit(ARMMMUIdx idx)
>> +{
>> +    return 1 << idx;
>> +}
>
> I don't understand this redefinition though, causing...
>
>> @@ -2109,13 +2109,13 @@ static void ats_write(CPUARMState *env, const 
>> ARMCPRegInfo *ri, uint64_t value)
>>          /* stage 1 current state PL1: ATS1CPR, ATS1CPW */
>>          switch (el) {
>>          case 3:
>> -            mmu_idx = ARMMMUIdx_S1E3;
>> +            mmu_bit = ARMMMUBit_S1E3;
>>              break;
>>          case 2:
>> -            mmu_idx = ARMMMUIdx_S1NSE1;
>> +            mmu_bit = ARMMMUBit_S1NSE1;
>>              break;
>>          case 1:
>> -            mmu_idx = secure ? ARMMMUIdx_S1SE1 : ARMMMUIdx_S1NSE1;
>> +            mmu_bit = secure ? ARMMMUBit_S1SE1 : ARMMMUBit_S1NSE1;
>>              break;
>>          default:
>>              g_assert_not_reached();
>> @@ -2125,13 +2125,13 @@ static void ats_write(CPUARMState *env, const 
>> ARMCPRegInfo *ri, uint64_t value)
>>          /* stage 1 current state PL0: ATS1CUR, ATS1CUW */
>>          switch (el) {
>>          case 3:
>> -            mmu_idx = ARMMMUIdx_S1SE0;
>> +            mmu_bit = ARMMMUBit_S1SE0;
>>              break;
>>          case 2:
>> -            mmu_idx = ARMMMUIdx_S1NSE0;
>> +            mmu_bit = ARMMMUBit_S1NSE0;
>>              break;
>>          case 1:
>> -            mmu_idx = secure ? ARMMMUIdx_S1SE0 : ARMMMUIdx_S1NSE0;
>> +            mmu_bit = secure ? ARMMMUBit_S1SE0 : ARMMMUBit_S1NSE0;
>>              break;
>>          default:
>>              g_assert_not_reached();
>> @@ -2139,17 +2139,17 @@ static void ats_write(CPUARMState *env, const 
>> ARMCPRegInfo *ri, uint64_t value)
>>          break;
>>      case 4:
>>          /* stage 1+2 NonSecure PL1: ATS12NSOPR, ATS12NSOPW */
>> -        mmu_idx = ARMMMUIdx_S12NSE1;
>> +        mmu_bit = ARMMMUBit_S12NSE1;
>>          break;
>>      case 6:
>>          /* stage 1+2 NonSecure PL0: ATS12NSOUR, ATS12NSOUW */
>> -        mmu_idx = ARMMMUIdx_S12NSE0;
>> +        mmu_bit = ARMMMUBit_S12NSE0;
>>          break;
>>      default:
>>          g_assert_not_reached();
>>      }
>>
>> -    par64 = do_ats_write(env, value, access_type, mmu_idx);
>> +    par64 = do_ats_write(env, value, access_type, 
>> arm_mmu_bit_to_idx(mmu_bit));
>
> ... this sort of churn, only to convert *back* to an index.

Yeah I've dropped this is v9, ARM now justs does 1 << ARMMMUIdx_foo at
the tlb_flush call sites.

>
>> @@ -2185,26 +2186,26 @@ static void ats_write64(CPUARMState *env, const 
>> ARMCPRegInfo *ri,
>>      case 0:
>>          switch (ri->opc1) {
>>          case 0: /* AT S1E1R, AT S1E1W */
>> -            mmu_idx = secure ? ARMMMUIdx_S1SE1 : ARMMMUIdx_S1NSE1;
>> +            mmu_idx = secure ? ARMMMUBit_S1SE1 : ARMMMUBit_S1NSE1;
>>              break;
>>          case 4: /* AT S1E2R, AT S1E2W */
>> -            mmu_idx = ARMMMUIdx_S1E2;
>> +            mmu_idx = ARMMMUBit_S1E2;
>>              break;
>>          case 6: /* AT S1E3R, AT S1E3W */
>> -            mmu_idx = ARMMMUIdx_S1E3;
>> +            mmu_idx = ARMMMUBit_S1E3;
>>              break;
>>          default:
>>              g_assert_not_reached();
>>          }
>>          break;
>>      case 2: /* AT S1E0R, AT S1E0W */
>> -        mmu_idx = secure ? ARMMMUIdx_S1SE0 : ARMMMUIdx_S1NSE0;
>> +        mmu_idx = secure ? ARMMMUBit_S1SE0 : ARMMMUBit_S1NSE0;
>>          break;
>>      case 4: /* AT S12E1R, AT S12E1W */
>> -        mmu_idx = secure ? ARMMMUIdx_S1SE1 : ARMMMUIdx_S12NSE1;
>> +        mmu_idx = secure ? ARMMMUBit_S1SE1 : ARMMMUBit_S12NSE1;
>>          break;
>>      case 6: /* AT S12E0R, AT S12E0W */
>> -        mmu_idx = secure ? ARMMMUIdx_S1SE0 : ARMMMUIdx_S12NSE0;
>> +        mmu_idx = secure ? ARMMMUBit_S1SE0 : ARMMMUBit_S12NSE0;
>>          break;
>>      default:
>>          g_assert_not_reached();
>> @@ -2499,8 +2500,8 @@ static void vttbr_write(CPUARMState *env, const 
>> ARMCPRegInfo *ri,
>
> ... and then there's this one where you don't rename the variable, and as far
> as I can tell don't adjust the argument for do_ats_write.
>
> Which is probably a mistake?
>
> Just define both Idx and Bit symbols and be done with it.
>
>
> r~


--
Alex Bennée



reply via email to

[Prev in Thread] Current Thread [Next in Thread]