I've getting close to emptying my queue. I'm up to where I added a hack 
for page faults. When we last left that discussion, we were talking 
about how to connect the TLB so that it could delay responding and 
whether it would be a good idea to use ports for something like that. If 
it is ports, then the question is whether that's hidden inside of or 
exposed to the memory system. There were concerns about the performance 
penalty having the extra layer might cause. Should it use ports? Should 
it be inside or outside of the CPU SimObject?

Gabe

Gabe Black wrote:
> changeset 8cd8e1393990 in /z/repo/m5
> details: http://repo.m5sim.org/m5?cmd=changeset;node=8cd8e1393990
> description:
>       X86: Make the fault classes handle error codes better.
>
> diffstat:
>
> 3 files changed, 46 insertions(+), 23 deletions(-)
> src/arch/x86/faults.cc              |    4 +-
> src/arch/x86/faults.hh              |   54 ++++++++++++++++++++++++-----------
> src/arch/x86/isa/microops/regop.isa |   11 +++----
>
> diffs (202 lines):
>
> diff -r f770af5600c9 -r 8cd8e1393990 src/arch/x86/faults.cc
> --- a/src/arch/x86/faults.cc  Sun Feb 01 17:07:43 2009 -0800
> +++ b/src/arch/x86/faults.cc  Sun Feb 01 17:08:32 2009 -0800
> @@ -123,7 +123,9 @@
>          }
>          tc->setIntReg(INTREG_MICRO(1), vector);
>          tc->setIntReg(INTREG_MICRO(7), tc->readPC());
> -        tc->setIntReg(INTREG_MICRO(15), (uint64_t)(-1));
> +        if (errorCode != (uint64_t)(-1)) {
> +            tc->setIntReg(INTREG_MICRO(15), errorCode);
> +        }
>          tc->setMicroPC(romMicroPC(entry));
>          tc->setNextMicroPC(romMicroPC(entry) + 1);
>      }
> diff -r f770af5600c9 -r 8cd8e1393990 src/arch/x86/faults.hh
> --- a/src/arch/x86/faults.hh  Sun Feb 01 17:07:43 2009 -0800
> +++ b/src/arch/x86/faults.hh  Sun Feb 01 17:08:32 2009 -0800
> @@ -58,6 +58,7 @@
>  #ifndef __ARCH_X86_FAULTS_HH__
>  #define __ARCH_X86_FAULTS_HH__
>  
> +#include "base/bitunion.hh"
>  #include "base/misc.hh"
>  #include "sim/faults.hh"
>  
> @@ -73,7 +74,7 @@
>          uint64_t errorCode;
>  
>          X86FaultBase(const char * _faultName, const char * _mnem,
> -                const uint8_t _vector, uint64_t _errorCode = 0) :
> +                const uint8_t _vector, uint64_t _errorCode = -1) :
>              faultName(_faultName), mnem(_mnem),
>              vector(_vector), errorCode(_errorCode)
>          {
> @@ -107,7 +108,7 @@
>      {
>        protected:
>          X86Fault(const char * name, const char * mnem,
> -                const uint8_t vector, uint64_t _errorCode = 0) :
> +                const uint8_t vector, uint64_t _errorCode = -1) :
>              X86FaultBase(name, mnem, vector, _errorCode)
>          {}
>      };
> @@ -118,7 +119,7 @@
>      {
>        protected:
>          X86Trap(const char * name, const char * mnem,
> -                const uint8_t vector, uint64_t _errorCode = 0) :
> +                const uint8_t vector, uint64_t _errorCode = -1) :
>              X86FaultBase(name, mnem, vector, _errorCode)
>          {}
>  
> @@ -132,7 +133,7 @@
>      {
>        protected:
>          X86Abort(const char * name, const char * mnem,
> -                const uint8_t vector, uint64_t _errorCode = 0) :
> +                const uint8_t vector, uint64_t _errorCode = -1) :
>              X86FaultBase(name, mnem, vector, _errorCode)
>          {}
>  
> @@ -146,7 +147,7 @@
>      {
>        protected:
>          X86Interrupt(const char * name, const char * mnem,
> -                const uint8_t _vector, uint64_t _errorCode = 0) :
> +                const uint8_t _vector, uint64_t _errorCode = -1) :
>              X86FaultBase(name, mnem, _vector, _errorCode)
>          {}
>  
> @@ -273,48 +274,69 @@
>      {
>        public:
>          DoubleFault() :
> -            X86Abort("Double-Fault", "#DF", 8)
> +            X86Abort("Double-Fault", "#DF", 8, 0)
>          {}
>      };
>  
>      class InvalidTSS : public X86Fault
>      {
>        public:
> -        InvalidTSS() :
> -            X86Fault("Invalid-TSS", "#TS", 10)
> +        InvalidTSS(uint32_t _errorCode) :
> +            X86Fault("Invalid-TSS", "#TS", 10, _errorCode)
>          {}
>      };
>  
>      class SegmentNotPresent : public X86Fault
>      {
>        public:
> -        SegmentNotPresent() :
> -            X86Fault("Segment-Not-Present", "#NP", 11)
> +        SegmentNotPresent(uint32_t _errorCode) :
> +            X86Fault("Segment-Not-Present", "#NP", 11, _errorCode)
>          {}
>      };
>  
>      class StackFault : public X86Fault
>      {
>        public:
> -        StackFault() :
> -            X86Fault("Stack", "#SS", 12)
> +        StackFault(uint32_t _errorCode) :
> +            X86Fault("Stack", "#SS", 12, _errorCode)
>          {}
>      };
>  
>      class GeneralProtection : public X86Fault
>      {
>        public:
> -        GeneralProtection(uint64_t _errorCode) :
> +        GeneralProtection(uint32_t _errorCode) :
>              X86Fault("General-Protection", "#GP", 13, _errorCode)
>          {}
>      };
>  
>      class PageFault : public X86Fault
>      {
> +      protected:
> +        BitUnion32(PageFaultErrorCode)
> +            Bitfield<0> present;
> +            Bitfield<1> write;
> +            Bitfield<2> user;
> +            Bitfield<3> reserved;
> +            Bitfield<4> fetch;
> +        EndBitUnion(PageFaultErrorCode)
> +
>        public:
> -        PageFault() :
> -            X86Fault("Page-Fault", "#PF", 14)
> +        PageFault(uint32_t _errorCode) :
> +            X86Fault("Page-Fault", "#PF", 14, _errorCode)
>          {}
> +        PageFault(bool present, bool write, bool user,
> +                bool reserved, bool fetch) :
> +            X86Fault("Page-Fault", "#PF", 14, 0)
> +        {
> +            PageFaultErrorCode code = 0;
> +            code.present = present;
> +            code.write = write;
> +            code.user = user;
> +            code.reserved = reserved;
> +            code.fetch = fetch;
> +            errorCode = code;
> +        }
>      };
>  
>      class X87FpExceptionPending : public X86Fault
> @@ -329,7 +351,7 @@
>      {
>        public:
>          AlignmentCheck() :
> -            X86Fault("Alignment-Check", "#AC", 17)
> +            X86Fault("Alignment-Check", "#AC", 17, 0)
>          {}
>      };
>  
> diff -r f770af5600c9 -r 8cd8e1393990 src/arch/x86/isa/microops/regop.isa
> --- a/src/arch/x86/isa/microops/regop.isa     Sun Feb 01 17:07:43 2009 -0800
> +++ b/src/arch/x86/isa/microops/regop.isa     Sun Feb 01 17:08:32 2009 -0800
> @@ -1069,7 +1069,7 @@
>                case SegSoftIntGateCheck:
>                  // Check permissions.
>                  if (desc.dpl < m5reg.cpl) {
> -                    fault = new GeneralProtection((uint16_t)selector);
> +                    fault = new GeneralProtection(selector);
>                  }
>                  // Fall through on purpose
>                case SegIntGateCheck:
> @@ -1082,8 +1082,7 @@
>                case SegSSCheck:
>                  if (selector.si || selector.ti) {
>                      if (!desc.p) {
> -                        //FIXME This needs to also push the selector.
> -                        fault = new StackFault;
> +                        fault = new StackFault(selector);
>                      }
>                  } else {
>                      if ((m5reg.submode != SixtyFourBitMode ||
> @@ -1092,7 +1091,7 @@
>                              desc.type.codeOrData == 0 && desc.type.w) ||
>                              (desc.dpl != m5reg.cpl) ||
>                              (selector.rpl != m5reg.cpl)) {
> -                        fault = new GeneralProtection(psrc1 & 0xFFFF);
> +                        fault = new GeneralProtection(selector);
>                      }
>                  }
>                  break;
> @@ -1103,9 +1102,9 @@
>                              !(desc.s == 1 && desc.type.codeOrData == 1) ||
>                              (!desc.type.c && desc.dpl != selector.rpl) ||
>                              (desc.type.c && desc.dpl > selector.rpl)) {
> -                        fault = new GeneralProtection(psrc1 & 0xFFFF);
> +                        fault = new GeneralProtection(selector);
>                      } else if (!desc.p) {
> -                        fault = new SegmentNotPresent;
> +                        fault = new SegmentNotPresent(selector);
>                      }
>                      break;
>                  }
> _______________________________________________
> m5-dev mailing list
> [email protected]
> http://m5sim.org/mailman/listinfo/m5-dev
>   

_______________________________________________
m5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/m5-dev

Reply via email to