[PATCH 2/6] score: i386: functions converting real mode pointer to physical address and back

Jan Dolezal dolezj21 at fel.cvut.cz
Wed Nov 12 15:07:52 UTC 2014


---
 cpukit/score/cpu/i386/cpu_asm.S          | 63 ++++++++++++++++++++++++++++++++
 cpukit/score/cpu/i386/rtems/score/i386.h | 29 +++++++++++++++
 2 files changed, 92 insertions(+)

diff --git a/cpukit/score/cpu/i386/cpu_asm.S b/cpukit/score/cpu/i386/cpu_asm.S
index 9b39567..c9e366d 100644
--- a/cpukit/score/cpu/i386/cpu_asm.S
+++ b/cpukit/score/cpu/i386/cpu_asm.S
@@ -327,6 +327,69 @@ SYM (i386_Physical_to_logical):
         movl    ecx,eax                /* eax = ecx */
         ret
 
+/*
+ *  void *i386_Real_mode_ptr_to_physical(
+ *     void     *ptr
+ *  );
+ *
+ *  Returns thirty-two bit physical address for segment:offset realmode pointer.
+ */
+
+.set RM_PTR_ARG, 4
+
+       PUBLIC (i386_Real_mode_ptr_to_physical)
+
+SYM (i386_Real_mode_ptr_to_physical):
+        movl    RM_PTR_ARG(esp),eax
+        xorl    ecx, ecx
+        movw    ax, cx
+        shrl    $12, eax
+        andl    $0xFFFF0, eax
+        addl    ecx, eax
+        ret
+
+/*
+ *  int i386_Physical_to_real_mode_ptr(
+ *     void     *address,
+ *     unsigned short *segment,
+ *     unsigned short *offset
+ *  );
+ *
+ *  Fills segment:offest realmode pointer counted from thirty-two bit physical
+ *  address.
+ *  Returns 0 if unconvertible, 1 if successfuly converted.
+ */
+
+.set RM_PTR_SEG_ARG, 8
+.set RM_PTR_OFF_ARG, 12
+
+       PUBLIC (i386_Physical_to_real_mode_ptr)
+
+SYM (i386_Physical_to_real_mode_ptr):
+        movl    RM_PTR_ARG(esp),eax
+        cmpl    $0x10FFF0, eax
+        js      cvtbl
+        movl    $0, eax
+        ret
+cvtbl:  cmpl    $0x100000, eax
+        js      lowmem
+        subl    $0xFFFF0, eax
+        movl    RM_PTR_OFF_ARG(esp), ecx
+        movw    ax, (ecx)
+        movl    RM_PTR_SEG_ARG(esp), ecx
+        movw    $0xFFFF, (ecx)
+        movl    $1, eax
+        ret
+lowmem: movl    eax, edx
+        and     $0xF, ax
+        movl    RM_PTR_OFF_ARG(esp), ecx
+        movw    ax, (ecx)
+        shrl    $4, edx
+        movl    RM_PTR_SEG_ARG(esp), ecx
+        movw    dx, (ecx)
+        movl    $1, eax
+        ret
+
 END_CODE
 
 END
diff --git a/cpukit/score/cpu/i386/rtems/score/i386.h b/cpukit/score/cpu/i386/rtems/score/i386.h
index 57569fc..a59e0cf 100644
--- a/cpukit/score/cpu/i386/rtems/score/i386.h
+++ b/cpukit/score/cpu/i386/rtems/score/i386.h
@@ -186,6 +186,35 @@ void *i386_Physical_to_logical(
 );
 
 /*
+ *  i386_Real_mode_ptr_to_physical
+ *
+ *  Converts real mode pointer {segment, offset} to physical address.
+ */
+void *i386_Real_mode_ptr_to_physical(
+  void *ptr
+);
+
+/*
+ *  i386_Physical_to_real_mode_ptr
+ *  Retreives real mode pointer elements {segmnet, offset} from physical address
+ *  Function returns the highest segment (base) address possible.
+ *  Example:    input   address - 0x4B3A2
+ *              output  segment - 0x4B3A
+ *                      offset  - 0x2
+ *              input   address - 0x10F12E
+ *              output  segment - 0xFFFF
+ *                      offset  - 0xF13E
+ *
+ *  return  0 address not convertible, must be less than 0x10FFEF
+ *          1 segment and offset extracted
+ */
+int i386_Physical_to_real_mode_ptr(
+  void *address,
+  unsigned short *segment,
+  unsigned short *offset
+);
+
+/*
  *  "Simpler" names for a lot of the things defined in this file
  */
 
-- 
1.9.1



More information about the devel mailing list