forked from mirrors/linux
		
	KVM: x86 emulator: Leave segment limit and attributs alone in real mode
When loading a segment in real mode, only the base and selector must be modified. The limit needs to be left alone, otherwise big real mode users will hit a #GP due to limit checking (currently this is suppressed because we don't check limits in real mode). Signed-off-by: Avi Kivity <avi@redhat.com> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
This commit is contained in:
		
							parent
							
								
									e2a610d7fc
								
							
						
					
					
						commit
						03ebebeb1f
					
				
					 1 changed files with 2 additions and 6 deletions
				
			
		| 
						 | 
				
			
			@ -1388,19 +1388,15 @@ static int load_segment_descriptor(struct x86_emulate_ctxt *ctxt,
 | 
			
		|||
	bool null_selector = !(selector & ~0x3); /* 0000-0003 are null */
 | 
			
		||||
	ulong desc_addr;
 | 
			
		||||
	int ret;
 | 
			
		||||
	u16 dummy;
 | 
			
		||||
 | 
			
		||||
	memset(&seg_desc, 0, sizeof seg_desc);
 | 
			
		||||
 | 
			
		||||
	if ((seg <= VCPU_SREG_GS && ctxt->mode == X86EMUL_MODE_VM86)
 | 
			
		||||
	    || ctxt->mode == X86EMUL_MODE_REAL) {
 | 
			
		||||
		/* set real mode segment descriptor */
 | 
			
		||||
		ctxt->ops->get_segment(ctxt, &dummy, &seg_desc, NULL, seg);
 | 
			
		||||
		set_desc_base(&seg_desc, selector << 4);
 | 
			
		||||
		set_desc_limit(&seg_desc, 0xffff);
 | 
			
		||||
		seg_desc.type = 3;
 | 
			
		||||
		seg_desc.p = 1;
 | 
			
		||||
		seg_desc.s = 1;
 | 
			
		||||
		if (ctxt->mode == X86EMUL_MODE_VM86)
 | 
			
		||||
			seg_desc.dpl = 3;
 | 
			
		||||
		goto load;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue