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.sherr...@oarcorp.com On-Line Applications Research Ask me about RTEMS: a free RTOS Huntsville AL 35805 Support Available (256) 722-9985 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel