qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH v2 4/9] target-mips: add RI and XI fields to TLB


From: Leon Alrae
Subject: Re: [Qemu-devel] [PATCH v2 4/9] target-mips: add RI and XI fields to TLB entry
Date: Fri, 24 Oct 2014 15:16:29 +0100
User-agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Thunderbird/24.5.0

On 15/10/2014 13:24, Yongbok Kim wrote:
> 
> On 08/07/2014 08:57, Leon Alrae wrote:
>> In Revision 3 of the architecture, the RI and XI bits were added to
>> the TLB
>> to enable more secure access of memory pages. These bits (along with
>> the Dirty
>> bit) allow the implementation of read-only, write-only, no-execute access
>> policies for mapped pages.
>>
>> Signed-off-by: Leon Alrae <address@hidden>
>> ---
>>   target-mips/cpu.h       |   11 +++++++++++
>>   target-mips/helper.c    |   11 ++++++++++-
>>   target-mips/op_helper.c |    8 ++++++++
>>   3 files changed, 29 insertions(+), 1 deletions(-)
>>
>> diff --git a/target-mips/cpu.h b/target-mips/cpu.h
>> index 4f6aa5b..5afafd7 100644
>> --- a/target-mips/cpu.h
>> +++ b/target-mips/cpu.h
>> @@ -30,6 +30,10 @@ struct r4k_tlb_t {
>>       uint_fast16_t V1:1;
>>       uint_fast16_t D0:1;
>>       uint_fast16_t D1:1;
>> +    uint_fast16_t XI0:1;
>> +    uint_fast16_t XI1:1;
>> +    uint_fast16_t RI0:1;
>> +    uint_fast16_t RI1:1;
>>       target_ulong PFN[2];
>>   };
>>   @@ -229,6 +233,13 @@ struct CPUMIPSState {
>>   #define CP0VPEOpt_DWX0    0
>>       target_ulong CP0_EntryLo0;
>>       target_ulong CP0_EntryLo1;
>> +#if defined(TARGET_MIPS64)
>> +# define CP0EnLo_RI 63
>> +# define CP0EnLo_XI 62
>> +#else
>> +# define CP0EnLo_RI 31
>> +# define CP0EnLo_XI 30
>> +#endif
>>       target_ulong CP0_Context;
>>       target_ulong CP0_KScratch[MIPS_KSCRATCH_NUM];
>>       int32_t CP0_PageMask;
>> diff --git a/target-mips/helper.c b/target-mips/helper.c
>> index 9871273..6aa8c8a 100644
>> --- a/target-mips/helper.c
>> +++ b/target-mips/helper.c
>> @@ -27,6 +27,8 @@
>>   #include "sysemu/kvm.h"
>>     enum {
>> +    TLBRET_XI = -6,
>> +    TLBRET_RI = -5,
>>       TLBRET_DIRTY = -4,
>>       TLBRET_INVALID = -3,
>>       TLBRET_NOMATCH = -2,
>> @@ -85,8 +87,15 @@ int r4k_map_address (CPUMIPSState *env, hwaddr
>> *physical, int *prot,
>>               /* TLB match */
>>               int n = !!(address & mask & ~(mask >> 1));
>>               /* Check access rights */
>> -            if (!(n ? tlb->V1 : tlb->V0))
>> +            if (!(n ? tlb->V1 : tlb->V0)) {
>>                   return TLBRET_INVALID;
>> +            }
>> +            if (rw == MMU_INST_FETCH && (n ? tlb->XI1 : tlb->XI0)) {
>> +                return TLBRET_XI;
>> +            }
>> +            if (rw == MMU_DATA_LOAD && (n ? tlb->RI1 : tlb->RI0)) {
>> +                return TLBRET_RI;
> 
> PC relative loads are allowed where execute is allowed (even though RI
> is 1).
> Rather than just return RI here have to check XI and its OP code.

This is true only for MIPS16 PC-relative loads. New R6 PC-relative loads
do cause TLBRI exceptions. Thus in context of Release 6 current
implementation is correct. I agree this will need to be corrected for
MIPS16, but not necessarily in this patchset.

Regards,
Leon




reply via email to

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