]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
2003-11-12 Marco Gerards <metgerards@student.han.nl>
authormarco_g <marco_g@localhost>
Wed, 12 Nov 2003 20:33:52 +0000 (20:33 +0000)
committermarco_g <marco_g@localhost>
Wed, 12 Nov 2003 20:33:52 +0000 (20:33 +0000)
* disk/i386/pc/biosdisk.c (pupa_biosdisk_open): Correctly check
for available extensions.

* include/pupa/i386/pc/time.h: New file.
* kern/disk.c: Include <pupa/machine/time.h>.
(PUPA_CACHE_TIMEOUT): New macro.
(pupa_last_time): New variable.
(pupa_disk_open): Flush the cache when there was a timeout.
(pupa_disk_close): Reset the timer.
* kern/i386/pc/startup.S (pupa_get_rtc): Renamed from
pupa_currticks.
* util/misc.c: Include <sys/times.h>
(pupa_get_rtc): New function.

ChangeLog
disk/i386/pc/biosdisk.c
include/grub/err.h
include/grub/i386/pc/time.h [new file with mode: 0644]
kern/disk.c
kern/i386/pc/startup.S
util/misc.c

index 97ec52f4e5d2808220a62f5106ea38f8bc3a8920..c004f04e2c99691d794759121d6e243e3c6be0ba 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+2003-11-12  Marco Gerards  <metgerards@student.han.nl>
+
+       * disk/i386/pc/biosdisk.c (pupa_biosdisk_open): Correctly check
+       for available extensions.
+
+       * include/pupa/i386/pc/time.h: New file.
+       * kern/disk.c: Include <pupa/machine/time.h>.
+       (PUPA_CACHE_TIMEOUT): New macro.
+       (pupa_last_time): New variable.
+       (pupa_disk_open): Flush the cache when there was a timeout.
+       (pupa_disk_close): Reset the timer.
+       * kern/i386/pc/startup.S (pupa_get_rtc): Renamed from
+       pupa_currticks.
+       * util/misc.c: Include <sys/times.h>
+       (pupa_get_rtc): New function.
+
 2003-11-09  Jeroen Dekkers  <jeroen@dekkers.cx>
 
        * fs/ext2.c (struct pupa_ext2_inode): Declare struct datablocks
index a88248863b9ce9599d9029c720b5013a69e2a145..1856f7bd9efc8611d31e5e70668825ed22eb1f64 100644 (file)
@@ -2,6 +2,7 @@
  *  PUPA  --  Preliminary Universal Programming Architecture for GRUB
  *  Copyright (C) 1999,2000,2001,2002  Free Software Foundation, Inc.
  *  Copyright (C) 2002 Yoshinori K. Okuji <okuji@enbug.org>
+ *  Copyright (C) 2003 Marco Gerards <metgerards@student.han.nl>
  *
  *  PUPA is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -159,7 +160,7 @@ pupa_biosdisk_open (const char *name, pupa_disk_t disk)
          /* Clear out the DRP.  */
          pupa_memset (drp, 0, sizeof (*drp));
          drp->size = sizeof (*drp);
