Word32 BURGERCALL AllocRealMemory(Word32 Size) { #if defined(__X32__) Size = _x32_real_alloc(Size); /* Call X32 to allocate memory */ if (!Size) { /* Did I get it? */ NonFatal("Can't allocate real memory\n"); } return Size; #else Regs16 Regs; Size = Size+15; /* Round to the nearest 16 bytes */ Size = Size>>4; /* Number of paragraphs to allocate */ Regs.ax = 0x4800; /* DOS allocate memory command */ Regs.bx = (Word16)Size; /* Number of paragraphs to allocate */ Int86x(0x21,&Regs,&Regs); /* Allocate */ if (Regs.flags&1) { /* Error?? */ NonFatal("Can't allocate real memory\n"); return 0; } Size = Regs.ax; /* Get the segment */ return Size<<16; /* Return as a real mode pointer */ #endif }
/* * Called from setup_pkt_inf() in pcpkt.c */ static DWORD setup_pkt_inf_fast (void) { /* Allocate space for asmpkt_inf, temp area, pkt-stub and Tx buffer. */ DWORD rdata_size = PKT_TMP(); size_t stub_size = sizeof(real_stub_array); #if (DOSX) rdata_size += PKT_TMP_SIZE + ETH_MAX + 10; #endif if (rdata_size >= 64*1024UL) { TCP_CONSOLE_MSG (0, ("%s (%u): Development error:\nsize %u too large\n", __FILE__, __LINE__, (unsigned int)rdata_size)); return (0); } if (stub_size < 0xC0) { TCP_CONSOLE_MSG (0, ("%s (%u): Development error:\n\"pkt_stub.h\"" " seems truncated (%d bytes)\n", __FILE__, __LINE__, SIZEOF(real_stub_array))); return (0); } #if (DOSX & DJGPP) { int i, seg, sel; seg = __dpmi_allocate_dos_memory ((rdata_size+15)/16, &sel); if (seg < 0) return (0); _pkt_inf->rm_seg = seg; _pkt_inf->rm_sel = sel; rm_base = (_pkt_inf->rm_seg << 4); for (i = 0; i < (int)rdata_size; i += 4) /* clear area */ POKEL (_pkt_inf->rm_seg, i, 0); } #elif (DOSX & DOS4GW) { WORD seg, sel; seg = dpmi_real_malloc (rdata_size, &sel); if (!seg) return (0); _pkt_inf->rm_seg = seg; _pkt_inf->rm_sel = sel; rm_base = (_pkt_inf->rm_seg) << 4; memset ((void*)rm_base, 0, rdata_size); } #elif (DOSX & PHARLAP) { WORD largest, seg; int i; if (_dx_real_alloc ((rdata_size+15)/16, &seg, &largest) != 0) return (0); _pkt_inf->rm_seg = seg; _pkt_inf->rm_sel = 0; RP_SET (rm_base, 0, _pkt_inf->rm_seg); for (i = 0; i < (int)rdata_size; i += 4) POKEL (_pkt_inf->rm_seg, i, 0); } #elif (DOSX & X32VM) { int i; rm_base = _x32_real_alloc (rdata_size); if (!rm_base) return (0); _pkt_inf->rm_seg = _x32_real_segment (rm_base); _pkt_inf->rm_sel = 0; for (i = 0; i < (int)rdata_size; i += 4) POKEL (_pkt_inf->rm_seg, i, 0); } #elif (DOSX & POWERPAK) { WORD seg, sel; int i; seg = dpmi_real_malloc ((rdata_size+15)/16, &sel); if (!seg) return (0); _pkt_inf->rm_seg = seg; _pkt_inf->rm_sel = sel; RP_SET (rm_base, 0, _pkt_inf->rm_seg); for (i = 0; i < (int)rdata_size; i += 4) POKEL (_pkt_inf->rm_seg, i, 0); } #elif (DOSX == 0) { char _far *buf = _fcalloc (rdata_size, 0); if (!buf) return (0); _pkt_inf->rm_seg = FP_SEG (buf); rm_base = (DWORD) buf; } #else #error Help! #endif pktq_far_init (sizeof(struct pkt_rx_element), RX_BUFS, ASMPKT_INF); _pkt_inf->pkt_queue.num_buf = RX_BUFS; return (rm_base); }