From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jesse Barnes Date: Mon, 17 Dec 2001 19:54:06 +0000 Subject: Re: [Linux-ia64] multimedia timer interface Message-Id: List-Id: References: In-Reply-To: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: linux-ia64@vger.kernel.org On Fri, Dec 14, 2001 at 08:59:58PM -0800, David Mosberger wrote: > > [something about security implications of a high interrupt load > caused by the user] > > Jesse> I've thought about it enough to not turn [interrupts] on. Maybe I > Jesse> could limit the resolution of periodic interrupts? I'm not > Jesse> sure yet, I'll probably just take it out of the initial > Jesse> revision and let userland deal with it. > > Works for me (for now). Does anyone else have ideas/comments about this aspect of the timer? What's the best way to tell userland that the counter hit the value they were looking for in a secure way? How about periodic notifications? > Jesse> Do you think the glibc people would be amenable to using this > Jesse> interface as an alternate hires timer? > > Yes, Uli (Drepper) said that's what he wants for glibc. I'd > definitely contact him about this. Ok, I'm Cc'ing Uli on this one. Here's the latest version of the header file. Thanks, Jesse /* * Intel Multimedia Timer device interface * * This file is subject to the terms and conditions of the GNU General Public * License. See the file "COPYING" in the main directory of this archive * for more details. * * Copyright (c) 2001 Silicon Graphics, Inc. All rights reserved. * * This file should define an interface compatible with the IA-PC Multimedia * Timers Draft Specification (rev. 0.97) from Intel. Note that some * hardware may not be able to safely export its registers to userspace, * so the ioctl interface should support all necessary functionality. * * 11/01/01 - jbarnes - initial revision * 12/17/01 - jbarnes - removed LEGACY_IRQ ioctl */ #ifndef _LINUX_MMTIMER_H #define _LINUX_MMTIMER_H /* name of the device, usually in /dev */ #define MMTIMER_NAME "mmtimer" #define MMTIMER_FULLNAME "/dev/mmtimer" #define MMTIMER_DESC "IA-PC Multimedia Timer" #define MMTIMER_VERSION 0x1000 /* * Used by the user to setup an alarm */ typedef struct mmtimer_alarm { unsigned long value; int id; int signo; } mmtimer_alarm_t; /* * Breakdown of the ioctl's available. An 'optional' next to the command * indicates that supporting this command is optional, while 'required' * commands must be implemented if conformance is desired. * * MMTIMER_GETOFFSET - optional * Should return the offset (relative to the start of the page where the * registers are mapped) for the counter in question. * * MMTIMER_GETRES - required * The resolution of the clock in femto (10E-15) seconds * * MMTIMER_GETFREQ - required * Frequency of the clock in Hz * * MMTIMER_GETBITS - required * Number of bits in the clock's counter * * MMTIMER_GETNUM - required * Number of comparators available * * MMTIMER_MMAPAVAIL - required * Returns nonzero if the registers can be mmap'd into userspace, 0 otherwise * * MMTIMER_SETPERIODIC - required * Sets the comparator in question to the value specified. * The interrupt handler will add the value specified to the * comparator after a match. * * MMTIMER_SETONESHOT - required * Like the above, but the comparator is not updated after the match. * * MMTIMER_GETCOUNTER - required * Gets the current value in the counter */ #define MMTIMER_IOCTL_BASE 'm' #define MMTIMER_GETOFFSET _IO(MMTIMER_IOCTL_BASE, 0) #define MMTIMER_GETRES _IOR(MMTIMER_IOCTL_BASE, 1, unsigned long) #define MMTIMER_GETFREQ _IOR(MMTIMER_IOCTL_BASE, 2, unsigned long) #define MMTIMER_GETBITS _IO(MMTIMER_IOCTL_BASE, 4) #define MMTIMER_GETNUM _IO(MMTIMER_IOCTL_BASE, 5) #define MMTIMER_MMAPAVAIL _IO(MMTIMER_IOCTL_BASE, 6) #define MMTIMER_SETPERIODIC _IOW(MMTIMER_IOCTL_BASE, 7, mmtimer_alarm_t) #define MMTIMER_SETONESHOT _IOW(MMTIMER_IOCTL_BASE, 8, mmtimer_alarm_t) #define MMTIMER_GETCOUNTER _IOR(MMTIMER_IOCTL_BASE, 9, unsigned long) /* * An mmtimer verification program. WARNINGs are ok, but ERRORs indicate * that the device doesn't fully support the interface defined here. */ #ifdef _MMTIMER_TEST_PROGRAM #include #include #include #include #include #include #include #include "mmtimer.h" int main(int argc, char *argv[]) { int result, fd; unsigned long val = 0; unsigned long i; if((fd = open("/dev/"MMTIMER_NAME, O_RDONLY)) = -1) { printf("failed to open /dev/%s", MMTIMER_NAME); return 1; } /* * How many comparators are there? */ if((result = ioctl(fd, MMTIMER_GETNUM, 0)) != -ENOSYS) printf("comparators available: %d\n", result); else printf("ERROR: no comparators available\n"); /* * Can we mmap in the counter? */ if((result = ioctl(fd, MMTIMER_MMAPAVAIL, 0)) = 1) { printf("mmap available\n"); /* ... so try getting the offset for each clock */ if((result = ioctl(fd, MMTIMER_GETOFFSET, 0)) != -ENOSYS) printf("offset: %d\n", result); else printf("WARNING: offset unavailable for clock\n"); } else printf("WARNING: mmap unavailable\n"); /* * Get the resolution in femtoseconds */ if((result = ioctl(fd, MMTIMER_GETRES, &val)) != -ENOSYS) printf("resolution: %ld femtoseconds\n", val); else printf("ERROR: failed to get resolution\n"); /* * Get the frequency in Hz */ if((result = ioctl(fd, MMTIMER_GETFREQ, &val)) != -ENOSYS) if(val < 10000000) /* less than 10 MHz? */ printf("ERROR: frequency only %ld MHz, should be >= 10 MHz\n", val/1000000); else printf("frequency: %ld MHz\n", val/1000000); else printf("ERROR: failed to get frequency\n"); /* * How many bits in the counter? */ if((result = ioctl(fd, MMTIMER_GETBITS, 0)) != -ENOSYS) printf("bits in counter: %d\n", result); else printf("ERROR: can't get number of bits in counter\n"); if((result = ioctl(fd, MMTIMER_GETCOUNTER, &val)) != -ENOSYS) printf("counter value: %ld\n", val); else printf("ERROR: can't get counter value\n"); return 0; } #endif /* _MMTIMER_TEST_PROGRM */ #endif /* _LINUX_MMTIMER_H */