From 8e72a9c0e30c8be9e17f8f722c3c1f8deee68f0a Mon Sep 17 00:00:00 2001 From: marco_g Date: Wed, 12 Nov 2003 20:33:52 +0000 Subject: [PATCH] 2003-11-12 Marco Gerards * 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_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 (pupa_get_rtc): New function. --- ChangeLog | 16 ++++++++++++++++ disk/i386/pc/biosdisk.c | 3 ++- include/grub/err.h | 2 +- include/grub/i386/pc/time.h | 33 +++++++++++++++++++++++++++++++++ kern/disk.c | 20 ++++++++++++++++++++ kern/i386/pc/startup.S | 5 +++-- util/misc.c | 10 ++++++++++ 7 files changed, 85 insertions(+), 4 deletions(-) create mode 100644 include/grub/i386/pc/time.h diff --git a/ChangeLog b/ChangeLog index 97ec52f4e..c004f04e2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +2003-11-12 Marco Gerards + + * 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_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 + (pupa_get_rtc): New function. + 2003-11-09 Jeroen Dekkers * fs/ext2.c (struct pupa_ext2_inode): Declare struct datablocks diff --git a/disk/i386/pc/biosdisk.c b/disk/i386/pc/biosdisk.c index a88248863..1856f7bd9 100644 --- a/disk/i386/pc/biosdisk.c +++ b/disk/i386/pc/biosdisk.c @@ -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 + * Copyright (C) 2003 Marco Gerards * * 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; diff --git a/include/grub/err.h b/include/grub/err.h index c1d56b588..40081a7e4 100644 --- a/include/grub/err.h +++ b/include/grub/err.h @@ -2,7 +2,7 @@ /* * PUPA -- Preliminary Universal Programming Architecture for GRUB * Copyright (C) 2002 Yoshinori K. Okuji - * Copyright (C) 2002 Marco Gerards + * Copyright (C) 2003 Marco Gerards * * 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 index 000000000..435a49f17 --- /dev/null +++ b/include/grub/i386/pc/time.h @@ -0,0 +1,33 @@ +/* + * PUPA -- Preliminary Universal Programming Architecture for GRUB + * Copyright (C) 2003 Marco Gerards + * + * 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 +# 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 */ diff --git a/kern/disk.c b/kern/disk.c index 26a64d085..0373e58aa 100644 --- a/kern/disk.c +++ b/kern/disk.c @@ -24,6 +24,13 @@ #include #include #include +#include + +#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); diff --git a/kern/i386/pc/startup.S b/kern/i386/pc/startup.S index 90c3ba3fb..885a89033 100644 --- a/kern/i386/pc/startup.S +++ b/kern/i386/pc/startup.S @@ -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 + * Copyright (C) 2003 Marco Gerards * * 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 */ diff --git a/util/misc.c b/util/misc.c index a8a0b9717..35eafc723 100644 --- a/util/misc.c +++ b/util/misc.c @@ -1,6 +1,7 @@ /* * PUPA -- Preliminary Universal Programming Architecture for GRUB * Copyright (C) 2002,2003 Yoshinori K. Okuji + * Copyright (C) 2003 Marco Gerards * * 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 #include #include +#include #include #include @@ -198,3 +200,11 @@ pupa_putchar (int c) { putchar (c); } + +pupa_uint32_t +pupa_get_rtc (void) +{ + struct tms currtime; + + return times (&currtime); +}