mirror of
https://github.com/torvalds/linux.git
synced 2024-12-27 05:11:48 +00:00
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/kyle/parisc-2.6
* 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/kyle/parisc-2.6: [PARISC] Add NOTES section [PARISC] Use compat_sys_getdents [PARISC] Do not allow STI_CONSOLE to be modular [PARISC] Clean up sti_flush [PARISC] Add dummy isa_(bus|virt)_to_(virt|bus) inlines [PARISC] Add empty <asm-parisc/vga.h>
This commit is contained in:
commit
d96a2a5c64
@ -285,147 +285,6 @@ int cp_compat_stat(struct kstat *stat, struct compat_stat __user *statbuf)
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct linux32_dirent {
|
|
||||||
u32 d_ino;
|
|
||||||
compat_off_t d_off;
|
|
||||||
u16 d_reclen;
|
|
||||||
char d_name[1];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct old_linux32_dirent {
|
|
||||||
u32 d_ino;
|
|
||||||
u32 d_offset;
|
|
||||||
u16 d_namlen;
|
|
||||||
char d_name[1];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct getdents32_callback {
|
|
||||||
struct linux32_dirent __user * current_dir;
|
|
||||||
struct linux32_dirent __user * previous;
|
|
||||||
int count;
|
|
||||||
int error;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct readdir32_callback {
|
|
||||||
struct old_linux32_dirent __user * dirent;
|
|
||||||
int count;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define NAME_OFFSET(de) ((int) ((de)->d_name - (char __user *) (de)))
|
|
||||||
static int filldir32 (void *__buf, const char *name, int namlen,
|
|
||||||
loff_t offset, u64 ino, unsigned int d_type)
|
|
||||||
{
|
|
||||||
struct linux32_dirent __user * dirent;
|
|
||||||
struct getdents32_callback * buf = (struct getdents32_callback *) __buf;
|
|
||||||
int reclen = ALIGN(NAME_OFFSET(dirent) + namlen + 1, 4);
|
|
||||||
u32 d_ino;
|
|
||||||
|
|
||||||
buf->error = -EINVAL; /* only used if we fail.. */
|
|
||||||
if (reclen > buf->count)
|
|
||||||
return -EINVAL;
|
|
||||||
d_ino = ino;
|
|
||||||
if (sizeof(d_ino) < sizeof(ino) && d_ino != ino)
|
|
||||||
return -EOVERFLOW;
|
|
||||||
dirent = buf->previous;
|
|
||||||
if (dirent)
|
|
||||||
put_user(offset, &dirent->d_off);
|
|
||||||
dirent = buf->current_dir;
|
|
||||||
buf->previous = dirent;
|
|
||||||
put_user(d_ino, &dirent->d_ino);
|
|
||||||
put_user(reclen, &dirent->d_reclen);
|
|
||||||
copy_to_user(dirent->d_name, name, namlen);
|
|
||||||
put_user(0, dirent->d_name + namlen);
|
|
||||||
dirent = ((void __user *)dirent) + reclen;
|
|
||||||
buf->current_dir = dirent;
|
|
||||||
buf->count -= reclen;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
asmlinkage long
|
|
||||||
sys32_getdents (unsigned int fd, void __user * dirent, unsigned int count)
|
|
||||||
{
|
|
||||||
struct file * file;
|
|
||||||
struct linux32_dirent __user * lastdirent;
|
|
||||||
struct getdents32_callback buf;
|
|
||||||
int error;
|
|
||||||
|
|
||||||
error = -EFAULT;
|
|
||||||
if (!access_ok(VERIFY_WRITE, dirent, count))
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
error = -EBADF;
|
|
||||||
file = fget(fd);
|
|
||||||
if (!file)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
buf.current_dir = (struct linux32_dirent __user *) dirent;
|
|
||||||
buf.previous = NULL;
|
|
||||||
buf.count = count;
|
|
||||||
buf.error = 0;
|
|
||||||
|
|
||||||
error = vfs_readdir(file, filldir32, &buf);
|
|
||||||
if (error < 0)
|
|
||||||
goto out_putf;
|
|
||||||
error = buf.error;
|
|
||||||
lastdirent = buf.previous;
|
|
||||||
if (lastdirent) {
|
|
||||||
if (put_user(file->f_pos, &lastdirent->d_off))
|
|
||||||
error = -EFAULT;
|
|
||||||
else
|
|
||||||
error = count - buf.count;
|
|
||||||
}
|
|
||||||
|
|
||||||
out_putf:
|
|
||||||
fput(file);
|
|
||||||
out:
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int fillonedir32(void * __buf, const char * name, int namlen,
|
|
||||||
loff_t offset, u64 ino, unsigned int d_type)
|
|
||||||
{
|
|
||||||
struct readdir32_callback * buf = (struct readdir32_callback *) __buf;
|
|
||||||
struct old_linux32_dirent __user * dirent;
|
|
||||||
u32 d_ino;
|
|
||||||
|
|
||||||
if (buf->count)
|
|
||||||
return -EINVAL;
|
|
||||||
d_ino = ino;
|
|
||||||
if (sizeof(d_ino) < sizeof(ino) && d_ino != ino)
|
|
||||||
return -EOVERFLOW;
|
|
||||||
buf->count++;
|
|
||||||
dirent = buf->dirent;
|
|
||||||
put_user(d_ino, &dirent->d_ino);
|
|
||||||
put_user(offset, &dirent->d_offset);
|
|
||||||
put_user(namlen, &dirent->d_namlen);
|
|
||||||
copy_to_user(dirent->d_name, name, namlen);
|
|
||||||
put_user(0, dirent->d_name + namlen);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
asmlinkage long
|
|
||||||
sys32_readdir (unsigned int fd, void __user * dirent, unsigned int count)
|
|
||||||
{
|
|
||||||
int error;
|
|
||||||
struct file * file;
|
|
||||||
struct readdir32_callback buf;
|
|
||||||
|
|
||||||
error = -EBADF;
|
|
||||||
file = fget(fd);
|
|
||||||
if (!file)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
buf.count = 0;
|
|
||||||
buf.dirent = dirent;
|
|
||||||
|
|
||||||
error = vfs_readdir(file, fillonedir32, &buf);
|
|
||||||
if (error >= 0)
|
|
||||||
error = buf.count;
|
|
||||||
fput(file);
|
|
||||||
out:
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*** copied from mips64 ***/
|
/*** copied from mips64 ***/
|
||||||
/*
|
/*
|
||||||
* Ooo, nasty. We need here to frob 32-bit unsigned longs to
|
* Ooo, nasty. We need here to frob 32-bit unsigned longs to
|
||||||
|
@ -222,9 +222,7 @@
|
|||||||
ENTRY_SAME(setfsgid)
|
ENTRY_SAME(setfsgid)
|
||||||
/* I think this might work */
|
/* I think this might work */
|
||||||
ENTRY_SAME(llseek) /* 140 */
|
ENTRY_SAME(llseek) /* 140 */
|
||||||
/* struct linux_dirent has longs, like 'unsigned long d_ino' which
|
ENTRY_COMP(getdents)
|
||||||
* almost definitely should be 'ino_t d_ino' but it's too late now */
|
|
||||||
ENTRY_DIFF(getdents)
|
|
||||||
/* it is POSSIBLE that select will be OK because even though fd_set
|
/* it is POSSIBLE that select will be OK because even though fd_set
|
||||||
* contains longs, the macros and sizes are clever. */
|
* contains longs, the macros and sizes are clever. */
|
||||||
ENTRY_COMP(select)
|
ENTRY_COMP(select)
|
||||||
|
@ -81,6 +81,8 @@ SECTIONS
|
|||||||
__ex_table : { *(__ex_table) }
|
__ex_table : { *(__ex_table) }
|
||||||
__stop___ex_table = .;
|
__stop___ex_table = .;
|
||||||
|
|
||||||
|
NOTES
|
||||||
|
|
||||||
__start___unwind = .; /* unwind info */
|
__start___unwind = .; /* unwind info */
|
||||||
.PARISC.unwind : { *(.PARISC.unwind) }
|
.PARISC.unwind : { *(.PARISC.unwind) }
|
||||||
__stop___unwind = .;
|
__stop___unwind = .;
|
||||||
|
@ -145,7 +145,7 @@ config FRAMEBUFFER_CONSOLE_ROTATION
|
|||||||
oriented.
|
oriented.
|
||||||
|
|
||||||
config STI_CONSOLE
|
config STI_CONSOLE
|
||||||
tristate "STI text console"
|
bool "STI text console"
|
||||||
depends on PARISC
|
depends on PARISC
|
||||||
default y
|
default y
|
||||||
help
|
help
|
||||||
|
@ -232,18 +232,14 @@ sti_bmove(struct sti_struct *sti, int src_y, int src_x,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* FIXME: Do we have another solution for this ? */
|
static void sti_flush(unsigned long start, unsigned long end)
|
||||||
static void sti_flush(unsigned long from, unsigned long len)
|
|
||||||
{
|
{
|
||||||
flush_data_cache();
|
flush_icache_range(start, end);
|
||||||
flush_kernel_dcache_range(from, len);
|
|
||||||
flush_icache_range(from, from+len);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void __devinit
|
void __devinit
|
||||||
sti_rom_copy(unsigned long base, unsigned long count, void *dest)
|
sti_rom_copy(unsigned long base, unsigned long count, void *dest)
|
||||||
{
|
{
|
||||||
unsigned long dest_len = count;
|
|
||||||
unsigned long dest_start = (unsigned long) dest;
|
unsigned long dest_start = (unsigned long) dest;
|
||||||
|
|
||||||
/* this still needs to be revisited (see arch/parisc/mm/init.c:246) ! */
|
/* this still needs to be revisited (see arch/parisc/mm/init.c:246) ! */
|
||||||
@ -260,7 +256,7 @@ sti_rom_copy(unsigned long base, unsigned long count, void *dest)
|
|||||||
dest++;
|
dest++;
|
||||||
}
|
}
|
||||||
|
|
||||||
sti_flush(dest_start, dest_len);
|
sti_flush(dest_start, (unsigned long)dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -663,7 +659,6 @@ sti_bmode_font_raw(struct sti_cooked_font *f)
|
|||||||
static void __devinit
|
static void __devinit
|
||||||
sti_bmode_rom_copy(unsigned long base, unsigned long count, void *dest)
|
sti_bmode_rom_copy(unsigned long base, unsigned long count, void *dest)
|
||||||
{
|
{
|
||||||
unsigned long dest_len = count;
|
|
||||||
unsigned long dest_start = (unsigned long) dest;
|
unsigned long dest_start = (unsigned long) dest;
|
||||||
|
|
||||||
while (count) {
|
while (count) {
|
||||||
@ -672,7 +667,8 @@ sti_bmode_rom_copy(unsigned long base, unsigned long count, void *dest)
|
|||||||
base += 4;
|
base += 4;
|
||||||
dest++;
|
dest++;
|
||||||
}
|
}
|
||||||
sti_flush(dest_start, dest_len);
|
|
||||||
|
sti_flush(dest_start, (unsigned long)dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct sti_rom * __devinit
|
static struct sti_rom * __devinit
|
||||||
|
@ -15,6 +15,16 @@ extern unsigned long parisc_vmerge_max_size;
|
|||||||
#define virt_to_bus virt_to_phys
|
#define virt_to_bus virt_to_phys
|
||||||
#define bus_to_virt phys_to_virt
|
#define bus_to_virt phys_to_virt
|
||||||
|
|
||||||
|
static inline unsigned long isa_bus_to_virt(unsigned long addr) {
|
||||||
|
BUG();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline unsigned long isa_virt_to_bus(void *addr) {
|
||||||
|
BUG();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Memory mapped I/O
|
* Memory mapped I/O
|
||||||
*
|
*
|
||||||
|
6
include/asm-parisc/vga.h
Normal file
6
include/asm-parisc/vga.h
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#ifndef __ASM_PARISC_VGA_H__
|
||||||
|
#define __ASM_PARISC_VGA_H__
|
||||||
|
|
||||||
|
/* nothing */
|
||||||
|
|
||||||
|
#endif __ASM_PARISC_VGA_H__
|
Loading…
Reference in New Issue
Block a user