[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