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

Gedare Bloom gedare at rtems.org
Wed Nov 12 15:25:16 UTC 2014


On Wed, Nov 12, 2014 at 10:07 AM, Jan Dolezal <dolezj21 at fel.cvut.cz> wrote:
> ---
>  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.
> + */
> +
I suggest using the names i386_Real_to_physical() and
i386_Physical_to_real() to be consistent with other functions like
this in the same code.

> +.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
> +

My x86 assembly is not good enough to verify the following code. Joel?

> +/*
> + *  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
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel


More information about the devel mailing list