public override Storage GetReturnRegister(Argument_v1 sArg, int bitSize)
        {
            var dtArg = sArg.Type.Accept(TypeLoader) as PrimitiveType;

            if (dtArg != null && dtArg.Domain == Domain.Real)
            {
                var xmm0 = Architecture.GetRegister("xmm0");
                if (bitSize <= 64)
                {
                    return(xmm0);
                }
                if (bitSize <= 128)
                {
                    var xmm1 = Architecture.GetRegister("xmm1");
                    return(new SequenceStorage(xmm1, xmm0));
                }
                throw new NotImplementedException();
            }
            var rax = Architecture.GetRegister("rax");

            if (bitSize <= 64)
            {
                return(rax);
            }
            if (bitSize <= 128)
            {
                var rdx = Architecture.GetRegister("rdx");
                return(new SequenceStorage(rdx, rax));
            }
            throw new NotImplementedException();
        }
Ejemplo n.º 2
0
        public override Storage GetReturnRegister(Argument_v1 sArg, int bitSize)
        {
            var dtArg = sArg.Type.Accept(TypeLoader) as PrimitiveType;

            if (dtArg != null && dtArg.Domain == Domain.Real)
            {
                var f0 = Architecture.GetRegister("f0");
                if (bitSize <= 64)
                {
                    return(f0);
                }
                throw new NotImplementedException();
            }
            var v0 = Architecture.GetRegister("r2");

            if (bitSize <= 32)
            {
                return(v0);
            }
            if (bitSize <= 64)
            {
                var v1 = Architecture.GetRegister("r3");
                return(new SequenceStorage(v1, v0));
            }
            throw new NotImplementedException();
        }
Ejemplo n.º 3
0
        public override Storage GetReturnRegister(Argument_v1 sArg, int bitSize)
        {
            if (bitSize == 0)
            {
                bitSize = Architecture.WordWidth.BitSize;
            }
            switch (bitSize)
            {
            case 32:
                if (Architecture.WordWidth.BitSize == 16)
                {
                    return(new SequenceStorage(
                               Architecture.GetRegister("dx"),
                               Architecture.GetRegister("ax")));
                }
                break;

            case 64: if (Architecture.WordWidth.BitSize == 32)
                {
                    return(new SequenceStorage(
                               Architecture.GetRegister("edx"),
                               Architecture.GetRegister("eax")));
                }
                break;
            }
            var reg = Architecture.GetRegister("rax");

            return(Architecture.GetSubregister(reg, 0, bitSize));
        }
Ejemplo n.º 4
0
        public override Storage GetReturnRegister(Argument_v1 sArg, int bitSize)
        {
            var dtArg = sArg.Type.Accept(TypeLoader);
            var ptArg = dtArg as PrimitiveType;

            if (ptArg != null)
            {
                if (ptArg.Domain == Domain.Real)
                {
                    var f0 = Architecture.GetRegister("f0");
                    if (ptArg.Size <= 4)
                    {
                        return(f0);
                    }
                    var f1 = Architecture.GetRegister("f1");
                    return(new SequenceStorage(f1, f0));
                }
                return(Architecture.GetRegister("o0"));
            }
            else if (dtArg is Pointer)
            {
                return(Architecture.GetRegister("o0"));
            }
            else if (dtArg.Size <= this.Architecture.WordWidth.Size)
            {
                return(Architecture.GetRegister("o0"));
            }
            throw new NotImplementedException();
        }
Ejemplo n.º 5
0
        public override void InjectProcedureEntryStatements(Procedure proc, Address addr, CodeEmitter m)
        {
            switch (Architecture.Name)
            {
            case "mips-be-32":
            case "mips-le-32":
                // MIPS ELF ABI: r25 is _always_ set to the address of a procedure on entry.
                m.Assign(proc.Frame.EnsureRegister(Architecture.GetRegister("r25")), Constant.Word32((uint)addr.ToLinear()));
                break;

            case "mips-be-64":
            case "mips-le-64":
                // MIPS ELF ABI: r25 is _always_ set to the address of a procedure on entry.
                m.Assign(proc.Frame.EnsureRegister(Architecture.GetRegister("r25")), Constant.Word64((uint)addr.ToLinear()));
                break;

            case "zSeries":
                // Stack parameters are passed in starting at offset +160 from the
                // stack; everything at lower addresses is local to the called procedure's
                // frame.
                m.Assign(
                    proc.Frame.EnsureRegister(Architecture.GetRegister("r15")),
                    m.ISub(
                        proc.Frame.FramePointer,
                        Constant.Int(proc.Frame.FramePointer.DataType, 160)));
                break;
            }
        }
