+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
* 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
/* 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;
/*
* 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
--- /dev/null
+/*
+ * 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 */
#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
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)
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)
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);
* 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
/*
- * 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 */
/*
* 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
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
+#include <sys/times.h>
#include <pupa/util/misc.h>
#include <pupa/mm.h>
{
putchar (c);
}
+
+pupa_uint32_t
+pupa_get_rtc (void)
+{
+ struct tms currtime;
+
+ return times (&currtime);
+}