1 //
2 // Copyright (c) 2010-2024 Antmicro
3 //
4 // This file is licensed under the MIT License.
5 // Full license text is available in 'licenses/MIT.txt'.
6 //
7 using Endianess = ELFSharp.ELF.Endianess;
8 using Antmicro.Renode.Core;
9 using Antmicro.Renode.Peripherals.IRQControllers;
10 using System.Collections.Generic;
11 
12 namespace Antmicro.Renode.Peripherals.CPU
13 {
14     [GPIO(NumberOfInputs = 1)]
15     public partial class X86_64 : BaseX86
16     {
X86_64(string cpuType, IMachine machine, LAPIC lapic)17         public X86_64(string cpuType, IMachine machine, LAPIC lapic): base(cpuType, machine, lapic, CpuBitness.Bits64)
18         {
19         }
20 
21         public override string Architecture { get { return "x86_64"; } }
22 
23         public override string GDBArchitecture { get { return "i386:x86-64"; } }
24 
25         public override List<GDBFeatureDescriptor> GDBFeatures
26         {
27             get
28             {
29                 var features = new List<GDBFeatureDescriptor>();
30 
31                 var coreFeature = new GDBFeatureDescriptor("org.gnu.gdb.i386.core");
32                 coreFeature.Registers.Add(new GDBRegisterDescriptor(0, 64, "rax", "int64"));
33                 coreFeature.Registers.Add(new GDBRegisterDescriptor(1, 64, "rcx", "int64"));
34                 coreFeature.Registers.Add(new GDBRegisterDescriptor(2, 64, "rdx", "int64"));
35                 coreFeature.Registers.Add(new GDBRegisterDescriptor(3, 64, "rbx", "int64"));
36                 coreFeature.Registers.Add(new GDBRegisterDescriptor(4, 64, "rsp", "data_ptr"));
37                 coreFeature.Registers.Add(new GDBRegisterDescriptor(5, 64, "rbp", "data_ptr"));
38                 coreFeature.Registers.Add(new GDBRegisterDescriptor(6, 64, "rsi", "int64"));
39                 coreFeature.Registers.Add(new GDBRegisterDescriptor(7, 64, "rdi", "int64"));
40                 for(var index = 8u; index <= 15; index++)
41                 {
42                     coreFeature.Registers.Add(new GDBRegisterDescriptor(index, 64, $"r{index}", "int64"));
43                 }
44 
45                 coreFeature.Registers.Add(new GDBRegisterDescriptor(16, 64, "rip", "code_ptr"));
46 
47                 coreFeature.Registers.Add(new GDBRegisterDescriptor(17, 32, "eflags"));
48 
49                 coreFeature.Registers.Add(new GDBRegisterDescriptor(18, 32, "cs", "int32"));
50                 coreFeature.Registers.Add(new GDBRegisterDescriptor(19, 32, "ss", "int32"));
51                 coreFeature.Registers.Add(new GDBRegisterDescriptor(20, 32, "ds", "int32"));
52                 coreFeature.Registers.Add(new GDBRegisterDescriptor(21, 32, "es", "int32"));
53                 coreFeature.Registers.Add(new GDBRegisterDescriptor(22, 32, "fs", "int32"));
54                 coreFeature.Registers.Add(new GDBRegisterDescriptor(23, 32, "gs", "int32"));
55 
56                 for(var index = 0u; index <= 7; index++)
57                 {
58                     coreFeature.Registers.Add(new GDBRegisterDescriptor(24 + index, 80, $"st{index}", "i387_ext"));
59                 }
60 
61                 coreFeature.Registers.Add(new GDBRegisterDescriptor(32, 32, "fctrl", "int", "float"));
62                 coreFeature.Registers.Add(new GDBRegisterDescriptor(33, 32, "fstat", "int", "float"));
63                 coreFeature.Registers.Add(new GDBRegisterDescriptor(34, 32, "ftag", "int", "float"));
64                 coreFeature.Registers.Add(new GDBRegisterDescriptor(35, 32, "fiseg", "int", "float"));
65                 coreFeature.Registers.Add(new GDBRegisterDescriptor(36, 32, "fioff", "int", "float"));
66                 coreFeature.Registers.Add(new GDBRegisterDescriptor(37, 32, "foseg", "int", "float"));
67                 coreFeature.Registers.Add(new GDBRegisterDescriptor(38, 32, "fooff", "int", "float"));
68                 coreFeature.Registers.Add(new GDBRegisterDescriptor(39, 32, "fop", "int", "float"));
69 
70                 features.Add(coreFeature);
71 
72                 return features;
73             }
74         }
75     }
76 }
77 
78