Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2000-10-09 17:19:41 +0400
committerCorinna Vinschen <corinna@vinschen.de>2000-10-09 17:19:41 +0400
commit42f1b6c5447bd04b2f6a2bdebf2d0481f61bcd3a (patch)
tree8158b2eaa6f2abac5bd522e2bf2650141901d8b2
parentb9e7a2b6662bcfef28b6fafddfeb9ff1e00ac5f5 (diff)
* fhandler.h (fhandler_dev_mem): Erase member `init_phase' and
member function `init'. * fhandler_mem.cc: Add typedefs for NT internal data types `SYSTEM_INFORMATION_CLASS' and `SYSTEM_BASIC_INFORMATION'. Add prototype for `NtQuerySystemInformation' function. (fhandler_dev_mem::fhandler_dev_mem): Takes over initialization task from `init'. Use `NtQuerySystemInformation' function to evaluate the size of physical memory instead of interval search. (fhandler_dev_mem::init): Eliminated. (fhandler_dev_mem::open): Don't call `init'. (fhandler_dev_mem::read): Eliminate check for `init_phase'. (dummy_autoload): Add load statement for `NtQuerySystemInformation'.
-rw-r--r--winsup/cygwin/ChangeLog15
-rw-r--r--winsup/cygwin/fhandler.h3
-rw-r--r--winsup/cygwin/fhandler_mem.cc80
3 files changed, 62 insertions, 36 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index cd766e5ee..8872bc527 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,18 @@
+Mon Oct 9 15:11:00 2000 Corinna Vinschen <corinna@vinschen.de>
+
+ * fhandler.h (fhandler_dev_mem): Erase member `init_phase' and
+ member function `init'.
+ * fhandler_mem.cc: Add typedefs for NT internal data types
+ `SYSTEM_INFORMATION_CLASS' and `SYSTEM_BASIC_INFORMATION'.
+ Add prototype for `NtQuerySystemInformation' function.
+ (fhandler_dev_mem::fhandler_dev_mem): Takes over initialization task
+ from `init'. Use `NtQuerySystemInformation' function to evaluate the
+ size of physical memory instead of interval search.
+ (fhandler_dev_mem::init): Eliminated.
+ (fhandler_dev_mem::open): Don't call `init'.
+ (fhandler_dev_mem::read): Eliminate check for `init_phase'.
+ (dummy_autoload): Add load statement for `NtQuerySystemInformation'.
+
Sun Oct 8 22:38:40 2000 Christopher Faylor <cgf@cygnus.com>
* dtable.cc (set_std_handle): Use std_consts array to control
diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h
index c869067e6..ad17825bc 100644
--- a/winsup/cygwin/fhandler.h
+++ b/winsup/cygwin/fhandler.h
@@ -776,9 +776,6 @@ protected:
int unit;
DWORD mem_size;
DWORD pos;
- bool init_phase;
-
- void init (void);
public:
fhandler_dev_mem (const char *name, int unit);
diff --git a/winsup/cygwin/fhandler_mem.cc b/winsup/cygwin/fhandler_mem.cc
index ae86f3f55..61e1d1456 100644
--- a/winsup/cygwin/fhandler_mem.cc
+++ b/winsup/cygwin/fhandler_mem.cc
@@ -22,10 +22,36 @@
#include "fhandler.h"
#include "path.h"
+/*
+ * The following both data structures aren't defined anywhere in the Microsoft
+ * header files. Taken from the book "Windows NT/2000 Native API Reference"
+ * by Gary Nebbett.
+ */
+typedef enum _SYSTEM_INFORMATION_CLASS {
+ SystemBasicInformation = 0
+ /* Dropped each other since not used here. */
+} SYSTEM_INFORMATION_CLASS;
+
+typedef struct _SYSTEM_BASIC_INFORMATION {
+ ULONG Unknown;
+ ULONG MaximumIncrement;
+ ULONG PhysicalPageSize;
+ ULONG NumberOfPhysicalPages;
+ ULONG LowestPhysicalPage;
+ ULONG HighestPhysicalPage;
+ ULONG AllocationGranularity;
+ ULONG LowestUserAddress;
+ ULONG HighestUserAddress;
+ ULONG ActiveProcessors;
+ ULONG NumberProcessors;
+} SYSTEM_BASIC_INFORMATION, *PSYSTEM_BASIC_INFORMATION;
+
extern "C" {
NTSTATUS NTAPI NtMapViewOfSection(HANDLE,HANDLE,PVOID*,ULONG,ULONG,
- PLARGE_INTEGER,PULONG,SECTION_INHERIT,
- ULONG,ULONG);
+ PLARGE_INTEGER,PULONG,SECTION_INHERIT,
+ ULONG,ULONG);
+NTSTATUS NTAPI NtQuerySystemInformation(SYSTEM_INFORMATION_CLASS,
+ PVOID,ULONG,PULONG);
NTSTATUS NTAPI NtOpenSection(PHANDLE,ACCESS_MASK,POBJECT_ATTRIBUTES);
NTSTATUS NTAPI NtUnmapViewOfSection(HANDLE,PVOID);
VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING,PCWSTR);
@@ -37,37 +63,22 @@ ULONG NTAPI RtlNtStatusToDosError(NTSTATUS);
fhandler_dev_mem::fhandler_dev_mem (const char *name, int nunit)
: fhandler_base (FH_MEM, name),
- unit (nunit),
- init_phase (false)
-{
-}
-
-fhandler_dev_mem::~fhandler_dev_mem (void)
-{
-}
-
-void
-fhandler_dev_mem::init ()
+ unit (nunit)
{
if (unit == 1) /* /dev/mem */
{
- long page_size = getpagesize ();
- char buf[1];
-
- init_phase = true;
- mem_size = pos = 1 << 30;
- for (off_t afct = 1 << 29; afct >= page_size; afct >>= 1)
+ NTSTATUS ret;
+ SYSTEM_BASIC_INFORMATION sbi;
+ if ((ret = NtQuerySystemInformation (SystemBasicInformation, (PVOID) &sbi,
+ sizeof sbi, NULL)) != STATUS_SUCCESS)
{
- if (read (buf, 1) > 0)
- pos += afct;
- else
- {
- if (pos < mem_size)
- mem_size = pos;
- pos -= afct;
- }
+ __seterrno_from_win_error (RtlNtStatusToDosError (ret));
+ debug_printf("NtQuerySystemInformation: ret = %d, Dos(ret) = %d",
+ ret, RtlNtStatusToDosError (ret));
+ mem_size = 0;
}
- pos = 0;
+ else
+ mem_size = sbi.PhysicalPageSize * sbi.NumberOfPhysicalPages;
debug_printf ("MemSize: %d MB", mem_size >>= 20);
}
else if (unit == 2) /* /dev/kmem - Not yet supported */
@@ -82,9 +93,13 @@ fhandler_dev_mem::init ()
}
else
{
- debug_printf ("Illegal unit!!!");
+ mem_size = 0;
+ debug_printf ("Illegal minor number!!!");
}
- init_phase = false;
+}
+
+fhandler_dev_mem::~fhandler_dev_mem (void)
+{
}
int
@@ -140,7 +155,6 @@ fhandler_dev_mem::open (const char *, int flags, mode_t)
}
set_io_handle (mem);
- init ();
return 1;
}
@@ -224,8 +238,7 @@ fhandler_dev_mem::read (void *ptr, size_t ulen)
0,
PAGE_READONLY)) != STATUS_SUCCESS)
{
- if (!init_phase) /* Don't want to flood debug output with init crap. */
- __seterrno_from_win_error (RtlNtStatusToDosError (ret));
+ __seterrno_from_win_error (RtlNtStatusToDosError (ret));
return -1;
}
@@ -453,6 +466,7 @@ dummy_autoload (void)
LoadDLLinit (ntdll)
LoadDLLfuncEx (NtMapViewOfSection, 40, ntdll, 1)
LoadDLLfuncEx (NtOpenSection, 12, ntdll, 1)
+LoadDLLfuncEx (NtQuerySystemInformation, 16, ntdll, 1)
LoadDLLfuncEx (NtUnmapViewOfSection, 8, ntdll, 1)
LoadDLLfuncEx (RtlInitUnicodeString, 8, ntdll, 1)
LoadDLLfuncEx (RtlNtStatusToDosError, 4, ntdll, 1)