Date: Wed, 15 Jun 2011 17:46:42 +0300 From: nickolasbug@gmail.com To: Jeremy Chadwick <freebsd@jdc.parodius.com> Cc: freebsd-stable@freebsd.org, Joerg Wunsch <joerg@freebsd.org> Subject: Re: doscmd under 8-stable, anyone? Message-ID: <BANLkTinaw2AM6wBcJc4hUwLgQWmEwJfg7Q@mail.gmail.com> In-Reply-To: <20110615141240.GA61227@icarus.home.lan> References: <20110615135704.GQ23206@uriah.heep.sax.de> <20110615141240.GA61227@icarus.home.lan>
next in thread | previous in thread | raw e-mail | index | archive | help
2011/6/15 Jeremy Chadwick <freebsd@jdc.parodius.com>: > On Wed, Jun 15, 2011 at 03:57:05PM +0200, Joerg Wunsch wrote: >> When trying to use doscmd on 8-stable, all I get is: >> >> Error mapping HMA, HMA disabled: : Invalid argument >> Segmentation fault (core dumped) >> >> The segfault happens at the end of mem_init(), when the allocated DOS >> memory (which is located at virtual address 0) is attempted to be >> written to. =A0Apparently, the mmap() failure that causes the "HMA >> disabled" message is actually a fatal error rather than a benign one >> the could be ignored, as it results in no valid DOS memory allocation >> at all. >> >> Right now, the only older system I could test it against uses FreeBSD >> 5.x, where the mmap() works as expected. =A0So does anyone have an idea >> why this mmap() call: >> >> =A0 =A0 if (mmap((caddr_t)0x000000, 0x100000, >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0PROT_EXEC | PROT_READ | PROT_WRIT= E, >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0MAP_ANON | MAP_FIXED | MAP_SHARED= , >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0-1, 0) =3D=3D MAP_FAILED) { >> =A0 =A0 =A0 =A0 perror("Error mapping HMA, HMA disabled: "); >> =A0 =A0 =A0 =A0 HMA_a20 =3D -1; >> =A0 =A0 =A0 =A0 close(HMA_fd_off); >> =A0 =A0 =A0 =A0 close(HMA_fd_on); >> =A0 =A0 =A0 =A0 return; >> =A0 =A0 } >> >> yields an EINVAL now under 8-stable? As I remember, mapping of "zero" page forbidden by default. > I imagine that the page size ordeal is probably what's biting you. =A0Now= , > I'm not sure if page size in that above context refers to "kernel page > size" (e.g. hw.pagesizes or hw.pagesize) or if it refers to "a page of > memory" as in what libc/malloc uses. It refers. mmap(2) is system call. On i386/amd64 "big" page size is 2MB, and code above is trying to allocate 1MB, so memory will be allocated with 4KB-sized pages. > > I'm not sure why a person would need or want MAP_FIXED in this > situation; why can't they just take the result of mmap() (a void *) and > use that as a base address offset instead of assuming zero in their > software? AFAIK, doscmd is trying to emulate real mode on real hardware while being in protected mode, thus it want first pages of memory. Another way to do the same thing - open /dev/mem and call mmap() at zero of= fset.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?BANLkTinaw2AM6wBcJc4hUwLgQWmEwJfg7Q>