[parisc-linux-cvs] Fix itimers, break init (with workaround)
bame@riverrock.org
bame@riverrock.org
Tue, 11 Dec 2001 10:15:20 -0700
Index: Makefile
===================================================================
RCS file: /var/cvs/linux/Makefile,v
retrieving revision 1.221
diff -u -r1.221 Makefile
--- Makefile 2001/12/05 18:48:07 1.221
+++ Makefile 2001/12/11 17:08:41
@@ -1,7 +1,7 @@
VERSION = 2
PATCHLEVEL = 4
SUBLEVEL = 16
-EXTRAVERSION = -pa16
+EXTRAVERSION = -pa17
KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
Index: arch/parisc/kernel/sys_parisc32.c
===================================================================
RCS file: /var/cvs/linux/arch/parisc/kernel/sys_parisc32.c,v
retrieving revision 1.25
diff -u -r1.25 sys_parisc32.c
--- arch/parisc/kernel/sys_parisc32.c 2001/11/30 23:17:25 1.25
+++ arch/parisc/kernel/sys_parisc32.c 2001/12/11 17:08:42
@@ -668,6 +668,64 @@
return do_sys_settimeofday(tv ? &ktv : NULL, tz ? &ktz : NULL);
}
+struct itimerval32 {
+ struct timeval32 it_interval; /* timer interval */
+ struct timeval32 it_value; /* current value */
+};
+
+asmlinkage long sys32_getitimer(int which, struct itimerval32 *ov32)
+{
+ int error = -EFAULT;
+ struct itimerval get_buffer;
+ extern int do_getitimer(int which, struct itimerval *value);
+
+ if (ov32) {
+ error = do_getitimer(which, &get_buffer);
+ if (!error) {
+ struct itimerval32 gb32;
+ gb32.it_interval.tv_sec = get_buffer.it_interval.tv_sec;
+ gb32.it_interval.tv_usec = get_buffer.it_interval.tv_usec;
+ gb32.it_value.tv_sec = get_buffer.it_value.tv_sec;
+ gb32.it_value.tv_usec = get_buffer.it_value.tv_usec;
+ if (copy_to_user(ov32, &gb32, sizeof(gb32)))
+ error = -EFAULT;
+ }
+ }
+ return error;
+}
+
+asmlinkage long sys32_setitimer(int which, struct itimerval32 *v32,
+ struct itimerval32 *ov32)
+{
+ struct itimerval set_buffer, get_buffer;
+ struct itimerval32 sb32, gb32;
+ extern int do_setitimer(int which, struct itimerval *value, struct itimerval *ov32);
+ int error;
+
+ if (v32) {
+ if(copy_from_user(&sb32, v32, sizeof(sb32)))
+ return -EFAULT;
+
+ set_buffer.it_interval.tv_sec = sb32.it_interval.tv_sec;
+ set_buffer.it_interval.tv_usec = sb32.it_interval.tv_usec;
+ set_buffer.it_value.tv_sec = sb32.it_value.tv_sec;
+ set_buffer.it_value.tv_usec = sb32.it_value.tv_usec;
+ } else
+ memset((char *) &set_buffer, 0, sizeof(set_buffer));
+
+ error = do_setitimer(which, &set_buffer, ov32 ? &get_buffer : 0);
+ if (error || !ov32)
+ return error;
+
+ gb32.it_interval.tv_sec = get_buffer.it_interval.tv_sec;
+ gb32.it_interval.tv_usec = get_buffer.it_interval.tv_usec;
+ gb32.it_value.tv_sec = get_buffer.it_value.tv_sec;
+ gb32.it_value.tv_usec = get_buffer.it_value.tv_usec;
+ if (copy_to_user(ov32, &gb32, sizeof(gb32)))
+ return -EFAULT;
+ return 0;
+}
+
struct rusage32 {
struct timeval32 ru_utime;
struct timeval32 ru_stime;
@@ -923,7 +981,7 @@
#define ROUND_UP(x,a) ((__typeof__(x))(((unsigned long)(x) + ((a) - 1)) & ~((a) - 1)))
#define NAME_OFFSET(de) ((int) ((de)->d_name - (char *) (de)))
static int
-filldir32 (void *__buf, const char *name, int namlen, off_t offset, ino_t ino,
+filldir32 (void *__buf, const char *name, int namlen, loff_t offset, ino_t ino,
unsigned int d_type)
{
struct linux32_dirent * dirent;
@@ -983,7 +1041,7 @@
}
static int
-fillonedir32 (void * __buf, const char * name, int namlen, off_t offset, ino_t ino,
+fillonedir32 (void * __buf, const char * name, int namlen, loff_t offset, ino_t ino,
unsigned int d_type)
{
struct readdir32_callback * buf = (struct readdir32_callback *) __buf;
Index: arch/parisc/kernel/syscall.S
===================================================================
RCS file: /var/cvs/linux/arch/parisc/kernel/syscall.S,v
retrieving revision 1.73
diff -u -r1.73 syscall.S
--- arch/parisc/kernel/syscall.S 2001/11/30 23:17:25 1.73
+++ arch/parisc/kernel/syscall.S 2001/12/11 17:08:42
@@ -465,8 +465,8 @@
ENTRY_SAME(syslog)
/* even though manpage says struct timeval contains longs, ours has
* time_t and suseconds_t -- both of which are safe wide/narrow */
- ENTRY_SAME(setitimer)
- ENTRY_SAME(getitimer) /* 105 */
+ ENTRY_DIFF(setitimer)
+ ENTRY_DIFF(getitimer) /* 105 */
ENTRY_SAME(capget)
ENTRY_SAME(capset)
ENTRY_DIFF(pread)
Index: arch/parisc/mm/init.c
===================================================================
RCS file: /var/cvs/linux/arch/parisc/mm/init.c,v
retrieving revision 1.44
diff -u -r1.44 init.c
--- arch/parisc/mm/init.c 2001/12/04 02:12:40 1.44
+++ arch/parisc/mm/init.c 2001/12/11 17:08:43
@@ -372,6 +372,9 @@
{
unsigned long addr;
+ printk(KERN_INFO "NOT FREEING INITMEM\n");
+ return;
+
addr = (unsigned long)(&__init_begin);
for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) {
ClearPageReserved(virt_to_page(addr));