This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [rfc] 16 bit real-mode for the i386



Now, my i386 knowledge is a bit rusty.  But:


+static CORE_ADDR
+i386_read_pc (ptid_t ptid)
+{
+  CORE_ADDR pc = read_register_pid (PC_REGNUM, ptid);
+  if (i386_real_mode_p)
+    {
+      CORE_ADDR cs = read_register_pid (CS_REGNUM, ptid);
+      pc = pc + (cs << 4);
+    }
+  return pc;
+}
+
+static void
+i386_write_pc (CORE_ADDR pc, ptid_t ptid)
+{
+  if (i386_real_mode_p)
+    {
+      CORE_ADDR cs = read_register_pid (CS_REGNUM, ptid);
+      pc = pc - (cs << 4);
+    }
+  write_register_pid (PC_REGNUM, pc, ptid);
+}
+

Left shift of _four_?  Surely the PC is more than four bits.
It is. From an ia32 manual (www.intel.com):

16.1.1. Address Translation in Real-Address Mode
In real-address mode, the processor does not interpret segment selectors as indexes into a descriptor table; instead, it uses them directly to form linear addresses as the 8086 processor does. It shifts the segment selector left by 4 bits to form a 20-bit base address (see Figure 16-1).
The offset into a segment is added to the base address to create a linear address that maps directly
to the physical address space.

Andrew



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]