target/ppc: Set UPRT and GTSE on all cpus in H_REGISTER_PROCESS_TABLE
The UPRT and GTSE bits are set when a guest calls H_REGISTER_PROCESS_TABLE to choose determine how address translation is performed. Currently these bits in the LPCR are only set for the cpu which handles the H_CALL, however they need to be set for all cpus for that guest as address translation cannot be performed differently on a per cpu basis. Update the H_CALL handler to set these bits in the LPCR correctly for all cpus of the guest. Note it is the reponsibility of the guest to ensure that any secondary cpus are suspended when the H_CALL is made and thus we can safely update these values here. Signed-off-by: Suraj Jitindar Singh <sjitindarsingh@gmail.com> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
		
				
					committed by
					
						 David Gibson
						David Gibson
					
				
			
			
				
	
			
			
			
						parent
						
							53ecf09df3
						
					
				
				
					commit
					6de833070c
				
			| @@ -936,7 +936,7 @@ static target_ulong h_register_process_table(PowerPCCPU *cpu, | |||||||
|                                              target_ulong opcode, |                                              target_ulong opcode, | ||||||
|                                              target_ulong *args) |                                              target_ulong *args) | ||||||
| { | { | ||||||
|     CPUPPCState *env = &cpu->env; |     CPUState *cs; | ||||||
|     target_ulong flags = args[0]; |     target_ulong flags = args[0]; | ||||||
|     target_ulong proc_tbl = args[1]; |     target_ulong proc_tbl = args[1]; | ||||||
|     target_ulong page_size = args[2]; |     target_ulong page_size = args[2]; | ||||||
| @@ -992,16 +992,12 @@ static target_ulong h_register_process_table(PowerPCCPU *cpu, | |||||||
|     spapr_check_setup_free_hpt(spapr, spapr->patb_entry, cproc); |     spapr_check_setup_free_hpt(spapr, spapr->patb_entry, cproc); | ||||||
|  |  | ||||||
|     spapr->patb_entry = cproc; /* Save new process table */ |     spapr->patb_entry = cproc; /* Save new process table */ | ||||||
|     if ((flags & FLAG_RADIX) || (flags & FLAG_HASH_PROC_TBL)) { |  | ||||||
|         /* Use Process TBL */ |     /* Update the UPRT and GTSE bits in the LPCR for all cpus */ | ||||||
|         env->spr[SPR_LPCR] |= LPCR_UPRT; |     CPU_FOREACH(cs) { | ||||||
|     } else { |         set_spr(cs, SPR_LPCR, LPCR_UPRT | LPCR_GTSE, | ||||||
|         env->spr[SPR_LPCR] &= ~LPCR_UPRT; |                 ((flags & (FLAG_RADIX | FLAG_HASH_PROC_TBL)) ? LPCR_UPRT : 0) | | ||||||
|     } |                 ((flags & FLAG_GTSE) ? LPCR_GTSE : 0)); | ||||||
|     if (flags & FLAG_GTSE) { /* Partition Uses Guest Translation Shootdwn */ |  | ||||||
|         env->spr[SPR_LPCR] |= LPCR_GTSE; |  | ||||||
|     } else { |  | ||||||
|         env->spr[SPR_LPCR] &= ~LPCR_GTSE; |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (kvm_enabled()) { |     if (kvm_enabled()) { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user