Hi,

I'm trying to debug some user-mode software that is using the LDT in ways which 
AFAIK are correct on x86-64, but which are provoking a GPF when running in FS 
mode on M5 (either the tip, or some older trees I've been using).

This is running on the Barrelfish OS, so the way the software's using the LDT 
may well be different from Linux or other cases that have been used in the past.

The GPF happens at a "mov %ax, %fs" instruction.  %ax is 7 => RPL=3, and use 
the first entry in the LDT.  It looks like the LDT is 0, and the GPF occurs 
when accessing address 0 to load the first entry.  The program previously 
initializes the LDT via an LLDT instruction in a system call, but it looks like 
the value is not being written correctly.

Looking at LLDT_R in src/arch/x86/isa/insts/system/segmentation.py:

   def macroop LLDT_R
   {
       .serializing
       chks reg, t0, InGDTCheck, flags=(EZF,)
       br label("end"), flags=(CEZF,)
       limm t4, 0, dataSize=8
       srli t4, reg, 3, dataSize=2
       ldst t1, tsg, [8, t4, t0], dataSize=8
       ld t2, tsg, [8, t4, t0], 8, dataSize=8
       chks reg, t1, LDTCheck
       wrdh t3, t1, t2
       wrdl tr, t1, reg
       wrbase tr, t3, dataSize=8
   end:
       fault "NoFault"
   };

Is there a bug with the final two stores to TR?  I'd been expecting the code to 
be setting the base and limit of TSL somewhere (by analogy with TSG in LGDT).  
I'm not sure I understand x86 segmentation to be very confident of writing a 
fix - e.g., if it's just TR->TSL, or if there's something more subtle needed 
(or indeed if I'm completely wrong here!).

Thanks,

Tim




_______________________________________________
m5-dev mailing list
m5-dev@m5sim.org
http://m5sim.org/mailman/listinfo/m5-dev

Reply via email to