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