-         if (pupa_biosdisk_get_diskinfo_int13_extensions (drive, drp))
+         if (!pupa_biosdisk_get_diskinfo_int13_extensions (drive, drp))
            {
              data->flags = PUPA_BIOSDISK_FLAG_LBA;
 
index c1d56b588cdfc248fe099304305f81a3bc1b7114..40081a7e4e1db401914a9c2bf70a82c151e48945 100644 (file)
@@ -2,7 +2,7 @@
 /*
  *  PUPA  --  Preliminary Universal Programming Architecture for GRUB
  *  Copyright (C) 2002 Yoshinori K. Okuji <okuji@enbug.org>
- *  Copyright (C) 2002 Marco Gerards <metgerards@student.han.nl>
+ *  Copyright (C) 2003 Marco Gerards <metgerards@student.han.nl>
  *
  *  PUPA is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
diff --git a/include/grub/i386/pc/time.h b/include/grub/i386/pc/time.h
new file mode 100644 (file)
index 0000000..435a49f
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ *  PUPA  --  Preliminary Universal Programming Architecture for GRUB
+ *  Copyright (C) 2003 Marco Gerards <metgerards@student.han.nl>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef KERNEL_TIME_HEADER
+#define KERNEL_TIME_HEADER     1
+
+#ifdef PUPA_UTIL
+# include <time.h>
+# define PUPA_TICKS_PER_SECOND CLOCKS_PER_SEC
+#else
+# define PUPA_TICKS_PER_SECOND 18
+#endif
+
+/* Return the real time in ticks.  */
+pupa_uint32_t pupa_get_rtc (void);
+
+#endif /* ! KERNEL_TIME_HEADER */
index 26a64d085b274fec475c64398fe17e656040843e..0373e58aa157780874b57ec0ecff4c32c6317c3f 100644 (file)
 #include <pupa/types.h>
 #include <pupa/machine/partition.h>
 #include <pupa/misc.h>
+#include <pupa/machine/time.h>
+
+#define        PUPA_CACHE_TIMEOUT      2
+
+/* The last time the disk was used.  */
+static unsigned long pupa_last_time = 0;
+
 
 /* Disk cache.  */
 struct pupa_disk_cache
@@ -194,6 +201,7 @@ pupa_disk_open (const char *name)
   pupa_disk_t disk;
   pupa_disk_dev_t dev;
   char *raw = (char *) name;
+  unsigned long current_time;
   
   disk = (pupa_disk_t) pupa_malloc (sizeof (*disk));
   if (! disk)
@@ -247,6 +255,15 @@ pupa_disk_open (const char *name)
   if (p)
     disk->partition = pupa_partition_probe (disk, p + 1);
 
+  /* The cache will be invalidated about 2 seconds after a device was
+     closed.  */
+  current_time = pupa_get_rtc ();
+
+  if (current_time > pupa_last_time + PUPA_CACHE_TIMEOUT * PUPA_TICKS_PER_SECOND)
+    pupa_disk_cache_invalidate_all ();
+  
+  pupa_last_time = current_time;
+  
  fail:
   
   if (raw && raw != name)
@@ -267,6 +284,9 @@ pupa_disk_close (pupa_disk_t disk)
   if (disk->dev && disk->dev->close)
     (disk->dev->close) (disk);
 
+  /* Reset the timer.  */
+  pupa_last_time = pupa_get_rtc ();
+
   pupa_free (disk->partition);
   pupa_free ((void *) disk->name);
   pupa_free (disk);
index 90c3ba3fb492246e9d52d3a7ffeca77d24bebf9e..885a8903366a48a5c5affefa8775c0abf0b21c46 100644 (file)
@@ -2,6 +2,7 @@
  *  PUPA  --  Preliminary Universal Programming Architecture for GRUB
  *  Copyright (C) 1999,2000,2001,2002 Free Software Foundation, Inc.
  *  Copyright (C) 2002,2003  Yoshinori K. Okuji <okuji@enbug.org>
+ *  Copyright (C) 2003 Marco Gerards <metgerards@student.han.nl>
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -1492,11 +1493,11 @@ gottime:
 
        
 /*
- * pupa_currticks()
+ * pupa_get_rtc()
  *     return the real time in ticks, of which there are about
  *     18-20 per second
  */
-FUNCTION(pupa_currticks)
+FUNCTION(pupa_get_rtc)
        pushl   %ebp
 
        call    prot_to_real    /* enter real mode */
index a8a0b971795c74b9a27211fa00cb7ad3990a34ab..35eafc723223e49e1bc26967bfae595499c042ef 100644 (file)
@@ -1,6 +1,7 @@
 /*
  *  PUPA  --  Preliminary Universal Programming Architecture for GRUB
  *  Copyright (C) 2002,2003 Yoshinori K. Okuji <okuji@enbug.org>
+ *  Copyright (C) 2003 Marco Gerards <metgerards@student.han.nl>
  *
  *  PUPA is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -23,6 +24,7 @@
 #include <string.h>
 #include <sys/types.h>
 #include <sys/stat.h>
+#include <sys/times.h>
 
 #include <pupa/util/misc.h>
 #include <pupa/mm.h>
@@ -198,3 +200,11 @@ pupa_putchar (int c)
 {
   putchar (c);
 }
+
+pupa_uint32_t
+pupa_get_rtc (void)
+{
+  struct tms currtime;
+
+  return times (&currtime);
+}