Ejemplo n.º 6
0
        public override Storage GetReturnRegister(Argument_v1 sArg, int bitSize)
        {
            var dtArg = sArg.Type.Accept(TypeLoader) as PrimitiveType;

            if (dtArg != null && dtArg.Domain == Domain.Real)
            {
                return(argser.Deserialize(new FpuStackVariable_v1 {
                    ByteSize = dtArg.Size
                }).Storage);
            }
            var eax = Architecture.GetRegister("eax");

            if (bitSize <= 32)
            {
                return(eax);
            }
            if (bitSize <= 64)
            {
                var edx = Architecture.GetRegister("edx");
                return(new SequenceStorage(
                           new Identifier(edx.Name, edx.DataType, edx),
                           new Identifier(eax.Name, eax.DataType, eax)));
            }
            throw new NotImplementedException();
        }
Ejemplo n.º 7
0
 public override HashSet <RegisterStorage> CreateTrashedRegisters()
 {
     return(new HashSet <RegisterStorage>(new[] {
         "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8",
         "r16", "r17", "r18", "r9", "r20", "r21",
         "r22", "r23", "r24", "r25", "r26", "r27", "r28"
     }.Select(n => Architecture.GetRegister(n) !).ToHashSet()));
 }
 public override Storage GetReturnRegister(Argument_v1 sArg, int bitSize)
 {
     if (bitSize > 64)
     {
         throw new NotImplementedException("Large return values not implemented yet");
     }
     return(Architecture.GetRegister(IsReal(sArg.Type) ? "xmm0" : "rax"));
 }
Ejemplo n.º 9
0
 public override Storage GetReturnRegister(Argument_v1 sArg, int bitSize)
 {
     if (bitSize <= 32)
     {
         return(Architecture.GetRegister("d0"));
     }
     throw new NotImplementedException();
 }
Ejemplo n.º 10
0
 public override HashSet<RegisterStorage> CreateImplicitArgumentRegisters()
 {
     var gp = Architecture.GetRegister("r28")!;
     var sp = Architecture.GetRegister("sp")!;
     return new HashSet<RegisterStorage>
     {
         gp, sp
     };
 }
Ejemplo n.º 11
0
 public override void InjectProcedureEntryStatements(Procedure proc, Address addr, CodeEmitter m)
 {
     switch (Architecture.Name)
     {
     case "mips-be-32":
         // MIPS ELF ABI: r25 is _always_ set to the address of a procedure on entry.
         m.Assign(proc.Frame.EnsureRegister(Architecture.GetRegister(25)), Constant.Word32((uint)addr.ToLinear()));
         break;
     }
 }
Ejemplo n.º 12
0
        public override Storage GetReturnRegister(Argument_v1 sArg, int bitSize)
        {
            var prim = sArg.Type as PrimitiveType_v1;

            if (prim != null)
            {
                if (prim.Domain == Domain.Real)
                {
                    return(Architecture.GetRegister("f1"));
                }
            }
            return(Architecture.GetRegister("r3"));
        }
Ejemplo n.º 13
0
        public override Storage GetReturnRegister(Argument_v1 sArg, int bitSize)
        {
            if (sArg.Kind == null)
            {
                throw new NotImplementedException();
            }
            var reg = sArg.Kind as Register_v1;

            if (reg != null)
            {
                return(Architecture.GetRegister(reg.Name));
            }
            throw new NotImplementedException();
        }
Ejemplo n.º 14
0
 private RegisterStorage[] LoadTrashedRegisters()
 {
     if (Services != null)
     {
         var cfgSvc = Services.RequireService <IConfigurationService>();
         var pa     = cfgSvc.GetEnvironment(this.PlatformIdentifier).Architectures.SingleOrDefault(a => a.Name == Architecture.Name);
         if (pa != null)
         {
             return(pa.TrashedRegisters
                    .Select(r => Architecture.GetRegister(r) !)
                    .Where(r => r != null)
                    .ToArray());
         }
     }
     return(new RegisterStorage[0]);
 }
Ejemplo n.º 15
0
 public override Storage GetReturnRegister(Argument_v1 sArg, int bitSize)
 {
     if (bitSize <= 32)
     {
         return(Architecture.GetRegister("r0"));
     }
     else if (bitSize <= 64)
     {
         return(new SequenceStorage(
                    Architecture.GetRegister("r1"),
                    Architecture.GetRegister("r0")));
     }
     else
     {
         throw new NotSupportedException(string.Format("Return values of {0} bits are not supported.", bitSize));
     }
 }
