@@ -45,11 +45,14 @@ static inline unsigned int tlb1_max_shadow_size(void)
45
45
return host_tlb_params [1 ].entries - tlbcam_index - 1 ;
46
46
}
47
47
48
- static inline u32 e500_shadow_mas3_attrib (u32 mas3 , int usermode )
48
+ static inline u32 e500_shadow_mas3_attrib (u32 mas3 , bool writable , int usermode )
49
49
{
50
50
/* Mask off reserved bits. */
51
51
mas3 &= MAS3_ATTRIB_MASK ;
52
52
53
+ if (!writable )
54
+ mas3 &= ~(MAS3_UW |MAS3_SW );
55
+
53
56
#ifndef CONFIG_KVM_BOOKE_HV
54
57
if (!usermode ) {
55
58
/* Guest is in supervisor mode,
@@ -244,10 +247,13 @@ static inline int tlbe_is_writable(struct kvm_book3e_206_tlb_entry *tlbe)
244
247
245
248
static inline void kvmppc_e500_ref_setup (struct tlbe_ref * ref ,
246
249
struct kvm_book3e_206_tlb_entry * gtlbe ,
247
- kvm_pfn_t pfn , unsigned int wimg )
250
+ kvm_pfn_t pfn , unsigned int wimg ,
251
+ bool writable )
248
252
{
249
253
ref -> pfn = pfn ;
250
254
ref -> flags = E500_TLB_VALID ;
255
+ if (writable )
256
+ ref -> flags |= E500_TLB_WRITABLE ;
251
257
252
258
/* Use guest supplied MAS2_G and MAS2_E */
253
259
ref -> flags |= (gtlbe -> mas2 & MAS2_ATTRIB_MASK ) | wimg ;
@@ -303,14 +309,15 @@ static void kvmppc_e500_setup_stlbe(
303
309
{
304
310
kvm_pfn_t pfn = ref -> pfn ;
305
311
u32 pr = vcpu -> arch .shared -> msr & MSR_PR ;
312
+ bool writable = !!(ref -> flags & E500_TLB_WRITABLE );
306
313
307
314
BUG_ON (!(ref -> flags & E500_TLB_VALID ));
308
315
309
316
/* Force IPROT=0 for all guest mappings. */
310
317
stlbe -> mas1 = MAS1_TSIZE (tsize ) | get_tlb_sts (gtlbe ) | MAS1_VALID ;
311
318
stlbe -> mas2 = (gvaddr & MAS2_EPN ) | (ref -> flags & E500_TLB_MAS2_ATTR );
312
319
stlbe -> mas7_3 = ((u64 )pfn << PAGE_SHIFT ) |
313
- e500_shadow_mas3_attrib (gtlbe -> mas7_3 , pr );
320
+ e500_shadow_mas3_attrib (gtlbe -> mas7_3 , writable , pr );
314
321
}
315
322
316
323
static inline int kvmppc_e500_shadow_map (struct kvmppc_vcpu_e500 * vcpu_e500 ,
@@ -487,7 +494,7 @@ static inline int kvmppc_e500_shadow_map(struct kvmppc_vcpu_e500 *vcpu_e500,
487
494
}
488
495
local_irq_restore (flags );
489
496
490
- kvmppc_e500_ref_setup (ref , gtlbe , pfn , wimg );
497
+ kvmppc_e500_ref_setup (ref , gtlbe , pfn , wimg , true );
491
498
kvmppc_e500_setup_stlbe (& vcpu_e500 -> vcpu , gtlbe , tsize ,
492
499
ref , gvaddr , stlbe );
493
500
writable = tlbe_is_writable (stlbe );
0 commit comments