This is the mail archive of the cygwin mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: mmap call gives invalid argument


On Nov 21 11:20, Carlo Florendo wrote:
> On Wed, Nov 19, 2008 at 11:44 PM, Corinna Vinschen wrote:
> > Try building Cygwin from scratch after disabling the first `if' statement
> > in fhandler_dev_mem::mmap (file winsup/cygwin/mmap.cc).  If that helps,
> > it seems that this check is too well meant and we should better rely on
> > the OS function doing the right thing.
> 
> Ok.  I've recompiled cygwin.  I've also attached the new cygcheck.
> 
> The diff output below shows the only change I did. So essentially, we
> just let the compiler skip the if statement you mentioned.
> 
> --- mmap.cc.orig        2008-11-21 11:06:48.000000000 +0800
> +++ mmap.cc     2008-11-21 11:06:59.000000000 +0800
> @@ -1825,6 +1825,7 @@ HANDLE
>  fhandler_dev_mem::mmap (caddr_t *addr, size_t len, int prot,
>                         int flags, _off64_t off)
>  {
> +#ifdef IGNORE_CFF_DMIDECODE_ISSUE
>    if (off >= mem_size
>        || (DWORD) len >= mem_size
>        || off + len >= mem_size)
> @@ -1833,6 +1834,7 @@ fhandler_dev_mem::mmap (caddr_t *addr, s
>        debug_printf ("-1 = mmap(): illegal parameter, set EINVAL");
>        return INVALID_HANDLE_VALUE;
>      }
> +#endif
> 
>    UNICODE_STRING memstr;
>    RtlInitUnicodeString (&memstr, L"\\device\\physicalmemory");
> 
> 
> In spite of that, after recompiling dmidecode with the new
> cygwin1.dll, this is what we get:
> 
> $ ./dmidecode.exe
> /dev/mem: mmap: Invalid argument
> # dmidecode 2.9
> SMBIOS 2.5 present.
> 54 structures occupying 1495 bytes.
> Table at 0x3BEE3000.
> 
> The new strace is here: http://astra.ph/research/carlo/strace2.out
> 
> Is this some problem associated with accessing the device because it's 1GB?

I don't know.  See the strace yourself:

  156  133660 [main] dmidecode 2092 mmap64: addr 0, len 13783, prot 1, flags 1, fd 3, off 1005453312
  101  133761 [main] dmidecode 2092 MapViewNT: 0 = NtMapViewOfSection (h:6F8, addr:0, len:13783, off:1005453312, protect:2, type:0)
   85  133846 [main] dmidecode 2092 seterrno_from_win_error: /home/Administrator/cygwin-1.5.25-15/winsup/cygwin/mmap.cc:1871 windows error 87
   79  133925 [main] dmidecode 2092 geterrno_from_win_error: windows error 87 == errno 22
   74  133999 [main] dmidecode 2092 __set_errno: void seterrno_from_win_error(const char*, int, DWORD):310 val 22
   82  134081 [main] dmidecode 2092 mmap64: 0xFFFFFFFF = mmap() 

Now you get the error message directly from Windows.  Unfortunately,
we don't see the actual NTSTATUS value returned by NtMapViewOfSection
because I left the value out of the debug message.  Silly me!

What you see is the converted Win32 error code 87, which is
ERROR_INVALID_PARAMETER.  The actual NTSTATUS code might give you
another hint.  Just change the debug_printf statement in the MapViewNT
function (mmap.cc line 384) to

  debug_printf ("%p (status %p) = NtMapViewOfSection (h:%x, addr:%x, len:%u,"
		" off:%D, protect:%x, type:%x)",
		base, ret, h, addr, len, off, protect, 0);

recompile, rerun, and look for the "NtMapViewOfSection" lines in
the strace output.  What's the hex status code?

However, since this fails on the native NT level, I don't think this is
just a simple Cygwin problem.  It seems that this SMBIOS stuff is
somehow broken on that system.


Corinna

-- 
Corinna Vinschen                  Please, send mails regarding Cygwin to
Cygwin Project Co-Leader          cygwin AT cygwin DOT com
Red Hat

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]