[PATCH 2/8] score: i386: functions converting real mode pointer to physical address and back
Joel Sherrill
joel.sherrill at oarcorp.com
Thu Nov 20 14:53:11 UTC 2014
On 11/20/2014 8:00 AM, Jan Dolezal wrote:
> ---
> cpukit/score/cpu/i386/cpu_asm.S | 43 ++++++++++++++++++++++++++++++++
> cpukit/score/cpu/i386/rtems/score/i386.h | 32 ++++++++++++++++++++++++
> 2 files changed, 75 insertions(+)
>
> diff --git a/cpukit/score/cpu/i386/cpu_asm.S b/cpukit/score/cpu/i386/cpu_asm.S
> index 9b39567..f3ef4e2 100644
> --- a/cpukit/score/cpu/i386/cpu_asm.S
> +++ b/cpukit/score/cpu/i386/cpu_asm.S
> @@ -327,6 +327,49 @@ SYM (i386_Physical_to_logical):
> movl ecx,eax /* eax = ecx */
> ret
>
> +/*
> + * int i386_Physical_to_real(
> + * void *address,
> + * uint16_t *segment,
> + * uint16_t *offset
> + * );
> + *
> + * Fills segment:offest realmode pointer counted from thirty-two bit physical
> + * address.
> + * Returns 0 if unconvertible, 1 if successfuly converted.
I believe the word is "inconvertible" but I had to look it up myself.
http://dictionary.reference.com/browse/inconvertible
> + */
> +
> +.set PHYS_PTR_ARG, 4
> +.set RM_PTR_SEG_ARG, 8
> +.set RM_PTR_OFF_ARG, 12
> +
> + PUBLIC (i386_Physical_to_real)
> +
> +SYM (i386_Physical_to_real):
> + movl PHYS_PTR_ARG(esp),eax
> + cmpl $0x10FFF0, eax
> + js 1f
> + movl $0, eax
> + ret
> +1: cmpl $0x100000, eax
> + js 2f
> + 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
> +2: 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..926627d 100644
> --- a/cpukit/score/cpu/i386/rtems/score/i386.h
> +++ b/cpukit/score/cpu/i386/rtems/score/i386.h
> @@ -186,6 +186,38 @@ void *i386_Physical_to_logical(
> );
>
> /*
> + * i386_Real_to_physical
> + *
> + * Converts real mode pointer {segment, offset} to physical address.
> + */
> +RTEMS_INLINE_ROUTINE void *i386_Real_to_physical(
> + uint16_t segment,
> + uint16_t offset)
> +{
> + return (void *)(((uint32_t)segment<<4)+offset);
> +}
> +
> +/*
> + * i386_Physical_to_real
> + * 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(
> + void *address,
> + uint16_t *segment,
> + uint16_t *offset
> +);
> +
> +/*
> * "Simpler" names for a lot of the things defined in this file
> */
>
--
Joel Sherrill, Ph.D. Director of Research & Development
joel.sherrill at OARcorp.com On-Line Applications Research
Ask me about RTEMS: a free RTOS Huntsville AL 35805
Support Available (256) 722-9985
More information about the devel
mailing list