Ejemplo n.º 16
0
 public override SystemService FindService(int vector, ProcessorState state, SegmentMap segmentMap)
 {
     switch (vector)
     {
     // http://www.riscos.com/support/developers/prm/errors.html#89849
     case 0x2B:
         return(new SystemService
         {
             Name = "OS_GenerateError",
             Characteristics = new ProcedureCharacteristics {
                 Terminates = true,
             },
             Signature = FunctionType.Action(
                 new Identifier[] {
                 new Identifier("r0", PrimitiveType.Ptr32, Architecture.GetRegister("r0"))
             })
         });
     }
     throw new NotSupportedException(string.Format("Unknown RiscOS vector &{0:X}.", vector));
 }
Ejemplo n.º 17
0
        public override HashSet <RegisterStorage> CreateTrashedRegisters()
        {
            return(new HashSet <RegisterStorage>
            {
                Architecture.GetRegister("r2") !,
                Architecture.GetRegister("r3") !,
                Architecture.GetRegister("r4") !,
                Architecture.GetRegister("r5") !,
                Architecture.GetRegister("r6") !,
                Architecture.GetRegister("r7") !,
                Architecture.GetRegister("r8") !,
                Architecture.GetRegister("r9") !,
                Architecture.GetRegister("r10") !,
                Architecture.GetRegister("r11") !,
                Architecture.GetRegister("r12") !,
                Architecture.GetRegister("r13") !,
                Architecture.GetRegister("r14") !,
                Architecture.GetRegister("r15") !,

                Architecture.GetRegister("r24") !,
                Architecture.GetRegister("r25") !,
            });
Ejemplo n.º 18
0
        public override Storage GetReturnRegister(Argument_v1 sArg, int bitSize)
        {
            switch (bitSize)
            {
            case 32:
                if (Architecture.WordWidth.BitSize == 16)
                {
                    return(new SequenceStorage(
                               new Identifier("dx", PrimitiveType.Word16, Architecture.GetRegister("dx")),
                               new Identifier("ax", PrimitiveType.Word16, Architecture.GetRegister("ax"))));
                }
                break;

            case 64: if (Architecture.WordWidth.BitSize == 32)
                {
                    return(new SequenceStorage(
                               new Identifier("edx", PrimitiveType.Word16, Architecture.GetRegister("edx")),
                               new Identifier("eax", PrimitiveType.Word16, Architecture.GetRegister("eax"))));
                }
                break;
            }
            return(Architecture.GetRegister("rax").GetSubregister(0, bitSize));
        }
Ejemplo n.º 19
0
        public override Storage GetReturnRegister(Argument_v1 sArg, int bitSize)
        {
            if (bitSize == 0)
            {
                bitSize = Architecture.WordWidth.BitSize;
            }
            var sPrim = sArg.Type as PrimitiveType_v1;

            if (sPrim != null && sPrim.Domain == Domain.Real)
            {
                ++this.FpuStackOffset;
                return(new FpuStackStorage(0, PrimitiveType.Create(Domain.Real, bitSize / 8)));
            }
            switch (bitSize)
            {
            case 32:
                if (Architecture.WordWidth.BitSize == 16)
                {
                    return(new SequenceStorage(
                               Architecture.GetRegister("dx"),
                               Architecture.GetRegister("ax")));
                }
                break;

            case 64: if (Architecture.WordWidth.BitSize == 32)
                {
                    return(new SequenceStorage(
                               Architecture.GetRegister("edx"),
                               Architecture.GetRegister("eax")));
                }
                break;
            }
            var reg = Architecture.GetRegister("rax");

            return(Architecture.GetSubregister(reg, 0, bitSize));
        }
Ejemplo n.º 20
0
 public override HashSet <RegisterStorage> CreateTrashedRegisters()
 {
     // https://msdn.microsoft.com/en-us/library/dn736986.aspx
     return(new[] { "r0", "r1", "r2", "r3", "ip" }
            .Select(r => Architecture.GetRegister(r) !).ToHashSet());
 }
Ejemplo n.º 21
0
 public override HashSet <RegisterStorage> CreateImplicitArgumentRegisters()
 {
     return(new[] { "r11", "sp", "lr", "pc" }
            .Select(r => Architecture.GetRegister(r) !).ToHashSet());
 }
Ejemplo n.º 22
0
 public Win32ThumbPlatform(IServiceProvider services, IProcessorArchitecture arch) :
     base(services, arch, "winArm")
 {
     this.systemServices = new Dictionary <int, SystemService>
     {
         {
             0x00FE,
             new SystemService {
                 SyscallInfo = new SyscallInfo {
                     Vector         = 0x00FE,
                     RegisterValues = new RegValue[0]
                 },
                 Name = "__debugbreak",  // Breaks into the debugger. Used by ntdll!DbgUserBreakPoint().
             }
         },
         {
             0x00FC,
             new SystemService {
                 SyscallInfo = new SyscallInfo
                 {
                     Vector         = 0x00FC,
                     RegisterValues = new RegValue[0],
                 },
                 Name = "__assertfail",  // Used to indicate critical assertion failures in the kernel debugger. Used by KeAccumulateTicks()
             }
         },
         {
             0x00FB,
             new SystemService {
                 SyscallInfo = new SyscallInfo
                 {
                     Vector         = 0x00FB,
                     RegisterValues = new RegValue[0],
                 },
                 Name            = "__fastfail", // Indicates fast fail conditions resulting in KeBugCheckEx(KERNEL_SECURITY_CHECK_FAILURE). Called by functions like InsertTailList() upon detecting a corrupted list, as described in [9].
                 Characteristics = new ProcedureCharacteristics {
                     Terminates = true,
                 }
             }
         },
         {
             0x00FA,
             new SystemService {
                 SyscallInfo = new SyscallInfo {
                     Vector         = 0x00FA,
                     RegisterValues = new RegValue[0]
                 },
                 Name = "__rdpmccntr64", // Reads the 64-bit performance counter co-processor register and returns the value in R0+R1. Used by ReadTimeStampCounter(), KiCacheFlushTrial() etc.
             }
         },
         {
             0x00FD,
             new SystemService {
                 SyscallInfo = new SyscallInfo {
                     Vector         = 0x00FD,
                     RegisterValues = new RegValue[0],
                 },
                 Name = "__debugservice", // Invoke debugger breakpoint. Used by DbgBreakPointWithStatusEnd(), DebugPrompt() etc.
             }
         },
         {
             0x00F9,
             new SystemService
             {
                 SyscallInfo = new SyscallInfo {
                     Vector         = 0x00F9,
                     RegisterValues = new RegValue[0],
                 },
                 Name            = "__brkdiv0", //  Divide By Zero Exception, used by functions like nt!_rt_udiv and nt!_rt_udiv. Also generated by the compiler to check the divisor before division operations.
                 Characteristics = new ProcedureCharacteristics {
                     Terminates = true,
                 }
             }
         }
     };
     this.implicitRegs = new[] { "r11", "sp", "lr", "pc" }
     .Select(r => Architecture.GetRegister(r) !)
     .ToHashSet();
 }
Ejemplo n.º 23
0
 public RegisterStorage GetSubregister(RegisterStorage reg, BitRange range)
 {
     return(Architecture.GetRegister(reg.Domain, range) !);
 }
Ejemplo n.º 24
0
        public override FunctionType Deserialize(SerializedSignature ss, Frame frame)
        {
            int ncrn = 0;
            int nsaa = 0;
            // mem arg forb ret val

            var argser = new ArgumentDeserializer(
                this,
                Architecture,
                frame,
                Architecture.PointerType.Size,
                Architecture.WordWidth.Size);

            Identifier ret = null;

            if (ss.ReturnValue != null)
            {
                ret = argser.DeserializeReturnValue(ss.ReturnValue);
            }

            var args = new List <Identifier>();

            if (ss.Arguments != null)
            {
                foreach (var sArg in ss.Arguments)
                {
                    var dt          = sArg.Type.Accept(TypeLoader);
                    var sizeInWords = (dt.Size + 3) / 4;

                    if (sizeInWords == 2 && (ncrn & 1) == 1)
                    {
                        ++ncrn;
                    }
                    Identifier arg;
                    if (sizeInWords <= 4 - ncrn)
                    {
                        if (sizeInWords == 2)
                        {
                            arg = frame.EnsureSequence(
                                Architecture.GetRegister(argRegs[ncrn]),
                                Architecture.GetRegister(argRegs[ncrn + 1]),
                                dt);
                            ncrn += 2;
                        }
                        else
                        {
                            arg = frame.EnsureRegister(
                                Architecture.GetRegister(argRegs[ncrn]));
                            ncrn += 1;
                        }
                    }
                    else
                    {
                        arg   = frame.EnsureStackArgument(nsaa, dt);
                        nsaa += AlignedStackArgumentSize(dt);
                    }
                    args.Add(arg);
                }
            }
            return(new FunctionType(ret, args.ToArray()));
        }
Ejemplo n.º 25
0
 public Identifier Register(string name)
 {
     return(Frame.EnsureRegister(Architecture.GetRegister(name)));
 }
Ejemplo n.º 26
0
 public override Identifier Register(int i)
 {
     return(Frame.EnsureRegister(Architecture.GetRegister(i)));
 }
Ejemplo n.º 27
0
 public HpuxPlatform(IServiceProvider services, IProcessorArchitecture arch) : base(services, arch, "hpux")
 {
     this.r27 = Architecture.GetRegister("r27") ?? throw new InvalidOperationException("Expected architecture to have r27.");
 }