diff options
author | Jeff Johnston <jjohnstn@redhat.com> | 2002-12-20 02:29:00 +0000 |
---|---|---|
committer | Jeff Johnston <jjohnstn@redhat.com> | 2002-12-20 02:29:00 +0000 |
commit | d693ad844979b8f5596dde99a0cbec070af73683 (patch) | |
tree | 1b60e394a1807abc3c92bf9b0cbb88b3fdb157c4 /newlib/libc/sys/go32/dpmi.c | |
parent | 3ace1da676318a591ee314b784f37661e52cfb75 (diff) | |
download | cygnal-d693ad844979b8f5596dde99a0cbec070af73683.tar.gz cygnal-d693ad844979b8f5596dde99a0cbec070af73683.tar.bz2 cygnal-d693ad844979b8f5596dde99a0cbec070af73683.zip |
2002-12-19 Jeff Johnston <jjohnstn@redhat.com>
* configure.host: Remove references to go32.
* libc/sys/go32/*: Removed.
Diffstat (limited to 'newlib/libc/sys/go32/dpmi.c')
-rw-r--r-- | newlib/libc/sys/go32/dpmi.c | 413 |
1 files changed, 0 insertions, 413 deletions
diff --git a/newlib/libc/sys/go32/dpmi.c b/newlib/libc/sys/go32/dpmi.c deleted file mode 100644 index 5215065e1..000000000 --- a/newlib/libc/sys/go32/dpmi.c +++ /dev/null @@ -1,413 +0,0 @@ -#include <stdlib.h> -#include "dos.h" -#include "go32.h" -#include <sys/types.h> -#include "dpmi.h" - -static union REGS r; -static struct SREGS s; - -int _go32_dpmi_allocate_dos_memory(_go32_dpmi_seginfo *info) -{ - r.x.ax = 0x0100; - r.x.bx = info->size; - int86(0x31, &r, &r); - if (r.x.flags & 1) - { - info->size = r.x.bx; - return r.x.ax; - } - else - { - info->rm_segment = r.x.ax; - info->pm_selector = r.x.dx; - return 0; - } -} - -int _go32_dpmi_free_dos_memory(_go32_dpmi_seginfo *info) -{ - r.x.ax = 0x0101; - r.x.dx = info->pm_selector; - int86(0x31, &r, &r); - if (r.x.flags & 1) - { - return r.x.ax; - } - else - { - return 0; - } -} - -int _go32_dpmi_resize_dos_memory(_go32_dpmi_seginfo *info) -{ - r.x.ax = 0x0102; - r.x.bx = info->size; - r.x.dx = info->pm_selector; - int86(0x31, &r, &r); - if (r.x.flags & 1) - { - info->size = r.x.bx; - return r.x.ax; - } - else - { - return 0; - } -} - -int _go32_dpmi_get_real_mode_interrupt_vector(int vector, _go32_dpmi_seginfo *info) -{ - r.x.ax = 0x0200; - r.h.bl = vector; - int86(0x31, &r, &r); - info->rm_segment = r.x.cx; - info->rm_offset = r.x.dx; - return 0; -} - -int _go32_dpmi_set_real_mode_interrupt_vector(int vector, _go32_dpmi_seginfo *info) -{ - r.x.ax = 0x0201; - r.h.bl = vector; - r.x.cx = info->rm_segment; - r.x.dx = info->rm_offset; - int86(0x31, &r, &r); - return 0; -} - -int _go32_dpmi_get_protected_mode_interrupt_vector(int vector, _go32_dpmi_seginfo *info) -{ - r.x.ax = 0x0204; - r.h.bl = vector; - int86(0x31, &r, &r); - info->pm_selector = r.x.cx; - info->pm_offset = r.x.dx; - return 0; -} - -int _go32_dpmi_set_protected_mode_interrupt_vector(int vector, _go32_dpmi_seginfo *info) -{ - r.x.ax = 0x0205; - r.h.bl = vector; - r.x.cx = info->pm_selector; - r.x.dx = info->pm_offset; - int86(0x31, &r, &r); - if (r.x.flags & 1) - { - return r.x.ax; - } - else - { - return 0; - } -} - -/* In real DPMI, we enter with only CS known, and SS on a locked 4K stack which - is *NOT* our SS. We must set up everthing, including a stack swap, then - restore it the way we found it. C. Sandmann 4-93 */ - -static unsigned char wrapper_intcommon[] = { -0x1e, /* push ds */ -0x06, /* push es */ -0x0f, 0xa0, /* push fs */ -0x0f, 0xa8, /* push gs */ -0x60, /* pusha */ -0x66, 0xb8, 0x34, 0x12, /* mov ax,0x1234 */ -0x8e, 0xd8, /* mov ds,ax */ -0x8e, 0xc0, /* mov es,ax */ -0x8e, 0xe0, /* mov fs,ax */ -0x8e, 0xe8, /* mov gs,ax */ -0xbb, 0x00, 0x00, 0x00, 0x00, /* mov ebx,_local_stack */ -0xfc, /* cld */ -0x89, 0xe1, /* mov ecx,esp */ -0x8c, 0xd2, /* mov dx,ss */ -0x8e, 0xd0, /* mov ss,ax */ -0x89, 0xdc, /* mov esp,ebx */ -0x52, /* push edx */ -0x51, /* push ecx */ -0xe8, 0x00, 0x00, 0x00, 0x00, /* call _rmih */ -0x58, /* pop eax */ -0x5b, /* pop ebx */ -0x8e, 0xd3, /* mov ss,bx */ -0x89, 0xc4, /* mov esp,eax */ -0x61, /* popa */ -0x0f, 0xa9, /* pop gs */ -0x0f, 0xa1, /* pop fs */ -0x07, /* pop es */ -0x1f /* pop ds */ -}; - -static unsigned char wrapper_intiret[] = { -0xcf /* iret */ -}; - -static unsigned char wrapper_intchain[] = { -0x2e, 0xff, 0x2d, 0x00, 0x00, 0x00, 0x00, /* jmp cs:[_old_int+39] */ -0xcf, /* iret */ -0x78, 0x56, 0x34, 0x12, -0xcd, 0xab -}; - -/* _interrupt_stack_size can be changed globally before calling this routine if - needed. Don't change it between calls or you will mess up the malloc chain ! */ - -unsigned _interrupt_stack_size = 32256; - -int _go32_dpmi_chain_protected_mode_interrupt_vector(int vector, _go32_dpmi_seginfo *info) -{ - char *mystack; - unsigned char *wrapper = (unsigned char *)malloc(sizeof(wrapper_intcommon) + sizeof(wrapper_intchain)); - if (wrapper == 0) - return 0x8015; - mystack = (char *)malloc(_interrupt_stack_size); - if (mystack == 0) - return 0x8015; - - r.x.ax = 0x0204; - r.h.bl = vector; - int86(0x31, &r, &r); - - memcpy(wrapper, wrapper_intcommon, sizeof(wrapper_intcommon)); - memcpy(wrapper+sizeof(wrapper_intcommon), wrapper_intchain, sizeof(wrapper_intchain)); - *(short *)(wrapper+9) = _go32_my_ds(); - *(long *)(wrapper+20) = (int)mystack + _interrupt_stack_size; - *(long *)(wrapper+36) = info->pm_offset - (int)wrapper - 40; - *(long *)(wrapper+sizeof(wrapper_intcommon)+3) = (long)wrapper+sizeof(wrapper_intcommon)+8; - *(long *)(wrapper+sizeof(wrapper_intcommon)+8) = r.x.dx; - *(short *)(wrapper+sizeof(wrapper_intcommon)+12) = r.x.cx; - - r.x.ax = 0x0205; - r.h.bl = vector; - r.x.cx = _go32_my_cs(); - r.x.dx = (int)wrapper; - int86(0x31, &r, &r); - return 0; -} - -int _go32_dpmi_allocate_iret_wrapper(_go32_dpmi_seginfo *info) -{ - char *mystack; - unsigned char *wrapper = (unsigned char *)malloc(sizeof(wrapper_intcommon) + sizeof(wrapper_intiret)); - if (wrapper == 0) - return 0x8015; - mystack = (char *)malloc(_interrupt_stack_size); - if (mystack == 0) - return 0x8015; - - memcpy(wrapper, wrapper_intcommon, sizeof(wrapper_intcommon)); - memcpy(wrapper+sizeof(wrapper_intcommon), wrapper_intiret, sizeof(wrapper_intiret)); - *(short *)(wrapper+9) = _go32_my_ds(); - *(long *)(wrapper+20) = (int)mystack + _interrupt_stack_size; - *(long *)(wrapper+36) = info->pm_offset - (int)wrapper - 40; - - info->pm_offset = (int)wrapper; - return 0; -} - -int _go32_dpmi_free_iret_wrapper(_go32_dpmi_seginfo *info) -{ - char *mystack; - char *wrapper = (char *)info->pm_offset; - mystack = (char *)(*(long *)(wrapper+20) - _interrupt_stack_size); - free(mystack); - free(wrapper); - return 0; -} - -int _go32_dpmi_simulate_int(int vector, _go32_dpmi_registers *regs) -{ - r.h.bl = vector; - r.h.bh = 0; - r.x.cx = 0; - r.x.di = (int)regs; - if (vector == 0x21 && regs->x.ax == 0x4b00) - { - r.x.ax = 0xff0a; - int86(0x21, &r, &r); - } - else - { - r.x.ax = 0x0300; - int86(0x31, &r, &r); - } - if (r.x.flags & 1) - { - return r.x.ax; - } - else - { - return 0; - } -} - -int _go32_dpmi_simulate_fcall(_go32_dpmi_registers *regs) -{ - r.x.ax = 0x0301; - r.h.bh = 0; - r.x.cx = 0; - r.x.di = (int)regs; - int86(0x31, &r, &r); - if (r.x.flags & 1) - { - return r.x.ax; - } - else - { - return 0; - } -} - -int _go32_dpmi_simulate_fcall_iret(_go32_dpmi_registers *regs) -{ - r.x.ax = 0x0302; - r.h.bh = 0; - r.x.cx = 0; - r.x.di = (int)regs; - int86(0x31, &r, &r); - if (r.x.flags & 1) - { - return r.x.ax; - } - else - { - return 0; - } -} - -/* Bug here; this needs to be fixed like above with SS & CLD */ - -static unsigned char wrapper_common[] = { -0x66, 0x06, /* push es */ -0x66, 0x1e, /* push ds */ -0x66, 0x06, /* push es */ -0x66, 0x1f, /* pop ds */ -0x56, /* push esi */ -0x57, /* push edi */ -0xe8, 0x00, 0x00, 0x00, 0x00, /* call _rmcb */ -0x5f, /* pop edi */ -0x5e, /* pop esi */ -0x66, 0x1f, /* pop ds */ -0x66, 0x07, /* pop es */ -0xfc, /* cld */ -0x66, 0x8b, 0x06, /* mov ax,[esi] */ -0x66, 0x26, 0x89, 0x47, 0x2a, /* mov es:[edi+42],ax */ -0x66, 0x8b, 0x46, 0x02, /* mov ax,[esi+2] */ -0x66, 0x26, 0x89, 0x47, 0x2c, /* mov es:[edi+44],ax */ -}; - -static unsigned char wrapper_retf[] = { -0x66, 0x26, 0x83, 0x47, 0x2e, 0x04, /* add es:[edi+46],0x4 */ -0xcf /* iret */ -}; - -static unsigned char wrapper_iret[] = { -0x66, 0x8b, 0x46, 0x04, /* mov ax,[esi+4] */ -0x66, 0x26, 0x89, 0x47, 0x20, /* mov es:[edi+32],ax */ -0x66, 0x26, 0x83, 0x47, 0x2e, 0x06, /* add es:[edi+46],0x6 */ -0xcf /* iret */ -}; - -int _go32_dpmi_allocate_real_mode_callback_retf(_go32_dpmi_seginfo *info, _go32_dpmi_registers *regs) -{ - unsigned char *wrapper = (unsigned char *)malloc(sizeof(wrapper_common) + sizeof(wrapper_retf)); - if (wrapper == 0) - return 0x8015; - - memcpy(wrapper, wrapper_common, sizeof(wrapper_common)); - memcpy(wrapper+sizeof(wrapper_common), wrapper_retf, sizeof(wrapper_retf)); - *(long *)(wrapper+11) = info->pm_offset - (int)wrapper - 15; - info->size = (int)wrapper; - - r.x.ax = 0x0303; - r.x.si = (int)wrapper; - r.x.di = (int)regs; - s.ds = _go32_my_cs(); - s.es = _go32_my_ds(); - s.fs = 0; - s.gs = 0; - int86x(0x31, &r, &r, &s); - if (r.x.flags & 1) - { - return r.x.ax; - } - else - { - info->rm_segment = r.x.cx; - info->rm_offset = r.x.dx; - return 0; - } -} - -int _go32_dpmi_allocate_real_mode_callback_iret(_go32_dpmi_seginfo *info, _go32_dpmi_registers *regs) -{ - unsigned char *wrapper = (unsigned char *)malloc(sizeof(wrapper_common) + sizeof(wrapper_iret)); - if (wrapper == 0) - return 0x8015; - - memcpy(wrapper, wrapper_common, sizeof(wrapper_common)); - memcpy(wrapper+sizeof(wrapper_common), wrapper_iret, sizeof(wrapper_iret)); - *(long *)(wrapper+11) = info->pm_offset - (int)wrapper - 15; - info->size = (int)wrapper; - - r.x.ax = 0x0303; - r.x.si = (int)wrapper; - r.x.di = (int)regs; - s.ds = _go32_my_cs(); - s.es = _go32_my_ds(); - s.fs = 0; - s.gs = 0; - int86x(0x31, &r, &r, &s); - if (r.x.flags & 1) - { - return r.x.ax; - } - else - { - info->rm_segment = r.x.cx; - info->rm_offset = r.x.dx; - return 0; - } -} - -int _go32_dpmi_free_real_mode_callback(_go32_dpmi_seginfo *info) -{ - free((char *)info->size); - r.x.ax = 0x0304; - r.x.cx = info->rm_segment; - r.x.dx = info->rm_offset; - int86(0x31, &r, &r); - if (r.x.flags & 1) - { - return r.x.ax; - } - else - { - return 0; - } -} - -int _go32_dpmi_get_free_memory_information(_go32_dpmi_meminfo *info) -{ - r.x.ax = 0x0500; - r.x.di = (int)info; - int86(0x31, &r, &r); - return 0; -} - -u_long _go32_dpmi_remaining_physical_memory() -{ - _go32_dpmi_meminfo info; - _go32_dpmi_get_free_memory_information(&info); - if (info.available_physical_pages) - return info.available_physical_pages * 4096; - return info.available_memory; -} - -u_long _go32_dpmi_remaining_virtual_memory() -{ - _go32_dpmi_meminfo info; - _go32_dpmi_get_free_memory_information(&info); - return info.available_memory; -} |