#include <unistd.h>
#include <sys/utsname.h>
#include <io.h>
-/* breakpoint.h defines `disable' which is an enum member. */
-#define disable interrup_disable
#include <dos.h>
-#undef disable
#include <dpmi.h>
#include <go32.h>
#include <sys/farptr.h>
static void
save_npx (void)
{
- asm ("inb $0xa0, %%al
- testb $0x20, %%al
- jz 1f
- xorb %% al, %%al
- outb %% al, $0xf0
- movb $0x20, %%al
- outb %% al, $0xa0
- outb %% al, $0x20
-1:
- fnsave % 0
+ asm ("inb $0xa0, %%al \n\
+ testb $0x20, %%al \n\
+ jz 1f \n\
+ xorb %%al, %%al \n\
+ outb %%al, $0xf0 \n\
+ movb $0x20, %%al \n\
+ outb %%al, $0xa0 \n\
+ outb %%al, $0x20 \n\
+1: \n\
+ fnsave %0 \n\
fwait "
: "=m" (npx)
: /* No input */
/* *INDENT-ON* */
-
-
-
/* ------------------------------------------------------------------------- */
/* Reload the contents of the NPX from the global variable `npx'. */
{
if (regno < FP0_REGNUM)
supply_register (regno, (char *) &a_tss + regno_mapping[regno].tss_ofs);
- else if (regno <= LAST_FPU_CTRL_REGNUM)
+ else if (FP_REGNUM_P (regno) || FPC_REGNUM_P (regno))
i387_supply_register (regno, (char *) &npx);
else
internal_error (__FILE__, __LINE__,
static void
store_register (int regno)
{
- void *rp;
- void *v = (void *) register_buffer (regno);
-
if (regno < FP0_REGNUM)
- memcpy ((char *) &a_tss + regno_mapping[regno].tss_ofs,
- v, regno_mapping[regno].size);
- else if (regno <= LAST_FPU_CTRL_REGNUM)
- i387_fill_fsave ((char *)&npx, regno);
+ regcache_collect (regno, (void *) &a_tss + regno_mapping[regno].tss_ofs);
+ else if (FP_REGNUM_P (regno) || FPC_REGNUM_P (regno))
+ i387_fill_fsave ((char *) &npx, regno);
else
internal_error (__FILE__, __LINE__,
"Invalid register no. %d in store_register.", regno);
exit (1);
}
environ = env_save;
- free (cmdline);
+ xfree (cmdline);
edi_init (start_state);
#if __DJGPP_MINOR__ < 3
if (__dpmi_set_segment_base_address (sel, addr) != -1
&& __dpmi_set_descriptor_access_rights (sel, access_rights) != -1
- && __dpmi_set_segment_limit (sel, segment_limit) != -1)
+ && __dpmi_set_segment_limit (sel, segment_limit) != -1
+ /* W2K silently fails to set the segment limit, leaving
+ it at zero; this test avoids the resulting crash. */
+ && __dpmi_get_segment_limit (sel) >= segment_limit)
movedata (sel, 0, _my_ds (), (unsigned)dest, len);
else
retval = 0;
cr3 = _farnspeekl (taskbase + 0x1c) & ~0xfff;
if (cr3 > 0xfffff)
{
+#if 0 /* not fullly supported yet */
/* The Page Directory is in UMBs. In that case, CWSDPMI puts
the first Page Table right below the Page Directory. Thus,
the first Page Table's entry for its own address and the Page
break;
}
}
+#endif
if (cr3 > 0xfffff)
cr3 = 0;