mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-18 12:45:08 +00:00
Merge master.kernel.org:/pub/scm/linux/kernel/git/lethal/sh-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/lethal/sh-2.6: sh: Kill off I/O cruft for R7780RP. sh: Revert lazy dcache writeback changes. sh: Enable SM501 support for RTS7751R2D. sh: Use L1_CACHE_BYTES for .data.cacheline_aligned. sysctl: Support vdso_enabled sysctl on SH. sh: Fix kernel thread stack corruption with preempt. doc: Add SH to vdso and earlyprintk in kernel-parameters.txt sh: Fix sigmask trampling in signal delivery. sh: Clear UBC when not in use.
This commit is contained in:
commit
d694c16bc3
26 changed files with 371 additions and 371 deletions
|
@ -79,6 +79,7 @@ parameter is applicable:
|
||||||
Documentation/scsi/.
|
Documentation/scsi/.
|
||||||
SELINUX SELinux support is enabled.
|
SELINUX SELinux support is enabled.
|
||||||
SERIAL Serial support is enabled.
|
SERIAL Serial support is enabled.
|
||||||
|
SH SuperH architecture is enabled.
|
||||||
SMP The kernel is an SMP kernel.
|
SMP The kernel is an SMP kernel.
|
||||||
SPARC Sparc architecture is enabled.
|
SPARC Sparc architecture is enabled.
|
||||||
SWSUSP Software suspend is enabled.
|
SWSUSP Software suspend is enabled.
|
||||||
|
@ -485,7 +486,7 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||||
|
|
||||||
dtc3181e= [HW,SCSI]
|
dtc3181e= [HW,SCSI]
|
||||||
|
|
||||||
earlyprintk= [IA-32,X86-64]
|
earlyprintk= [IA-32,X86-64,SH]
|
||||||
earlyprintk=vga
|
earlyprintk=vga
|
||||||
earlyprintk=serial[,ttySn[,baudrate]]
|
earlyprintk=serial[,ttySn[,baudrate]]
|
||||||
|
|
||||||
|
@ -1784,7 +1785,7 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||||
usbhid.mousepoll=
|
usbhid.mousepoll=
|
||||||
[USBHID] The interval which mice are to be polled at.
|
[USBHID] The interval which mice are to be polled at.
|
||||||
|
|
||||||
vdso= [IA-32]
|
vdso= [IA-32,SH]
|
||||||
vdso=1: enable VDSO (default)
|
vdso=1: enable VDSO (default)
|
||||||
vdso=0: disable VDSO mapping
|
vdso=0: disable VDSO mapping
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,6 @@
|
||||||
# Makefile for the R7780RP-1 specific parts of the kernel
|
# Makefile for the R7780RP-1 specific parts of the kernel
|
||||||
#
|
#
|
||||||
|
|
||||||
obj-y := setup.o io.o irq.o
|
obj-y := setup.o irq.o
|
||||||
|
|
||||||
obj-$(CONFIG_PUSH_SWITCH) += psw.o
|
obj-$(CONFIG_PUSH_SWITCH) += psw.o
|
||||||
|
|
|
@ -1,233 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2001 Ian da Silva, Jeremy Siegel
|
|
||||||
* Based largely on io_se.c.
|
|
||||||
*
|
|
||||||
* I/O routine for Renesas Solutions Highlander R7780RP-1
|
|
||||||
*
|
|
||||||
* Initial version only to support LAN access; some
|
|
||||||
* placeholder code from io_r7780rp.c left in with the
|
|
||||||
* expectation of later SuperIO and PCMCIA access.
|
|
||||||
*/
|
|
||||||
#include <linux/pci.h>
|
|
||||||
#include <linux/kernel.h>
|
|
||||||
#include <linux/types.h>
|
|
||||||
#include <linux/io.h>
|
|
||||||
#include <asm/r7780rp.h>
|
|
||||||
#include <asm/addrspace.h>
|
|
||||||
|
|
||||||
static inline unsigned long port88796l(unsigned int port, int flag)
|
|
||||||
{
|
|
||||||
unsigned long addr;
|
|
||||||
|
|
||||||
if (flag)
|
|
||||||
addr = PA_AX88796L + ((port - AX88796L_IO_BASE) << 1);
|
|
||||||
else
|
|
||||||
addr = PA_AX88796L + ((port - AX88796L_IO_BASE) << 1) + 0x1000;
|
|
||||||
|
|
||||||
return addr;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(CONFIG_NE2000) || defined(CONFIG_NE2000_MODULE)
|
|
||||||
#define CHECK_AX88796L_PORT(port) \
|
|
||||||
((port >= AX88796L_IO_BASE) && (port < (AX88796L_IO_BASE+0x20)))
|
|
||||||
#else
|
|
||||||
#define CHECK_AX88796L_PORT(port) (0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* General outline: remap really low stuff [eventually] to SuperIO,
|
|
||||||
* stuff in PCI IO space (at or above window at pci.h:PCIBIOS_MIN_IO)
|
|
||||||
* is mapped through the PCI IO window. Stuff with high bits (PXSEG)
|
|
||||||
* should be way beyond the window, and is used w/o translation for
|
|
||||||
* compatibility.
|
|
||||||
*/
|
|
||||||
u8 r7780rp_inb(unsigned long port)
|
|
||||||
{
|
|
||||||
if (CHECK_AX88796L_PORT(port))
|
|
||||||
return ctrl_inw(port88796l(port, 0)) & 0xff;
|
|
||||||
else if (is_pci_ioaddr(port))
|
|
||||||
return ctrl_inb(pci_ioaddr(port));
|
|
||||||
|
|
||||||
return ctrl_inw(port) & 0xff;
|
|
||||||
}
|
|
||||||
|
|
||||||
u8 r7780rp_inb_p(unsigned long port)
|
|
||||||
{
|
|
||||||
u8 v;
|
|
||||||
|
|
||||||
if (CHECK_AX88796L_PORT(port))
|
|
||||||
v = ctrl_inw(port88796l(port, 0)) & 0xff;
|
|
||||||
else if (is_pci_ioaddr(port))
|
|
||||||
v = ctrl_inb(pci_ioaddr(port));
|
|
||||||
else
|
|
||||||
v = ctrl_inw(port) & 0xff;
|
|
||||||
|
|
||||||
ctrl_delay();
|
|
||||||
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
|
|
||||||
u16 r7780rp_inw(unsigned long port)
|
|
||||||
{
|
|
||||||
if (is_pci_ioaddr(port))
|
|
||||||
return ctrl_inw(pci_ioaddr(port));
|
|
||||||
|
|
||||||
return ctrl_inw(port);
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 r7780rp_inl(unsigned long port)
|
|
||||||
{
|
|
||||||
if (is_pci_ioaddr(port))
|
|
||||||
return ctrl_inl(pci_ioaddr(port));
|
|
||||||
|
|
||||||
return ctrl_inl(port);
|
|
||||||
}
|
|
||||||
|
|
||||||
void r7780rp_outb(u8 value, unsigned long port)
|
|
||||||
{
|
|
||||||
if (CHECK_AX88796L_PORT(port))
|
|
||||||
ctrl_outw(value, port88796l(port, 0));
|
|
||||||
else if (is_pci_ioaddr(port))
|
|
||||||
ctrl_outb(value, pci_ioaddr(port));
|
|
||||||
else
|
|
||||||
ctrl_outb(value, port);
|
|
||||||
}
|
|
||||||
|
|
||||||
void r7780rp_outb_p(u8 value, unsigned long port)
|
|
||||||
{
|
|
||||||
if (CHECK_AX88796L_PORT(port))
|
|
||||||
ctrl_outw(value, port88796l(port, 0));
|
|
||||||
else if (is_pci_ioaddr(port))
|
|
||||||
ctrl_outb(value, pci_ioaddr(port));
|
|
||||||
else
|
|
||||||
ctrl_outb(value, port);
|
|
||||||
|
|
||||||
ctrl_delay();
|
|
||||||
}
|
|
||||||
|
|
||||||
void r7780rp_outw(u16 value, unsigned long port)
|
|
||||||
{
|
|
||||||
if (is_pci_ioaddr(port))
|
|
||||||
ctrl_outw(value, pci_ioaddr(port));
|
|
||||||
else
|
|
||||||
ctrl_outw(value, port);
|
|
||||||
}
|
|
||||||
|
|
||||||
void r7780rp_outl(u32 value, unsigned long port)
|
|
||||||
{
|
|
||||||
if (is_pci_ioaddr(port))
|
|
||||||
ctrl_outl(value, pci_ioaddr(port));
|
|
||||||
else
|
|
||||||
ctrl_outl(value, port);
|
|
||||||
}
|
|
||||||
|
|
||||||
void r7780rp_insb(unsigned long port, void *dst, unsigned long count)
|
|
||||||
{
|
|
||||||
volatile u16 *p;
|
|
||||||
u8 *buf = dst;
|
|
||||||
|
|
||||||
if (CHECK_AX88796L_PORT(port)) {
|
|
||||||
p = (volatile u16 *)port88796l(port, 0);
|
|
||||||
while (count--)
|
|
||||||
*buf++ = *p & 0xff;
|
|
||||||
} else if (is_pci_ioaddr(port)) {
|
|
||||||
volatile u8 *bp = (volatile u8 *)pci_ioaddr(port);
|
|
||||||
|
|
||||||
while (count--)
|
|
||||||
*buf++ = *bp;
|
|
||||||
} else {
|
|
||||||
p = (volatile u16 *)port;
|
|
||||||
while (count--)
|
|
||||||
*buf++ = *p & 0xff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void r7780rp_insw(unsigned long port, void *dst, unsigned long count)
|
|
||||||
{
|
|
||||||
volatile u16 *p;
|
|
||||||
u16 *buf = dst;
|
|
||||||
|
|
||||||
if (CHECK_AX88796L_PORT(port))
|
|
||||||
p = (volatile u16 *)port88796l(port, 1);
|
|
||||||
else if (is_pci_ioaddr(port))
|
|
||||||
p = (volatile u16 *)pci_ioaddr(port);
|
|
||||||
else
|
|
||||||
p = (volatile u16 *)port;
|
|
||||||
|
|
||||||
while (count--)
|
|
||||||
*buf++ = *p;
|
|
||||||
|
|
||||||
flush_dcache_all();
|
|
||||||
}
|
|
||||||
|
|
||||||
void r7780rp_insl(unsigned long port, void *dst, unsigned long count)
|
|
||||||
{
|
|
||||||
if (is_pci_ioaddr(port)) {
|
|
||||||
volatile u32 *p = (volatile u32 *)pci_ioaddr(port);
|
|
||||||
u32 *buf = dst;
|
|
||||||
|
|
||||||
while (count--)
|
|
||||||
*buf++ = *p;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void r7780rp_outsb(unsigned long port, const void *src, unsigned long count)
|
|
||||||
{
|
|
||||||
volatile u16 *p;
|
|
||||||
const u8 *buf = src;
|
|
||||||
|
|
||||||
if (CHECK_AX88796L_PORT(port)) {
|
|
||||||
p = (volatile u16 *)port88796l(port, 0);
|
|
||||||
while (count--)
|
|
||||||
*p = *buf++;
|
|
||||||
} else if (is_pci_ioaddr(port)) {
|
|
||||||
volatile u8 *bp = (volatile u8 *)pci_ioaddr(port);
|
|
||||||
|
|
||||||
while (count--)
|
|
||||||
*bp = *buf++;
|
|
||||||
} else
|
|
||||||
while (count--)
|
|
||||||
ctrl_outb(*buf++, port);
|
|
||||||
}
|
|
||||||
|
|
||||||
void r7780rp_outsw(unsigned long port, const void *src, unsigned long count)
|
|
||||||
{
|
|
||||||
volatile u16 *p;
|
|
||||||
const u16 *buf = src;
|
|
||||||
|
|
||||||
if (CHECK_AX88796L_PORT(port))
|
|
||||||
p = (volatile u16 *)port88796l(port, 1);
|
|
||||||
else if (is_pci_ioaddr(port))
|
|
||||||
p = (volatile u16 *)pci_ioaddr(port);
|
|
||||||
else
|
|
||||||
p = (volatile u16 *)port;
|
|
||||||
|
|
||||||
while (count--)
|
|
||||||
*p = *buf++;
|
|
||||||
|
|
||||||
flush_dcache_all();
|
|
||||||
}
|
|
||||||
|
|
||||||
void r7780rp_outsl(unsigned long port, const void *src, unsigned long count)
|
|
||||||
{
|
|
||||||
const u32 *buf = src;
|
|
||||||
u32 *p;
|
|
||||||
|
|
||||||
if (is_pci_ioaddr(port))
|
|
||||||
p = (u32 *)pci_ioaddr(port);
|
|
||||||
else
|
|
||||||
p = (u32 *)port;
|
|
||||||
|
|
||||||
while (count--)
|
|
||||||
ctrl_outl(*buf++, (unsigned long)p);
|
|
||||||
}
|
|
||||||
|
|
||||||
void __iomem *r7780rp_ioport_map(unsigned long port, unsigned int size)
|
|
||||||
{
|
|
||||||
if (CHECK_AX88796L_PORT(port))
|
|
||||||
return (void __iomem *)port88796l(port, size > 1);
|
|
||||||
else if (is_pci_ioaddr(port))
|
|
||||||
return (void __iomem *)pci_ioaddr(port);
|
|
||||||
|
|
||||||
return (void __iomem *)port;
|
|
||||||
}
|
|
|
@ -187,31 +187,7 @@ static void __init r7780rp_setup(char **cmdline_p)
|
||||||
struct sh_machine_vector mv_r7780rp __initmv = {
|
struct sh_machine_vector mv_r7780rp __initmv = {
|
||||||
.mv_name = "Highlander R7780RP-1",
|
.mv_name = "Highlander R7780RP-1",
|
||||||
.mv_setup = r7780rp_setup,
|
.mv_setup = r7780rp_setup,
|
||||||
|
|
||||||
.mv_nr_irqs = 109,
|
.mv_nr_irqs = 109,
|
||||||
|
|
||||||
.mv_inb = r7780rp_inb,
|
|
||||||
.mv_inw = r7780rp_inw,
|
|
||||||
.mv_inl = r7780rp_inl,
|
|
||||||
.mv_outb = r7780rp_outb,
|
|
||||||
.mv_outw = r7780rp_outw,
|
|
||||||
.mv_outl = r7780rp_outl,
|
|
||||||
|
|
||||||
.mv_inb_p = r7780rp_inb_p,
|
|
||||||
.mv_inw_p = r7780rp_inw,
|
|
||||||
.mv_inl_p = r7780rp_inl,
|
|
||||||
.mv_outb_p = r7780rp_outb_p,
|
|
||||||
.mv_outw_p = r7780rp_outw,
|
|
||||||
.mv_outl_p = r7780rp_outl,
|
|
||||||
|
|
||||||
.mv_insb = r7780rp_insb,
|
|
||||||
.mv_insw = r7780rp_insw,
|
|
||||||
.mv_insl = r7780rp_insl,
|
|
||||||
.mv_outsb = r7780rp_outsb,
|
|
||||||
.mv_outsw = r7780rp_outsw,
|
|
||||||
.mv_outsl = r7780rp_outsl,
|
|
||||||
|
|
||||||
.mv_ioport_map = r7780rp_ioport_map,
|
|
||||||
.mv_init_irq = init_r7780rp_IRQ,
|
.mv_init_irq = init_r7780rp_IRQ,
|
||||||
};
|
};
|
||||||
ALIAS_MV(r7780rp)
|
ALIAS_MV(r7780rp)
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/pata_platform.h>
|
#include <linux/pata_platform.h>
|
||||||
#include <linux/serial_8250.h>
|
#include <linux/serial_8250.h>
|
||||||
|
#include <linux/sm501.h>
|
||||||
#include <linux/pm.h>
|
#include <linux/pm.h>
|
||||||
#include <asm/machvec.h>
|
#include <asm/machvec.h>
|
||||||
#include <asm/rts7751r2d.h>
|
#include <asm/rts7751r2d.h>
|
||||||
|
@ -111,10 +112,35 @@ static struct platform_device heartbeat_device = {
|
||||||
.resource = heartbeat_resources,
|
.resource = heartbeat_resources,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct resource sm501_resources[] = {
|
||||||
|
[0] = {
|
||||||
|
.start = 0x10000000,
|
||||||
|
.end = 0x13e00000 - 1,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
[1] = {
|
||||||
|
.start = 0x13e00000,
|
||||||
|
.end = 0x13ffffff,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
[2] = {
|
||||||
|
.start = 32,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device sm501_device = {
|
||||||
|
.name = "sm501",
|
||||||
|
.id = -1,
|
||||||
|
.num_resources = ARRAY_SIZE(sm501_resources),
|
||||||
|
.resource = sm501_resources,
|
||||||
|
};
|
||||||
|
|
||||||
static struct platform_device *rts7751r2d_devices[] __initdata = {
|
static struct platform_device *rts7751r2d_devices[] __initdata = {
|
||||||
&uart_device,
|
&uart_device,
|
||||||
&heartbeat_device,
|
&heartbeat_device,
|
||||||
&cf_ide_device,
|
&cf_ide_device,
|
||||||
|
&sm501_device,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init rts7751r2d_devices_setup(void)
|
static int __init rts7751r2d_devices_setup(void)
|
||||||
|
|
|
@ -1,14 +1,13 @@
|
||||||
#
|
#
|
||||||
# Automatically generated make config: don't edit
|
# Automatically generated make config: don't edit
|
||||||
# Linux kernel version: 2.6.20
|
# Linux kernel version: 2.6.21-rc1
|
||||||
# Thu Feb 15 17:17:29 2007
|
# Thu Mar 1 16:42:40 2007
|
||||||
#
|
#
|
||||||
CONFIG_SUPERH=y
|
CONFIG_SUPERH=y
|
||||||
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
||||||
CONFIG_GENERIC_FIND_NEXT_BIT=y
|
CONFIG_GENERIC_FIND_NEXT_BIT=y
|
||||||
CONFIG_GENERIC_HWEIGHT=y
|
CONFIG_GENERIC_HWEIGHT=y
|
||||||
CONFIG_GENERIC_HARDIRQS=y
|
CONFIG_GENERIC_HARDIRQS=y
|
||||||
CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
|
|
||||||
CONFIG_GENERIC_IRQ_PROBE=y
|
CONFIG_GENERIC_IRQ_PROBE=y
|
||||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||||
# CONFIG_GENERIC_TIME is not set
|
# CONFIG_GENERIC_TIME is not set
|
||||||
|
@ -33,6 +32,7 @@ CONFIG_LOCALVERSION_AUTO=y
|
||||||
CONFIG_SWAP=y
|
CONFIG_SWAP=y
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
# CONFIG_IPC_NS is not set
|
# CONFIG_IPC_NS is not set
|
||||||
|
CONFIG_SYSVIPC_SYSCTL=y
|
||||||
# CONFIG_POSIX_MQUEUE is not set
|
# CONFIG_POSIX_MQUEUE is not set
|
||||||
# CONFIG_BSD_PROCESS_ACCT is not set
|
# CONFIG_BSD_PROCESS_ACCT is not set
|
||||||
# CONFIG_TASKSTATS is not set
|
# CONFIG_TASKSTATS is not set
|
||||||
|
@ -119,7 +119,6 @@ CONFIG_SH_RTS7751R2D=y
|
||||||
# CONFIG_SH_SHMIN is not set
|
# CONFIG_SH_SHMIN is not set
|
||||||
# CONFIG_SH_7206_SOLUTION_ENGINE is not set
|
# CONFIG_SH_7206_SOLUTION_ENGINE is not set
|
||||||
# CONFIG_SH_7619_SOLUTION_ENGINE is not set
|
# CONFIG_SH_7619_SOLUTION_ENGINE is not set
|
||||||
# CONFIG_SH_ASDAP310 is not set
|
|
||||||
# CONFIG_SH_UNKNOWN is not set
|
# CONFIG_SH_UNKNOWN is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -281,7 +280,7 @@ CONFIG_ZERO_PAGE_OFFSET=0x00010000
|
||||||
CONFIG_BOOT_LINK_OFFSET=0x00800000
|
CONFIG_BOOT_LINK_OFFSET=0x00800000
|
||||||
# CONFIG_UBC_WAKEUP is not set
|
# CONFIG_UBC_WAKEUP is not set
|
||||||
CONFIG_CMDLINE_BOOL=y
|
CONFIG_CMDLINE_BOOL=y
|
||||||
CONFIG_CMDLINE="console=ttySC0,115200 root=/dev/sda1"
|
CONFIG_CMDLINE="console=tty0 console=ttySC0,115200 root=/dev/sda1"
|
||||||
|
|
||||||
#
|
#
|
||||||
# Bus options
|
# Bus options
|
||||||
|
@ -433,6 +432,7 @@ CONFIG_FW_LOADER=m
|
||||||
#
|
#
|
||||||
# Plug and Play support
|
# Plug and Play support
|
||||||
#
|
#
|
||||||
|
# CONFIG_PNPACPI is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Block devices
|
# Block devices
|
||||||
|
@ -770,7 +770,26 @@ CONFIG_NET_WIRELESS=y
|
||||||
#
|
#
|
||||||
# Input device support
|
# Input device support
|
||||||
#
|
#
|
||||||
# CONFIG_INPUT is not set
|
CONFIG_INPUT=y
|
||||||
|
# CONFIG_INPUT_FF_MEMLESS is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Userland interfaces
|
||||||
|
#
|
||||||
|
# CONFIG_INPUT_MOUSEDEV is not set
|
||||||
|
# CONFIG_INPUT_JOYDEV is not set
|
||||||
|
# CONFIG_INPUT_TSDEV is not set
|
||||||
|
# CONFIG_INPUT_EVDEV is not set
|
||||||
|
# CONFIG_INPUT_EVBUG is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Input Device Drivers
|
||||||
|
#
|
||||||
|
# CONFIG_INPUT_KEYBOARD is not set
|
||||||
|
# CONFIG_INPUT_MOUSE is not set
|
||||||
|
# CONFIG_INPUT_JOYSTICK is not set
|
||||||
|
# CONFIG_INPUT_TOUCHSCREEN is not set
|
||||||
|
# CONFIG_INPUT_MISC is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Hardware I/O ports
|
# Hardware I/O ports
|
||||||
|
@ -781,7 +800,10 @@ CONFIG_NET_WIRELESS=y
|
||||||
#
|
#
|
||||||
# Character devices
|
# Character devices
|
||||||
#
|
#
|
||||||
# CONFIG_VT is not set
|
CONFIG_VT=y
|
||||||
|
CONFIG_VT_CONSOLE=y
|
||||||
|
CONFIG_HW_CONSOLE=y
|
||||||
|
CONFIG_VT_HW_CONSOLE_BINDING=y
|
||||||
# CONFIG_SERIAL_NONSTANDARD is not set
|
# CONFIG_SERIAL_NONSTANDARD is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -856,6 +878,11 @@ CONFIG_HWMON=y
|
||||||
# CONFIG_SENSORS_VT1211 is not set
|
# CONFIG_SENSORS_VT1211 is not set
|
||||||
# CONFIG_HWMON_DEBUG_CHIP is not set
|
# CONFIG_HWMON_DEBUG_CHIP is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Multifunction device drivers
|
||||||
|
#
|
||||||
|
CONFIG_MFD_SM501=y
|
||||||
|
|
||||||
#
|
#
|
||||||
# Multimedia devices
|
# Multimedia devices
|
||||||
#
|
#
|
||||||
|
@ -869,9 +896,66 @@ CONFIG_HWMON=y
|
||||||
#
|
#
|
||||||
# Graphics support
|
# Graphics support
|
||||||
#
|
#
|
||||||
CONFIG_FIRMWARE_EDID=y
|
|
||||||
# CONFIG_FB is not set
|
|
||||||
# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
|
# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
|
||||||
|
CONFIG_FB=y
|
||||||
|
# CONFIG_FIRMWARE_EDID is not set
|
||||||
|
# CONFIG_FB_DDC is not set
|
||||||
|
CONFIG_FB_CFB_FILLRECT=y
|
||||||
|
CONFIG_FB_CFB_COPYAREA=y
|
||||||
|
CONFIG_FB_CFB_IMAGEBLIT=y
|
||||||
|
# CONFIG_FB_SVGALIB is not set
|
||||||
|
# CONFIG_FB_MACMODES is not set
|
||||||
|
# CONFIG_FB_BACKLIGHT is not set
|
||||||
|
# CONFIG_FB_MODE_HELPERS is not set
|
||||||
|
# CONFIG_FB_TILEBLITTING is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Frambuffer hardware drivers
|
||||||
|
#
|
||||||
|
# CONFIG_FB_CIRRUS is not set
|
||||||
|
# CONFIG_FB_PM2 is not set
|
||||||
|
# CONFIG_FB_CYBER2000 is not set
|
||||||
|
# CONFIG_FB_ASILIANT is not set
|
||||||
|
# CONFIG_FB_IMSTT is not set
|
||||||
|
# CONFIG_FB_EPSON1355 is not set
|
||||||
|
# CONFIG_FB_S1D13XXX is not set
|
||||||
|
# CONFIG_FB_NVIDIA is not set
|
||||||
|
# CONFIG_FB_RIVA is not set
|
||||||
|
# CONFIG_FB_MATROX is not set
|
||||||
|
# CONFIG_FB_RADEON is not set
|
||||||
|
# CONFIG_FB_ATY128 is not set
|
||||||
|
# CONFIG_FB_ATY is not set
|
||||||
|
# CONFIG_FB_S3 is not set
|
||||||
|
# CONFIG_FB_SAVAGE is not set
|
||||||
|
# CONFIG_FB_SIS is not set
|
||||||
|
# CONFIG_FB_NEOMAGIC is not set
|
||||||
|
# CONFIG_FB_KYRO is not set
|
||||||
|
# CONFIG_FB_3DFX is not set
|
||||||
|
# CONFIG_FB_VOODOO1 is not set
|
||||||
|
# CONFIG_FB_TRIDENT is not set
|
||||||
|
CONFIG_FB_SM501=y
|
||||||
|
# CONFIG_FB_VIRTUAL is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Console display driver support
|
||||||
|
#
|
||||||
|
CONFIG_DUMMY_CONSOLE=y
|
||||||
|
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||||
|
# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
|
||||||
|
# CONFIG_FONTS is not set
|
||||||
|
CONFIG_FONT_8x8=y
|
||||||
|
CONFIG_FONT_8x16=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# Logo configuration
|
||||||
|
#
|
||||||
|
CONFIG_LOGO=y
|
||||||
|
# CONFIG_LOGO_LINUX_MONO is not set
|
||||||
|
# CONFIG_LOGO_LINUX_VGA16 is not set
|
||||||
|
# CONFIG_LOGO_LINUX_CLUT224 is not set
|
||||||
|
# CONFIG_LOGO_SUPERH_MONO is not set
|
||||||
|
# CONFIG_LOGO_SUPERH_VGA16 is not set
|
||||||
|
CONFIG_LOGO_SUPERH_CLUT224=y
|
||||||
|
|
||||||
#
|
#
|
||||||
# Sound
|
# Sound
|
||||||
|
@ -984,6 +1068,12 @@ CONFIG_SOUND_PRIME=m
|
||||||
# CONFIG_SOUND_VIA82CXXX is not set
|
# CONFIG_SOUND_VIA82CXXX is not set
|
||||||
CONFIG_AC97_BUS=m
|
CONFIG_AC97_BUS=m
|
||||||
|
|
||||||
|
#
|
||||||
|
# HID Devices
|
||||||
|
#
|
||||||
|
CONFIG_HID=y
|
||||||
|
# CONFIG_HID_DEBUG is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# USB support
|
# USB support
|
||||||
#
|
#
|
||||||
|
@ -1237,7 +1327,7 @@ CONFIG_LOG_BUF_SHIFT=14
|
||||||
CONFIG_EARLY_SCIF_CONSOLE=y
|
CONFIG_EARLY_SCIF_CONSOLE=y
|
||||||
CONFIG_EARLY_SCIF_CONSOLE_PORT=0xffe80000
|
CONFIG_EARLY_SCIF_CONSOLE_PORT=0xffe80000
|
||||||
CONFIG_EARLY_PRINTK=y
|
CONFIG_EARLY_PRINTK=y
|
||||||
# CONFIG_KGDB is not set
|
# CONFIG_SH_KGDB is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Security options
|
# Security options
|
||||||
|
|
|
@ -224,7 +224,7 @@ work_resched:
|
||||||
syscall_exit_work:
|
syscall_exit_work:
|
||||||
! r0: current_thread_info->flags
|
! r0: current_thread_info->flags
|
||||||
! r8: current_thread_info
|
! r8: current_thread_info
|
||||||
tst #_TIF_SYSCALL_TRACE, r0
|
tst #_TIF_SYSCALL_TRACE | _TIF_SINGLESTEP, r0
|
||||||
bt/s work_pending
|
bt/s work_pending
|
||||||
tst #_TIF_NEED_RESCHED, r0
|
tst #_TIF_NEED_RESCHED, r0
|
||||||
#ifdef CONFIG_TRACE_IRQFLAGS
|
#ifdef CONFIG_TRACE_IRQFLAGS
|
||||||
|
|
|
@ -14,7 +14,6 @@
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
#include <asm/machvec.h>
|
#include <asm/machvec.h>
|
||||||
#include <asm/cacheflush.h>
|
|
||||||
|
|
||||||
#ifdef CONFIG_CPU_SH3
|
#ifdef CONFIG_CPU_SH3
|
||||||
/* SH3 has a PCMCIA bug that needs a dummy read from area 6 for a
|
/* SH3 has a PCMCIA bug that needs a dummy read from area 6 for a
|
||||||
|
@ -96,7 +95,6 @@ void generic_insw(unsigned long port, void *dst, unsigned long count)
|
||||||
while (count--)
|
while (count--)
|
||||||
*buf++ = *port_addr;
|
*buf++ = *port_addr;
|
||||||
|
|
||||||
flush_dcache_all();
|
|
||||||
dummy_read();
|
dummy_read();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -171,7 +169,6 @@ void generic_outsw(unsigned long port, const void *src, unsigned long count)
|
||||||
while (count--)
|
while (count--)
|
||||||
*port_addr = *buf++;
|
*port_addr = *buf++;
|
||||||
|
|
||||||
flush_dcache_all();
|
|
||||||
dummy_read();
|
dummy_read();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -250,8 +250,7 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long usp,
|
||||||
childregs->regs[15] = usp;
|
childregs->regs[15] = usp;
|
||||||
ti->addr_limit = USER_DS;
|
ti->addr_limit = USER_DS;
|
||||||
} else {
|
} else {
|
||||||
childregs->regs[15] = (unsigned long)task_stack_page(p) +
|
childregs->regs[15] = (unsigned long)childregs;
|
||||||
THREAD_SIZE;
|
|
||||||
ti->addr_limit = KERNEL_DS;
|
ti->addr_limit = KERNEL_DS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,6 @@
|
||||||
* SuperH version: Copyright (C) 1999, 2000 Kaz Kojima & Niibe Yutaka
|
* SuperH version: Copyright (C) 1999, 2000 Kaz Kojima & Niibe Yutaka
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
|
@ -20,8 +19,7 @@
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/security.h>
|
#include <linux/security.h>
|
||||||
#include <linux/signal.h>
|
#include <linux/signal.h>
|
||||||
|
#include <linux/io.h>
|
||||||
#include <asm/io.h>
|
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
|
@ -59,6 +57,23 @@ static inline int put_stack_long(struct task_struct *task, int offset,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void ptrace_disable_singlestep(struct task_struct *child)
|
||||||
|
{
|
||||||
|
clear_tsk_thread_flag(child, TIF_SINGLESTEP);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Ensure the UBC is not programmed at the next context switch.
|
||||||
|
*
|
||||||
|
* Normally this is not needed but there are sequences such as
|
||||||
|
* singlestep, signal delivery, and continue that leave the
|
||||||
|
* ubc_pc non-zero leading to spurious SIGTRAPs.
|
||||||
|
*/
|
||||||
|
if (child->thread.ubc_pc != 0) {
|
||||||
|
ubc_usercnt -= 1;
|
||||||
|
child->thread.ubc_pc = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Called by kernel/ptrace.c when detaching..
|
* Called by kernel/ptrace.c when detaching..
|
||||||
*
|
*
|
||||||
|
@ -66,7 +81,7 @@ static inline int put_stack_long(struct task_struct *task, int offset,
|
||||||
*/
|
*/
|
||||||
void ptrace_disable(struct task_struct *child)
|
void ptrace_disable(struct task_struct *child)
|
||||||
{
|
{
|
||||||
/* nothing to do.. */
|
ptrace_disable_singlestep(child);
|
||||||
}
|
}
|
||||||
|
|
||||||
long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||||
|
@ -156,6 +171,9 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||||
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||||
else
|
else
|
||||||
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||||
|
|
||||||
|
ptrace_disable_singlestep(child);
|
||||||
|
|
||||||
child->exit_code = data;
|
child->exit_code = data;
|
||||||
wake_up_process(child);
|
wake_up_process(child);
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
@ -171,6 +189,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||||
ret = 0;
|
ret = 0;
|
||||||
if (child->exit_state == EXIT_ZOMBIE) /* already dead */
|
if (child->exit_state == EXIT_ZOMBIE) /* already dead */
|
||||||
break;
|
break;
|
||||||
|
ptrace_disable_singlestep(child);
|
||||||
child->exit_code = SIGKILL;
|
child->exit_code = SIGKILL;
|
||||||
wake_up_process(child);
|
wake_up_process(child);
|
||||||
break;
|
break;
|
||||||
|
@ -196,6 +215,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||||
ubc_usercnt += 1;
|
ubc_usercnt += 1;
|
||||||
child->thread.ubc_pc = pc;
|
child->thread.ubc_pc = pc;
|
||||||
|
|
||||||
|
set_tsk_thread_flag(child, TIF_SINGLESTEP);
|
||||||
child->exit_code = data;
|
child->exit_code = data;
|
||||||
/* give it a chance to run. */
|
/* give it a chance to run. */
|
||||||
wake_up_process(child);
|
wake_up_process(child);
|
||||||
|
@ -248,14 +268,15 @@ asmlinkage void do_syscall_trace(void)
|
||||||
{
|
{
|
||||||
struct task_struct *tsk = current;
|
struct task_struct *tsk = current;
|
||||||
|
|
||||||
if (!test_thread_flag(TIF_SYSCALL_TRACE))
|
if (!test_thread_flag(TIF_SYSCALL_TRACE) &&
|
||||||
|
!test_thread_flag(TIF_SINGLESTEP))
|
||||||
return;
|
return;
|
||||||
if (!(tsk->ptrace & PT_PTRACED))
|
if (!(tsk->ptrace & PT_PTRACED))
|
||||||
return;
|
return;
|
||||||
/* the 0x80 provides a way for the tracing parent to distinguish
|
/* the 0x80 provides a way for the tracing parent to distinguish
|
||||||
between a syscall stop and SIGTRAP delivery */
|
between a syscall stop and SIGTRAP delivery */
|
||||||
ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD)
|
ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) &&
|
||||||
? 0x80 : 0));
|
!test_thread_flag(TIF_SINGLESTEP) ? 0x80 : 0));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* this isn't the same as continuing with a signal, but it will do
|
* this isn't the same as continuing with a signal, but it will do
|
||||||
|
|
|
@ -589,6 +589,8 @@ static void do_signal(struct pt_regs *regs, unsigned int save_r0)
|
||||||
if (test_thread_flag(TIF_RESTORE_SIGMASK))
|
if (test_thread_flag(TIF_RESTORE_SIGMASK))
|
||||||
clear_thread_flag(TIF_RESTORE_SIGMASK);
|
clear_thread_flag(TIF_RESTORE_SIGMASK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
no_signal:
|
no_signal:
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
* Written by Niibe Yutaka
|
* Written by Niibe Yutaka
|
||||||
*/
|
*/
|
||||||
#include <asm/thread_info.h>
|
#include <asm/thread_info.h>
|
||||||
|
#include <asm/cache.h>
|
||||||
#include <asm-generic/vmlinux.lds.h>
|
#include <asm-generic/vmlinux.lds.h>
|
||||||
|
|
||||||
#ifdef CONFIG_CPU_LITTLE_ENDIAN
|
#ifdef CONFIG_CPU_LITTLE_ENDIAN
|
||||||
|
@ -53,7 +54,7 @@ SECTIONS
|
||||||
. = ALIGN(PAGE_SIZE);
|
. = ALIGN(PAGE_SIZE);
|
||||||
.data.page_aligned : { *(.data.page_aligned) }
|
.data.page_aligned : { *(.data.page_aligned) }
|
||||||
|
|
||||||
. = ALIGN(32);
|
. = ALIGN(L1_CACHE_BYTES);
|
||||||
__per_cpu_start = .;
|
__per_cpu_start = .;
|
||||||
.data.percpu : { *(.data.percpu) }
|
.data.percpu : { *(.data.percpu) }
|
||||||
__per_cpu_end = .;
|
__per_cpu_end = .;
|
||||||
|
|
|
@ -237,20 +237,10 @@ static inline void flush_cache_4096(unsigned long start,
|
||||||
/*
|
/*
|
||||||
* Write back & invalidate the D-cache of the page.
|
* Write back & invalidate the D-cache of the page.
|
||||||
* (To avoid "alias" issues)
|
* (To avoid "alias" issues)
|
||||||
*
|
|
||||||
* This uses a lazy write-back on UP, which is explicitly
|
|
||||||
* disabled on SMP.
|
|
||||||
*/
|
*/
|
||||||
void flush_dcache_page(struct page *page)
|
void flush_dcache_page(struct page *page)
|
||||||
{
|
{
|
||||||
#ifndef CONFIG_SMP
|
if (test_bit(PG_mapped, &page->flags)) {
|
||||||
struct address_space *mapping = page_mapping(page);
|
|
||||||
|
|
||||||
if (mapping && !mapping_mapped(mapping))
|
|
||||||
set_bit(PG_dcache_dirty, &page->flags);
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
unsigned long phys = PHYSADDR(page_address(page));
|
unsigned long phys = PHYSADDR(page_address(page));
|
||||||
unsigned long addr = CACHE_OC_ADDRESS_ARRAY;
|
unsigned long addr = CACHE_OC_ADDRESS_ARRAY;
|
||||||
int i, n;
|
int i, n;
|
||||||
|
|
|
@ -3,11 +3,11 @@
|
||||||
*
|
*
|
||||||
* Copyright (C) 1999, 2000 Niibe Yutaka
|
* Copyright (C) 1999, 2000 Niibe Yutaka
|
||||||
* Copyright (C) 2004 Alex Song
|
* Copyright (C) 2004 Alex Song
|
||||||
* Copyright (C) 2006 Paul Mundt
|
|
||||||
*
|
*
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
* 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
|
* License. See the file "COPYING" in the main directory of this archive
|
||||||
* for more details.
|
* for more details.
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/mman.h>
|
#include <linux/mman.h>
|
||||||
|
@ -51,6 +51,7 @@ static inline void cache_wback_all(void)
|
||||||
|
|
||||||
if ((data & v) == v)
|
if ((data & v) == v)
|
||||||
ctrl_outl(data & ~v, addr);
|
ctrl_outl(data & ~v, addr);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
addrstart += current_cpu_data.dcache.way_incr;
|
addrstart += current_cpu_data.dcache.way_incr;
|
||||||
|
@ -127,11 +128,7 @@ static void __flush_dcache_page(unsigned long phys)
|
||||||
*/
|
*/
|
||||||
void flush_dcache_page(struct page *page)
|
void flush_dcache_page(struct page *page)
|
||||||
{
|
{
|
||||||
struct address_space *mapping = page_mapping(page);
|
if (test_bit(PG_mapped, &page->flags))
|
||||||
|
|
||||||
if (mapping && !mapping_mapped(mapping))
|
|
||||||
set_bit(PG_dcache_dirty, &page->flags);
|
|
||||||
else
|
|
||||||
__flush_dcache_page(PHYSADDR(page_address(page)));
|
__flush_dcache_page(PHYSADDR(page_address(page)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,7 @@ extern struct mutex p3map_mutex[];
|
||||||
*/
|
*/
|
||||||
void clear_user_page(void *to, unsigned long address, struct page *page)
|
void clear_user_page(void *to, unsigned long address, struct page *page)
|
||||||
{
|
{
|
||||||
|
__set_bit(PG_mapped, &page->flags);
|
||||||
if (((address ^ (unsigned long)to) & CACHE_ALIAS) == 0)
|
if (((address ^ (unsigned long)to) & CACHE_ALIAS) == 0)
|
||||||
clear_page(to);
|
clear_page(to);
|
||||||
else {
|
else {
|
||||||
|
@ -58,6 +59,7 @@ void clear_user_page(void *to, unsigned long address, struct page *page)
|
||||||
void copy_user_page(void *to, void *from, unsigned long address,
|
void copy_user_page(void *to, void *from, unsigned long address,
|
||||||
struct page *page)
|
struct page *page)
|
||||||
{
|
{
|
||||||
|
__set_bit(PG_mapped, &page->flags);
|
||||||
if (((address ^ (unsigned long)to) & CACHE_ALIAS) == 0)
|
if (((address ^ (unsigned long)to) & CACHE_ALIAS) == 0)
|
||||||
copy_page(to, from);
|
copy_page(to, from);
|
||||||
else {
|
else {
|
||||||
|
@ -82,3 +84,23 @@ void copy_user_page(void *to, void *from, unsigned long address,
|
||||||
mutex_unlock(&p3map_mutex[(address & CACHE_ALIAS)>>12]);
|
mutex_unlock(&p3map_mutex[(address & CACHE_ALIAS)>>12]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For SH-4, we have our own implementation for ptep_get_and_clear
|
||||||
|
*/
|
||||||
|
inline pte_t ptep_get_and_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
|
||||||
|
{
|
||||||
|
pte_t pte = *ptep;
|
||||||
|
|
||||||
|
pte_clear(mm, addr, ptep);
|
||||||
|
if (!pte_not_present(pte)) {
|
||||||
|
unsigned long pfn = pte_pfn(pte);
|
||||||
|
if (pfn_valid(pfn)) {
|
||||||
|
struct page *page = pfn_to_page(pfn);
|
||||||
|
struct address_space *mapping = page_mapping(page);
|
||||||
|
if (!mapping || !mapping_writably_mapped(mapping))
|
||||||
|
__clear_bit(PG_mapped, &page->flags);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return pte;
|
||||||
|
}
|
||||||
|
|
|
@ -7,7 +7,9 @@
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
* 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
|
* License. See the file "COPYING" in the main directory of this archive
|
||||||
* for more details.
|
* for more details.
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/mman.h>
|
#include <linux/mman.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
|
@ -74,6 +76,7 @@ void clear_user_page(void *to, unsigned long address, struct page *pg)
|
||||||
{
|
{
|
||||||
struct page *page = virt_to_page(to);
|
struct page *page = virt_to_page(to);
|
||||||
|
|
||||||
|
__set_bit(PG_mapped, &page->flags);
|
||||||
if (((address ^ (unsigned long)to) & CACHE_ALIAS) == 0) {
|
if (((address ^ (unsigned long)to) & CACHE_ALIAS) == 0) {
|
||||||
clear_page(to);
|
clear_page(to);
|
||||||
__flush_wback_region(to, PAGE_SIZE);
|
__flush_wback_region(to, PAGE_SIZE);
|
||||||
|
@ -92,11 +95,12 @@ void clear_user_page(void *to, unsigned long address, struct page *pg)
|
||||||
* @from: P1 address
|
* @from: P1 address
|
||||||
* @address: U0 address to be mapped
|
* @address: U0 address to be mapped
|
||||||
*/
|
*/
|
||||||
void copy_user_page(void *to, void *from, unsigned long address,
|
void copy_user_page(void *to, void *from, unsigned long address, struct page *pg)
|
||||||
struct page *pg)
|
|
||||||
{
|
{
|
||||||
struct page *page = virt_to_page(to);
|
struct page *page = virt_to_page(to);
|
||||||
|
|
||||||
|
|
||||||
|
__set_bit(PG_mapped, &page->flags);
|
||||||
if (((address ^ (unsigned long)to) & CACHE_ALIAS) == 0) {
|
if (((address ^ (unsigned long)to) & CACHE_ALIAS) == 0) {
|
||||||
copy_page(to, from);
|
copy_page(to, from);
|
||||||
__flush_wback_region(to, PAGE_SIZE);
|
__flush_wback_region(to, PAGE_SIZE);
|
||||||
|
@ -108,3 +112,26 @@ void copy_user_page(void *to, void *from, unsigned long address,
|
||||||
__flush_wback_region(to, PAGE_SIZE);
|
__flush_wback_region(to, PAGE_SIZE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For SH7705, we have our own implementation for ptep_get_and_clear
|
||||||
|
* Copied from pg-sh4.c
|
||||||
|
*/
|
||||||
|
inline pte_t ptep_get_and_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
|
||||||
|
{
|
||||||
|
pte_t pte = *ptep;
|
||||||
|
|
||||||
|
pte_clear(mm, addr, ptep);
|
||||||
|
if (!pte_not_present(pte)) {
|
||||||
|
unsigned long pfn = pte_pfn(pte);
|
||||||
|
if (pfn_valid(pfn)) {
|
||||||
|
struct page *page = pfn_to_page(pfn);
|
||||||
|
struct address_space *mapping = page_mapping(page);
|
||||||
|
if (!mapping || !mapping_writably_mapped(mapping))
|
||||||
|
__clear_bit(PG_mapped, &page->flags);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return pte;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,17 +2,15 @@
|
||||||
* TLB flushing operations for SH with an MMU.
|
* TLB flushing operations for SH with an MMU.
|
||||||
*
|
*
|
||||||
* Copyright (C) 1999 Niibe Yutaka
|
* Copyright (C) 1999 Niibe Yutaka
|
||||||
* Copyright (C) 2003 - 2006 Paul Mundt
|
* Copyright (C) 2003 Paul Mundt
|
||||||
*
|
*
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
* 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
|
* License. See the file "COPYING" in the main directory of this archive
|
||||||
* for more details.
|
* for more details.
|
||||||
*/
|
*/
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/io.h>
|
|
||||||
#include <asm/mmu_context.h>
|
#include <asm/mmu_context.h>
|
||||||
#include <asm/tlbflush.h>
|
#include <asm/tlbflush.h>
|
||||||
#include <asm/cacheflush.h>
|
|
||||||
|
|
||||||
void local_flush_tlb_page(struct vm_area_struct *vma, unsigned long page)
|
void local_flush_tlb_page(struct vm_area_struct *vma, unsigned long page)
|
||||||
{
|
{
|
||||||
|
@ -140,54 +138,3 @@ void local_flush_tlb_all(void)
|
||||||
ctrl_barrier();
|
ctrl_barrier();
|
||||||
local_irq_restore(flags);
|
local_irq_restore(flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
void update_mmu_cache(struct vm_area_struct *vma,
|
|
||||||
unsigned long address, pte_t pte)
|
|
||||||
{
|
|
||||||
unsigned long flags;
|
|
||||||
unsigned long pteval;
|
|
||||||
unsigned long vpn;
|
|
||||||
struct page *page;
|
|
||||||
unsigned long pfn = pte_pfn(pte);
|
|
||||||
struct address_space *mapping;
|
|
||||||
|
|
||||||
if (!pfn_valid(pfn))
|
|
||||||
return;
|
|
||||||
|
|
||||||
page = pfn_to_page(pfn);
|
|
||||||
mapping = page_mapping(page);
|
|
||||||
if (mapping) {
|
|
||||||
unsigned long phys = pte_val(pte) & PTE_PHYS_MASK;
|
|
||||||
int dirty = test_and_clear_bit(PG_dcache_dirty, &page->flags);
|
|
||||||
|
|
||||||
if (dirty)
|
|
||||||
__flush_wback_region((void *)P1SEGADDR(phys),
|
|
||||||
PAGE_SIZE);
|
|
||||||
}
|
|
||||||
|
|
||||||
local_irq_save(flags);
|
|
||||||
|
|
||||||
/* Set PTEH register */
|
|
||||||
vpn = (address & MMU_VPN_MASK) | get_asid();
|
|
||||||
ctrl_outl(vpn, MMU_PTEH);
|
|
||||||
|
|
||||||
pteval = pte_val(pte);
|
|
||||||
|
|
||||||
#ifdef CONFIG_CPU_HAS_PTEA
|
|
||||||
/* Set PTEA register */
|
|
||||||
/* TODO: make this look less hacky */
|
|
||||||
ctrl_outl(((pteval >> 28) & 0xe) | (pteval & 0x1), MMU_PTEA);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Set PTEL register */
|
|
||||||
pteval &= _PAGE_FLAGS_HARDWARE_MASK; /* drop software flags */
|
|
||||||
#if defined(CONFIG_SH_WRITETHROUGH) && defined(CONFIG_CPU_SH4)
|
|
||||||
pteval |= _PAGE_WT;
|
|
||||||
#endif
|
|
||||||
/* conveniently, we want all the software flags to be 0 anyway */
|
|
||||||
ctrl_outl(pteval, MMU_PTEL);
|
|
||||||
|
|
||||||
/* Load the TLB */
|
|
||||||
asm volatile("ldtlb": /* no output */ : /* no input */ : "memory");
|
|
||||||
local_irq_restore(flags);
|
|
||||||
}
|
|
||||||
|
|
|
@ -8,9 +8,69 @@
|
||||||
*
|
*
|
||||||
* Released under the terms of the GNU GPL v2.0.
|
* Released under the terms of the GNU GPL v2.0.
|
||||||
*/
|
*/
|
||||||
#include <linux/io.h>
|
#include <linux/signal.h>
|
||||||
|
#include <linux/sched.h>
|
||||||
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/errno.h>
|
||||||
|
#include <linux/string.h>
|
||||||
|
#include <linux/types.h>
|
||||||
|
#include <linux/ptrace.h>
|
||||||
|
#include <linux/mman.h>
|
||||||
|
#include <linux/mm.h>
|
||||||
|
#include <linux/smp.h>
|
||||||
|
#include <linux/smp_lock.h>
|
||||||
|
#include <linux/interrupt.h>
|
||||||
|
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
|
#include <asm/io.h>
|
||||||
|
#include <asm/uaccess.h>
|
||||||
|
#include <asm/pgalloc.h>
|
||||||
#include <asm/mmu_context.h>
|
#include <asm/mmu_context.h>
|
||||||
|
#include <asm/cacheflush.h>
|
||||||
|
|
||||||
|
void update_mmu_cache(struct vm_area_struct * vma,
|
||||||
|
unsigned long address, pte_t pte)
|
||||||
|
{
|
||||||
|
unsigned long flags;
|
||||||
|
unsigned long pteval;
|
||||||
|
unsigned long vpn;
|
||||||
|
|
||||||
|
/* Ptrace may call this routine. */
|
||||||
|
if (vma && current->active_mm != vma->vm_mm)
|
||||||
|
return;
|
||||||
|
|
||||||
|
#if defined(CONFIG_SH7705_CACHE_32KB)
|
||||||
|
{
|
||||||
|
struct page *page = pte_page(pte);
|
||||||
|
unsigned long pfn = pte_pfn(pte);
|
||||||
|
|
||||||
|
if (pfn_valid(pfn) && !test_bit(PG_mapped, &page->flags)) {
|
||||||
|
unsigned long phys = pte_val(pte) & PTE_PHYS_MASK;
|
||||||
|
|
||||||
|
__flush_wback_region((void *)P1SEGADDR(phys),
|
||||||
|
PAGE_SIZE);
|
||||||
|
__set_bit(PG_mapped, &page->flags);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
local_irq_save(flags);
|
||||||
|
|
||||||
|
/* Set PTEH register */
|
||||||
|
vpn = (address & MMU_VPN_MASK) | get_asid();
|
||||||
|
ctrl_outl(vpn, MMU_PTEH);
|
||||||
|
|
||||||
|
pteval = pte_val(pte);
|
||||||
|
|
||||||
|
/* Set PTEL register */
|
||||||
|
pteval &= _PAGE_FLAGS_HARDWARE_MASK; /* drop software flags */
|
||||||
|
/* conveniently, we want all the software flags to be 0 anyway */
|
||||||
|
ctrl_outl(pteval, MMU_PTEL);
|
||||||
|
|
||||||
|
/* Load the TLB */
|
||||||
|
asm volatile("ldtlb": /* no output */ : /* no input */ : "memory");
|
||||||
|
local_irq_restore(flags);
|
||||||
|
}
|
||||||
|
|
||||||
void local_flush_tlb_one(unsigned long asid, unsigned long page)
|
void local_flush_tlb_one(unsigned long asid, unsigned long page)
|
||||||
{
|
{
|
||||||
|
@ -34,3 +94,4 @@ void local_flush_tlb_one(unsigned long asid, unsigned long page)
|
||||||
for (i = 0; i < ways; i++)
|
for (i = 0; i < ways; i++)
|
||||||
ctrl_outl(data, addr + (i << 8));
|
ctrl_outl(data, addr + (i << 8));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,9 +8,74 @@
|
||||||
*
|
*
|
||||||
* Released under the terms of the GNU GPL v2.0.
|
* Released under the terms of the GNU GPL v2.0.
|
||||||
*/
|
*/
|
||||||
#include <linux/io.h>
|
#include <linux/signal.h>
|
||||||
|
#include <linux/sched.h>
|
||||||
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/errno.h>
|
||||||
|
#include <linux/string.h>
|
||||||
|
#include <linux/types.h>
|
||||||
|
#include <linux/ptrace.h>
|
||||||
|
#include <linux/mman.h>
|
||||||
|
#include <linux/mm.h>
|
||||||
|
#include <linux/smp.h>
|
||||||
|
#include <linux/smp_lock.h>
|
||||||
|
#include <linux/interrupt.h>
|
||||||
|
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
|
#include <asm/io.h>
|
||||||
|
#include <asm/uaccess.h>
|
||||||
|
#include <asm/pgalloc.h>
|
||||||
#include <asm/mmu_context.h>
|
#include <asm/mmu_context.h>
|
||||||
|
#include <asm/cacheflush.h>
|
||||||
|
|
||||||
|
void update_mmu_cache(struct vm_area_struct * vma,
|
||||||
|
unsigned long address, pte_t pte)
|
||||||
|
{
|
||||||
|
unsigned long flags;
|
||||||
|
unsigned long pteval;
|
||||||
|
unsigned long vpn;
|
||||||
|
struct page *page;
|
||||||
|
unsigned long pfn;
|
||||||
|
|
||||||
|
/* Ptrace may call this routine. */
|
||||||
|
if (vma && current->active_mm != vma->vm_mm)
|
||||||
|
return;
|
||||||
|
|
||||||
|
pfn = pte_pfn(pte);
|
||||||
|
if (pfn_valid(pfn)) {
|
||||||
|
page = pfn_to_page(pfn);
|
||||||
|
if (!test_bit(PG_mapped, &page->flags)) {
|
||||||
|
unsigned long phys = pte_val(pte) & PTE_PHYS_MASK;
|
||||||
|
__flush_wback_region((void *)P1SEGADDR(phys), PAGE_SIZE);
|
||||||
|
__set_bit(PG_mapped, &page->flags);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
local_irq_save(flags);
|
||||||
|
|
||||||
|
/* Set PTEH register */
|
||||||
|
vpn = (address & MMU_VPN_MASK) | get_asid();
|
||||||
|
ctrl_outl(vpn, MMU_PTEH);
|
||||||
|
|
||||||
|
pteval = pte_val(pte);
|
||||||
|
|
||||||
|
/* Set PTEA register */
|
||||||
|
if (cpu_data->flags & CPU_HAS_PTEA)
|
||||||
|
/* TODO: make this look less hacky */
|
||||||
|
ctrl_outl(((pteval >> 28) & 0xe) | (pteval & 0x1), MMU_PTEA);
|
||||||
|
|
||||||
|
/* Set PTEL register */
|
||||||
|
pteval &= _PAGE_FLAGS_HARDWARE_MASK; /* drop software flags */
|
||||||
|
#ifdef CONFIG_SH_WRITETHROUGH
|
||||||
|
pteval |= _PAGE_WT;
|
||||||
|
#endif
|
||||||
|
/* conveniently, we want all the software flags to be 0 anyway */
|
||||||
|
ctrl_outl(pteval, MMU_PTEL);
|
||||||
|
|
||||||
|
/* Load the TLB */
|
||||||
|
asm volatile("ldtlb": /* no output */ : /* no input */ : "memory");
|
||||||
|
local_irq_restore(flags);
|
||||||
|
}
|
||||||
|
|
||||||
void local_flush_tlb_one(unsigned long asid, unsigned long page)
|
void local_flush_tlb_one(unsigned long asid, unsigned long page)
|
||||||
{
|
{
|
||||||
|
@ -28,3 +93,4 @@ void local_flush_tlb_one(unsigned long asid, unsigned long page)
|
||||||
ctrl_outl(data, addr);
|
ctrl_outl(data, addr);
|
||||||
back_to_P1();
|
back_to_P1();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
|
|
||||||
#define L1_CACHE_ALIGN(x) (((x)+(L1_CACHE_BYTES-1))&~(L1_CACHE_BYTES-1))
|
#define L1_CACHE_ALIGN(x) (((x)+(L1_CACHE_BYTES-1))&~(L1_CACHE_BYTES-1))
|
||||||
|
|
||||||
|
#ifndef __ASSEMBLY__
|
||||||
struct cache_info {
|
struct cache_info {
|
||||||
unsigned int ways; /* Number of cache ways */
|
unsigned int ways; /* Number of cache ways */
|
||||||
unsigned int sets; /* Number of cache sets */
|
unsigned int sets; /* Number of cache sets */
|
||||||
|
@ -47,6 +48,6 @@ struct cache_info {
|
||||||
|
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
};
|
};
|
||||||
|
#endif /* __ASSEMBLY__ */
|
||||||
#endif /* __KERNEL__ */
|
#endif /* __KERNEL__ */
|
||||||
#endif /* __ASM_SH_CACHE_H */
|
#endif /* __ASM_SH_CACHE_H */
|
||||||
|
|
|
@ -30,8 +30,5 @@ extern void __flush_invalidate_region(void *start, int size);
|
||||||
|
|
||||||
#define HAVE_ARCH_UNMAPPED_AREA
|
#define HAVE_ARCH_UNMAPPED_AREA
|
||||||
|
|
||||||
/* Page flag for lazy dcache write-back for the aliasing UP caches */
|
|
||||||
#define PG_dcache_dirty PG_arch_1
|
|
||||||
|
|
||||||
#endif /* __KERNEL__ */
|
#endif /* __KERNEL__ */
|
||||||
#endif /* __ASM_SH_CACHEFLUSH_H */
|
#endif /* __ASM_SH_CACHEFLUSH_H */
|
||||||
|
|
|
@ -36,6 +36,8 @@
|
||||||
/* 32KB cache, 4kb PAGE sizes need to check bit 12 */
|
/* 32KB cache, 4kb PAGE sizes need to check bit 12 */
|
||||||
#define CACHE_ALIAS 0x00001000
|
#define CACHE_ALIAS 0x00001000
|
||||||
|
|
||||||
|
#define PG_mapped PG_arch_1
|
||||||
|
|
||||||
void flush_cache_all(void);
|
void flush_cache_all(void);
|
||||||
void flush_cache_mm(struct mm_struct *mm);
|
void flush_cache_mm(struct mm_struct *mm);
|
||||||
#define flush_cache_dup_mm(mm) flush_cache_mm(mm)
|
#define flush_cache_dup_mm(mm) flush_cache_mm(mm)
|
||||||
|
|
|
@ -39,4 +39,6 @@ void flush_icache_user_range(struct vm_area_struct *vma, struct page *page,
|
||||||
/* Initialization of P3 area for copy_user_page */
|
/* Initialization of P3 area for copy_user_page */
|
||||||
void p3_cache_init(void);
|
void p3_cache_init(void);
|
||||||
|
|
||||||
|
#define PG_mapped PG_arch_1
|
||||||
|
|
||||||
#endif /* __ASM_CPU_SH4_CACHEFLUSH_H */
|
#endif /* __ASM_CPU_SH4_CACHEFLUSH_H */
|
||||||
|
|
|
@ -583,6 +583,11 @@ struct mm_struct;
|
||||||
extern unsigned int kobjsize(const void *objp);
|
extern unsigned int kobjsize(const void *objp);
|
||||||
#endif /* !CONFIG_MMU */
|
#endif /* !CONFIG_MMU */
|
||||||
|
|
||||||
|
#if defined(CONFIG_CPU_SH4) || defined(CONFIG_SH7705_CACHE_32KB)
|
||||||
|
#define __HAVE_ARCH_PTEP_GET_AND_CLEAR
|
||||||
|
extern pte_t ptep_get_and_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep);
|
||||||
|
#endif
|
||||||
|
|
||||||
extern pgd_t swapper_pg_dir[PTRS_PER_PGD];
|
extern pgd_t swapper_pg_dir[PTRS_PER_PGD];
|
||||||
extern void paging_init(void);
|
extern void paging_init(void);
|
||||||
|
|
||||||
|
|
|
@ -111,6 +111,7 @@ static inline struct thread_info *current_thread_info(void)
|
||||||
#define TIF_SIGPENDING 2 /* signal pending */
|
#define TIF_SIGPENDING 2 /* signal pending */
|
||||||
#define TIF_NEED_RESCHED 3 /* rescheduling necessary */
|
#define TIF_NEED_RESCHED 3 /* rescheduling necessary */
|
||||||
#define TIF_RESTORE_SIGMASK 4 /* restore signal mask in do_signal() */
|
#define TIF_RESTORE_SIGMASK 4 /* restore signal mask in do_signal() */
|
||||||
|
#define TIF_SINGLESTEP 5 /* singlestepping active */
|
||||||
#define TIF_USEDFPU 16 /* FPU was used by this task this quantum (SMP) */
|
#define TIF_USEDFPU 16 /* FPU was used by this task this quantum (SMP) */
|
||||||
#define TIF_POLLING_NRFLAG 17 /* true if poll_idle() is polling TIF_NEED_RESCHED */
|
#define TIF_POLLING_NRFLAG 17 /* true if poll_idle() is polling TIF_NEED_RESCHED */
|
||||||
#define TIF_MEMDIE 18
|
#define TIF_MEMDIE 18
|
||||||
|
@ -121,6 +122,7 @@ static inline struct thread_info *current_thread_info(void)
|
||||||
#define _TIF_SIGPENDING (1<<TIF_SIGPENDING)
|
#define _TIF_SIGPENDING (1<<TIF_SIGPENDING)
|
||||||
#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED)
|
#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED)
|
||||||
#define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK)
|
#define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK)
|
||||||
|
#define _TIF_SINGLESTEP (1<<TIF_SINGLESTEP)
|
||||||
#define _TIF_USEDFPU (1<<TIF_USEDFPU)
|
#define _TIF_USEDFPU (1<<TIF_USEDFPU)
|
||||||
#define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG)
|
#define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG)
|
||||||
#define _TIF_FREEZE (1<<TIF_FREEZE)
|
#define _TIF_FREEZE (1<<TIF_FREEZE)
|
||||||
|
|
|
@ -846,7 +846,8 @@ static ctl_table vm_table[] = {
|
||||||
.extra2 = &one_hundred,
|
.extra2 = &one_hundred,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_X86_32
|
#if defined(CONFIG_X86_32) || \
|
||||||
|
(defined(CONFIG_SUPERH) && defined(CONFIG_VSYSCALL))
|
||||||
{
|
{
|
||||||
.ctl_name = VM_VDSO_ENABLED,
|
.ctl_name = VM_VDSO_ENABLED,
|
||||||
.procname = "vdso_enabled",
|
.procname = "vdso_enabled",
|
||||||
|
|
Loading…
Add table
Reference in a new issue