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(); }
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(); }
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)); }
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(); }
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; } }
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(); }
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")); }
public override Storage GetReturnRegister(Argument_v1 sArg, int bitSize) { if (bitSize <= 32) { return(Architecture.GetRegister("d0")); } throw new NotImplementedException(); }
public override HashSet<RegisterStorage> CreateImplicitArgumentRegisters() { var gp = Architecture.GetRegister("r28")!; var sp = Architecture.GetRegister("sp")!; return new HashSet<RegisterStorage> { gp, sp }; }
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; } }
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")); }
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(); }
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]); }
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)); } }
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)); }
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") !, });
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)); }
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)); }
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()); }
public override HashSet <RegisterStorage> CreateImplicitArgumentRegisters() { return(new[] { "r11", "sp", "lr", "pc" } .Select(r => Architecture.GetRegister(r) !).ToHashSet()); }
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(); }
public RegisterStorage GetSubregister(RegisterStorage reg, BitRange range) { return(Architecture.GetRegister(reg.Domain, range) !); }
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())); }
public Identifier Register(string name) { return(Frame.EnsureRegister(Architecture.GetRegister(name))); }
public override Identifier Register(int i) { return(Frame.EnsureRegister(Architecture.GetRegister(i))); }
public HpuxPlatform(IServiceProvider services, IProcessorArchitecture arch) : base(services, arch, "hpux") { this.r27 = Architecture.GetRegister("r27") ?? throw new InvalidOperationException("Expected architecture to have r27."); }