Merge with /pub/scm/linux/kernel/git/torvalds/linux-2.6.git
This commit is contained in:
commit
1b98a8221e
|
@ -133,3 +133,32 @@ hardware and it is important to prevent the kernel from attempting to directly
|
|||
access these devices too, as if the array controller were merely a SCSI
|
||||
controller in the same way that we are allowing it to access SCSI tape drives.
|
||||
|
||||
SCSI error handling for tape drives and medium changers
|
||||
-------------------------------------------------------
|
||||
|
||||
The linux SCSI mid layer provides an error handling protocol which
|
||||
kicks into gear whenever a SCSI command fails to complete within a
|
||||
certain amount of time (which can vary depending on the command).
|
||||
The cciss driver participates in this protocol to some extent. The
|
||||
normal protocol is a four step process. First the device is told
|
||||
to abort the command. If that doesn't work, the device is reset.
|
||||
If that doesn't work, the SCSI bus is reset. If that doesn't work
|
||||
the host bus adapter is reset. Because the cciss driver is a block
|
||||
driver as well as a SCSI driver and only the tape drives and medium
|
||||
changers are presented to the SCSI mid layer, and unlike more
|
||||
straightforward SCSI drivers, disk i/o continues through the block
|
||||
side during the SCSI error recovery process, the cciss driver only
|
||||
implements the first two of these actions, aborting the command, and
|
||||
resetting the device. Additionally, most tape drives will not oblige
|
||||
in aborting commands, and sometimes it appears they will not even
|
||||
obey a reset coommand, though in most circumstances they will. In
|
||||
the case that the command cannot be aborted and the device cannot be
|
||||
reset, the device will be set offline.
|
||||
|
||||
In the event the error handling code is triggered and a tape drive is
|
||||
successfully reset or the tardy command is successfully aborted, the
|
||||
tape drive may still not allow i/o to continue until some command
|
||||
is issued which positions the tape to a known position. Typically you
|
||||
must rewind the tape (by issuing "mt -f /dev/st0 rewind" for example)
|
||||
before i/o can proceed again to a tape drive which was reset.
|
||||
|
||||
|
|
|
@ -28,7 +28,7 @@ the image from specifications.
|
|||
CPIO ARCHIVE method
|
||||
|
||||
You can create a cpio archive that contains the early userspace image.
|
||||
Youre cpio archive should be specified in CONFIG_INITRAMFS_SOURCE and it
|
||||
Your cpio archive should be specified in CONFIG_INITRAMFS_SOURCE and it
|
||||
will be used directly. Only a single cpio file may be specified in
|
||||
CONFIG_INITRAMFS_SOURCE and directory and file names are not allowed in
|
||||
combination with a cpio archive.
|
||||
|
|
|
@ -78,6 +78,11 @@ inet_peer_gc_maxtime - INTEGER
|
|||
|
||||
TCP variables:
|
||||
|
||||
tcp_abc - INTEGER
|
||||
Controls Appropriate Byte Count defined in RFC3465. If set to
|
||||
0 then does congestion avoid once per ack. 1 is conservative
|
||||
value, and 2 is more agressive.
|
||||
|
||||
tcp_syn_retries - INTEGER
|
||||
Number of times initial SYNs for an active TCP connection attempt
|
||||
will be retransmitted. Should not be higher than 255. Default value
|
||||
|
|
|
@ -52,8 +52,6 @@ ppa.txt
|
|||
- info on driver for IOmega zip drive
|
||||
qlogicfas.txt
|
||||
- info on driver for QLogic FASxxx based adapters
|
||||
qlogicisp.txt
|
||||
- info on driver for QLogic ISP 1020 based adapters
|
||||
scsi-generic.txt
|
||||
- info on the sg driver for generic (non-disk/CD/tape) SCSI devices.
|
||||
scsi.txt
|
||||
|
|
|
@ -11,8 +11,7 @@ Qlogic boards:
|
|||
* IQ-PCI-10
|
||||
* IQ-PCI-D
|
||||
|
||||
is provided by the qlogicisp.c driver. Check README.qlogicisp for
|
||||
details.
|
||||
is provided by the qla1280 driver.
|
||||
|
||||
Nor does it support the PCI-Basic, which is supported by the
|
||||
'am53c974' driver.
|
||||
|
|
|
@ -1,30 +0,0 @@
|
|||
Notes for the QLogic ISP1020 PCI SCSI Driver:
|
||||
|
||||
This driver works well in practice, but does not support disconnect/
|
||||
reconnect, which makes using it with tape drives impractical.
|
||||
|
||||
It should work for most host adaptors with the ISP1020 chip. The
|
||||
QLogic Corporation produces several PCI SCSI adapters which should
|
||||
work:
|
||||
|
||||
* IQ-PCI
|
||||
* IQ-PCI-10
|
||||
* IQ-PCI-D
|
||||
|
||||
This driver may work with boards containing the ISP1020A or ISP1040A
|
||||
chips, but that has not been tested.
|
||||
|
||||
This driver will NOT work with:
|
||||
|
||||
* ISA or VL Bus Qlogic cards (they use the 'qlogicfas' driver)
|
||||
* PCI-basic (it uses the 'am53c974' driver)
|
||||
|
||||
Much thanks to QLogic's tech support for providing the latest ISP1020
|
||||
firmware, and for taking the time to review my code.
|
||||
|
||||
Erik Moe
|
||||
ehm@cris.com
|
||||
|
||||
Revised:
|
||||
Michael A. Griffith
|
||||
grif@cs.ucr.edu
|
|
@ -83,11 +83,11 @@ with the command.
|
|||
The timeout handler is scsi_times_out(). When a timeout occurs, this
|
||||
function
|
||||
|
||||
1. invokes optional hostt->eh_timedout() callback. Return value can
|
||||
1. invokes optional hostt->eh_timed_out() callback. Return value can
|
||||
be one of
|
||||
|
||||
- EH_HANDLED
|
||||
This indicates that eh_timedout() dealt with the timeout. The
|
||||
This indicates that eh_timed_out() dealt with the timeout. The
|
||||
scmd is passed to __scsi_done() and thus linked into per-cpu
|
||||
scsi_done_q. Normal command completion described in [1-2-1]
|
||||
follows.
|
||||
|
@ -105,7 +105,7 @@ function
|
|||
command will time out again.
|
||||
|
||||
- EH_NOT_HANDLED
|
||||
This is the same as when eh_timedout() callback doesn't exist.
|
||||
This is the same as when eh_timed_out() callback doesn't exist.
|
||||
Step #2 is taken.
|
||||
|
||||
2. scsi_eh_scmd_add(scmd, SCSI_EH_CANCEL_CMD) is invoked for the
|
||||
|
@ -142,7 +142,7 @@ are linked on shost->eh_cmd_q.
|
|||
Note that this does not mean lower layers are quiescent. If a LLDD
|
||||
completed a scmd with error status, the LLDD and lower layers are
|
||||
assumed to forget about the scmd at that point. However, if a scmd
|
||||
has timed out, unless hostt->eh_timedout() made lower layers forget
|
||||
has timed out, unless hostt->eh_timed_out() made lower layers forget
|
||||
about the scmd, which currently no LLDD does, the command is still
|
||||
active as long as lower layers are concerned and completion could
|
||||
occur at any time. Of course, all such completions are ignored as the
|
||||
|
|
|
@ -346,7 +346,7 @@ Next, there is a movement to "outlaw" typedefs introducing synonyms for
|
|||
struct tags. Both can be still found in the SCSI subsystem, but
|
||||
the typedefs have been moved to a single file, scsi_typedefs.h to
|
||||
make their future removal easier, for example:
|
||||
"typedef struct scsi_host_template Scsi_Host_Template;"
|
||||
"typedef struct scsi_cmnd Scsi_Cmnd;"
|
||||
|
||||
Also, most C99 enhancements are encouraged to the extent they are supported
|
||||
by the relevant gcc compilers. So C99 style structure and array
|
||||
|
@ -718,7 +718,7 @@ void scsi_report_bus_reset(struct Scsi_Host * shost, int channel)
|
|||
*
|
||||
* Defined in: drivers/scsi/scsi.c .
|
||||
**/
|
||||
int scsi_track_queue_full(Scsi_Device *sdev, int depth)
|
||||
int scsi_track_queue_full(struct scsi_device *sdev, int depth)
|
||||
|
||||
|
||||
/**
|
||||
|
|
|
@ -1988,7 +1988,6 @@ PKTCDVD DRIVER
|
|||
P: Peter Osterlund
|
||||
M: petero2@telia.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
L: packet-writing@suse.com
|
||||
S: Maintained
|
||||
|
||||
POSIX CLOCKS and TIMERS
|
||||
|
|
7
Makefile
7
Makefile
|
@ -1,7 +1,7 @@
|
|||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 14
|
||||
EXTRAVERSION =
|
||||
SUBLEVEL = 15
|
||||
EXTRAVERSION =-rc1
|
||||
NAME=Affluent Albatross
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
@ -168,7 +168,8 @@ KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)$(LOCALVERSION)
|
|||
|
||||
SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
|
||||
-e s/arm.*/arm/ -e s/sa110/arm/ \
|
||||
-e s/s390x/s390/ -e s/parisc64/parisc/ )
|
||||
-e s/s390x/s390/ -e s/parisc64/parisc/ \
|
||||
-e s/ppc64/powerpc/ )
|
||||
|
||||
# Cross compiling and selecting different set of gcc/bin-utils
|
||||
# ---------------------------------------------------------------------------
|
||||
|
|
|
@ -550,9 +550,9 @@ struct locomo_save_data {
|
|||
u16 LCM_SPIMD;
|
||||
};
|
||||
|
||||
static int locomo_suspend(struct device *dev, pm_message_t state)
|
||||
static int locomo_suspend(struct platform_device *dev, pm_message_t state)
|
||||
{
|
||||
struct locomo *lchip = dev_get_drvdata(dev);
|
||||
struct locomo *lchip = platform_get_drvdata(dev);
|
||||
struct locomo_save_data *save;
|
||||
unsigned long flags;
|
||||
|
||||
|
@ -560,7 +560,7 @@ static int locomo_suspend(struct device *dev, pm_message_t state)
|
|||
if (!save)
|
||||
return -ENOMEM;
|
||||
|
||||
dev->power.saved_state = (void *) save;
|
||||
dev->dev.power.saved_state = (void *) save;
|
||||
|
||||
spin_lock_irqsave(&lchip->lock, flags);
|
||||
|
||||
|
@ -594,14 +594,14 @@ static int locomo_suspend(struct device *dev, pm_message_t state)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int locomo_resume(struct device *dev)
|
||||
static int locomo_resume(struct platform_device *dev)
|
||||
{
|
||||
struct locomo *lchip = dev_get_drvdata(dev);
|
||||
struct locomo *lchip = platform_get_drvdata(dev);
|
||||
struct locomo_save_data *save;
|
||||
unsigned long r;
|
||||
unsigned long flags;
|
||||
|
||||
save = (struct locomo_save_data *) dev->power.saved_state;
|
||||
save = (struct locomo_save_data *) dev->dev.power.saved_state;
|
||||
if (!save)
|
||||
return 0;
|
||||
|
||||
|
@ -760,27 +760,26 @@ static void __locomo_remove(struct locomo *lchip)
|
|||
kfree(lchip);
|
||||
}
|
||||
|
||||
static int locomo_probe(struct device *dev)
|
||||
static int locomo_probe(struct platform_device *dev)
|
||||
{
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
struct resource *mem;
|
||||
int irq;
|
||||
|
||||
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
mem = platform_get_resource(dev, IORESOURCE_MEM, 0);
|
||||
if (!mem)
|
||||
return -EINVAL;
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
irq = platform_get_irq(dev, 0);
|
||||
|
||||
return __locomo_probe(dev, mem, irq);
|
||||
return __locomo_probe(&dev->dev, mem, irq);
|
||||
}
|
||||
|
||||
static int locomo_remove(struct device *dev)
|
||||
static int locomo_remove(struct platform_device *dev)
|
||||
{
|
||||
struct locomo *lchip = dev_get_drvdata(dev);
|
||||
struct locomo *lchip = platform__get_drvdata(dev);
|
||||
|
||||
if (lchip) {
|
||||
__locomo_remove(lchip);
|
||||
dev_set_drvdata(dev, NULL);
|
||||
platform_set_drvdata(dev, NULL);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -792,15 +791,16 @@ static int locomo_remove(struct device *dev)
|
|||
* the per-machine level, and then have this driver pick
|
||||
* up the registered devices.
|
||||
*/
|
||||
static struct device_driver locomo_device_driver = {
|
||||
.name = "locomo",
|
||||
.bus = &platform_bus_type,
|
||||
static struct platform_driver locomo_device_driver = {
|
||||
.probe = locomo_probe,
|
||||
.remove = locomo_remove,
|
||||
#ifdef CONFIG_PM
|
||||
.suspend = locomo_suspend,
|
||||
.resume = locomo_resume,
|
||||
#endif
|
||||
.driver = {
|
||||
.name = "locomo",
|
||||
},
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -1126,13 +1126,13 @@ static int __init locomo_init(void)
|
|||
{
|
||||
int ret = bus_register(&locomo_bus_type);
|
||||
if (ret == 0)
|
||||
driver_register(&locomo_device_driver);
|
||||
platform_driver_register(&locomo_device_driver);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void __exit locomo_exit(void)
|
||||
{
|
||||
driver_unregister(&locomo_device_driver);
|
||||
platform_driver_unregister(&locomo_device_driver);
|
||||
bus_unregister(&locomo_bus_type);
|
||||
}
|
||||
|
||||
|
|
|
@ -801,9 +801,9 @@ struct sa1111_save_data {
|
|||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
static int sa1111_suspend(struct device *dev, pm_message_t state)
|
||||
static int sa1111_suspend(struct platform_device *dev, pm_message_t state)
|
||||
{
|
||||
struct sa1111 *sachip = dev_get_drvdata(dev);
|
||||
struct sa1111 *sachip = platform_get_drvdata(dev);
|
||||
struct sa1111_save_data *save;
|
||||
unsigned long flags;
|
||||
unsigned int val;
|
||||
|
@ -812,7 +812,7 @@ static int sa1111_suspend(struct device *dev, pm_message_t state)
|
|||
save = kmalloc(sizeof(struct sa1111_save_data), GFP_KERNEL);
|
||||
if (!save)
|
||||
return -ENOMEM;
|
||||
dev->power.saved_state = save;
|
||||
dev->dev.power.saved_state = save;
|
||||
|
||||
spin_lock_irqsave(&sachip->lock, flags);
|
||||
|
||||
|
@ -859,14 +859,14 @@ static int sa1111_suspend(struct device *dev, pm_message_t state)
|
|||
* restored by their respective drivers, and must be called
|
||||
* via LDM after this function.
|
||||
*/
|
||||
static int sa1111_resume(struct device *dev)
|
||||
static int sa1111_resume(struct platform_device *dev)
|
||||
{
|
||||
struct sa1111 *sachip = dev_get_drvdata(dev);
|
||||
struct sa1111 *sachip = platform_get_drvdata(dev);
|
||||
struct sa1111_save_data *save;
|
||||
unsigned long flags, id;
|
||||
void __iomem *base;
|
||||
|
||||
save = (struct sa1111_save_data *)dev->power.saved_state;
|
||||
save = (struct sa1111_save_data *)dev->dev.power.saved_state;
|
||||
if (!save)
|
||||
return 0;
|
||||
|
||||
|
@ -879,7 +879,7 @@ static int sa1111_resume(struct device *dev)
|
|||
id = sa1111_readl(sachip->base + SA1111_SKID);
|
||||
if ((id & SKID_ID_MASK) != SKID_SA1111_ID) {
|
||||
__sa1111_remove(sachip);
|
||||
dev_set_drvdata(dev, NULL);
|
||||
platform_set_drvdata(dev, NULL);
|
||||
kfree(save);
|
||||
return 0;
|
||||
}
|
||||
|
@ -911,7 +911,7 @@ static int sa1111_resume(struct device *dev)
|
|||
|
||||
spin_unlock_irqrestore(&sachip->lock, flags);
|
||||
|
||||
dev->power.saved_state = NULL;
|
||||
dev->dev.power.saved_state = NULL;
|
||||
kfree(save);
|
||||
|
||||
return 0;
|
||||
|
@ -922,9 +922,8 @@ static int sa1111_resume(struct device *dev)
|
|||
#define sa1111_resume NULL
|
||||
#endif
|
||||
|
||||
static int sa1111_probe(struct device *dev)
|
||||
static int sa1111_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
struct resource *mem;
|
||||
int irq;
|
||||
|
||||
|
@ -933,20 +932,20 @@ static int sa1111_probe(struct device *dev)
|
|||
return -EINVAL;
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
|
||||
return __sa1111_probe(dev, mem, irq);
|
||||
return __sa1111_probe(&pdev->dev, mem, irq);
|
||||
}
|
||||
|
||||
static int sa1111_remove(struct device *dev)
|
||||
static int sa1111_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct sa1111 *sachip = dev_get_drvdata(dev);
|
||||
struct sa1111 *sachip = platform_get_drvdata(pdev);
|
||||
|
||||
if (sachip) {
|
||||
__sa1111_remove(sachip);
|
||||
dev_set_drvdata(dev, NULL);
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
kfree(dev->power.saved_state);
|
||||
dev->power.saved_state = NULL;
|
||||
kfree(pdev->dev.power.saved_state);
|
||||
pdev->dev.power.saved_state = NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -962,13 +961,14 @@ static int sa1111_remove(struct device *dev)
|
|||
* We also need to handle the SDRAM configuration for
|
||||
* PXA250/SA1110 machine classes.
|
||||
*/
|
||||
static struct device_driver sa1111_device_driver = {
|
||||
.name = "sa1111",
|
||||
.bus = &platform_bus_type,
|
||||
static struct platform_driver sa1111_device_driver = {
|
||||
.probe = sa1111_probe,
|
||||
.remove = sa1111_remove,
|
||||
.suspend = sa1111_suspend,
|
||||
.resume = sa1111_resume,
|
||||
.driver = {
|
||||
.name = "sa1111",
|
||||
},
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -1256,13 +1256,13 @@ static int __init sa1111_init(void)
|
|||
{
|
||||
int ret = bus_register(&sa1111_bus_type);
|
||||
if (ret == 0)
|
||||
driver_register(&sa1111_device_driver);
|
||||
platform_driver_register(&sa1111_device_driver);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void __exit sa1111_exit(void)
|
||||
{
|
||||
driver_unregister(&sa1111_device_driver);
|
||||
platform_driver_unregister(&sa1111_device_driver);
|
||||
bus_unregister(&sa1111_bus_type);
|
||||
}
|
||||
|
||||
|
|
|
@ -98,9 +98,9 @@ static void check_scoop_reg(struct scoop_dev *sdev)
|
|||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int scoop_suspend(struct device *dev, pm_message_t state)
|
||||
static int scoop_suspend(struct platform_device *dev, pm_message_t state)
|
||||
{
|
||||
struct scoop_dev *sdev = dev_get_drvdata(dev);
|
||||
struct scoop_dev *sdev = platform_get_drvdata(dev);
|
||||
|
||||
check_scoop_reg(sdev);
|
||||
sdev->scoop_gpwr = SCOOP_REG(sdev->base, SCOOP_GPWR);
|
||||
|
@ -109,9 +109,9 @@ static int scoop_suspend(struct device *dev, pm_message_t state)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int scoop_resume(struct device *dev)
|
||||
static int scoop_resume(struct platform_device *dev)
|
||||
{
|
||||
struct scoop_dev *sdev = dev_get_drvdata(dev);
|
||||
struct scoop_dev *sdev = platform_get_drvdata(dev);
|
||||
|
||||
check_scoop_reg(sdev);
|
||||
SCOOP_REG(sdev->base,SCOOP_GPWR) = sdev->scoop_gpwr;
|
||||
|
@ -123,11 +123,10 @@ static int scoop_resume(struct device *dev)
|
|||
#define scoop_resume NULL
|
||||
#endif
|
||||
|
||||
int __init scoop_probe(struct device *dev)
|
||||
int __init scoop_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct scoop_dev *devptr;
|
||||
struct scoop_config *inf;
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
struct resource *mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
|
||||
if (!mem)
|
||||
|
@ -141,7 +140,7 @@ int __init scoop_probe(struct device *dev)
|
|||
memset(devptr, 0, sizeof(struct scoop_dev));
|
||||
spin_lock_init(&devptr->scoop_lock);
|
||||
|
||||
inf = dev->platform_data;
|
||||
inf = pdev->dev.platform_data;
|
||||
devptr->base = ioremap(mem->start, mem->end - mem->start + 1);
|
||||
|
||||
if (!devptr->base) {
|
||||
|
@ -149,7 +148,7 @@ int __init scoop_probe(struct device *dev)
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
dev_set_drvdata(dev, devptr);
|
||||
platform_set_drvdata(pdev, devptr);
|
||||
|
||||
printk("Sharp Scoop Device found at 0x%08x -> 0x%08x\n",(unsigned int)mem->start,(unsigned int)devptr->base);
|
||||
|
||||
|
@ -164,29 +163,30 @@ int __init scoop_probe(struct device *dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int scoop_remove(struct device *dev)
|
||||
static int scoop_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct scoop_dev *sdev = dev_get_drvdata(dev);
|
||||
struct scoop_dev *sdev = platform_get_drvdata(pdev);
|
||||
if (sdev) {
|
||||
iounmap(sdev->base);
|
||||
kfree(sdev);
|
||||
dev_set_drvdata(dev, NULL);
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct device_driver scoop_driver = {
|
||||
.name = "sharp-scoop",
|
||||
.bus = &platform_bus_type,
|
||||
static struct platform_driver scoop_driver = {
|
||||
.probe = scoop_probe,
|
||||
.remove = scoop_remove,
|
||||
.suspend = scoop_suspend,
|
||||
.resume = scoop_resume,
|
||||
.driver = {
|
||||
.name = "sharp-scoop",
|
||||
},
|
||||
};
|
||||
|
||||
int __init scoop_init(void)
|
||||
{
|
||||
return driver_register(&scoop_driver);
|
||||
return platform_driver_register(&scoop_driver);
|
||||
}
|
||||
|
||||
subsys_initcall(scoop_init);
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.13
|
||||
# Wed Sep 14 10:51:52 2005
|
||||
# Linux kernel version: 2.6.14-git13
|
||||
# Thu Nov 10 15:12:48 2005
|
||||
#
|
||||
CONFIG_ARM=y
|
||||
CONFIG_MMU=y
|
||||
|
@ -21,6 +21,7 @@ CONFIG_INIT_ENV_ARG_LIMIT=32
|
|||
# General setup
|
||||
#
|
||||
CONFIG_LOCALVERSION=""
|
||||
CONFIG_LOCALVERSION_AUTO=y
|
||||
CONFIG_SWAP=y
|
||||
CONFIG_SYSVIPC=y
|
||||
# CONFIG_POSIX_MQUEUE is not set
|
||||
|
@ -31,6 +32,7 @@ CONFIG_SYSCTL=y
|
|||
# CONFIG_HOTPLUG is not set
|
||||
CONFIG_KOBJECT_UEVENT=y
|
||||
# CONFIG_IKCONFIG is not set
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_EMBEDDED=y
|
||||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_ALL is not set
|
||||
|
@ -60,6 +62,23 @@ CONFIG_OBSOLETE_MODPARM=y
|
|||
# CONFIG_MODULE_SRCVERSION_ALL is not set
|
||||
CONFIG_KMOD=y
|
||||
|
||||
#
|
||||
# Block layer
|
||||
#
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
#
|
||||
CONFIG_IOSCHED_NOOP=y
|
||||
CONFIG_IOSCHED_AS=y
|
||||
CONFIG_IOSCHED_DEADLINE=y
|
||||
CONFIG_IOSCHED_CFQ=y
|
||||
CONFIG_DEFAULT_AS=y
|
||||
# CONFIG_DEFAULT_DEADLINE is not set
|
||||
# CONFIG_DEFAULT_CFQ is not set
|
||||
# CONFIG_DEFAULT_NOOP is not set
|
||||
CONFIG_DEFAULT_IOSCHED="anticipatory"
|
||||
|
||||
#
|
||||
# System Type
|
||||
#
|
||||
|
@ -82,6 +101,7 @@ CONFIG_ARCH_IXP2000=y
|
|||
# CONFIG_ARCH_LH7A40X is not set
|
||||
# CONFIG_ARCH_OMAP is not set
|
||||
# CONFIG_ARCH_VERSATILE is not set
|
||||
# CONFIG_ARCH_REALVIEW is not set
|
||||
# CONFIG_ARCH_IMX is not set
|
||||
# CONFIG_ARCH_H720X is not set
|
||||
# CONFIG_ARCH_AAEC2000 is not set
|
||||
|
@ -124,7 +144,6 @@ CONFIG_XSCALE_PMU=y
|
|||
CONFIG_ISA_DMA_API=y
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PCI_LEGACY_PROC=y
|
||||
CONFIG_PCI_NAMES=y
|
||||
# CONFIG_PCI_DEBUG is not set
|
||||
|
||||
#
|
||||
|
@ -144,6 +163,8 @@ CONFIG_FLATMEM_MANUAL=y
|
|||
# CONFIG_SPARSEMEM_MANUAL is not set
|
||||
CONFIG_FLATMEM=y
|
||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
# CONFIG_SPARSEMEM_STATIC is not set
|
||||
CONFIG_SPLIT_PTLOCK_CPUS=4096
|
||||
CONFIG_ALIGNMENT_TRAP=y
|
||||
|
||||
#
|
||||
|
@ -162,6 +183,7 @@ CONFIG_CMDLINE="console=ttyS0,57600 root=/dev/nfs ip=bootp mem=64M@0x0 pci=firmw
|
|||
# At least one emulation must be selected
|
||||
#
|
||||
CONFIG_FPE_NWFPE=y
|
||||
CONFIG_FPE_NWFPE_XP=y
|
||||
# CONFIG_FPE_FASTFPE is not set
|
||||
|
||||
#
|
||||
|
@ -205,13 +227,18 @@ CONFIG_SYN_COOKIES=y
|
|||
# CONFIG_INET_ESP is not set
|
||||
# CONFIG_INET_IPCOMP is not set
|
||||
# CONFIG_INET_TUNNEL is not set
|
||||
# CONFIG_IP_TCPDIAG is not set
|
||||
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
||||
CONFIG_INET_DIAG=y
|
||||
CONFIG_INET_TCP_DIAG=y
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_NETFILTER is not set
|
||||
|
||||
#
|
||||
# DCCP Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_IP_DCCP is not set
|
||||
|
||||
#
|
||||
# SCTP Configuration (EXPERIMENTAL)
|
||||
#
|
||||
|
@ -228,6 +255,10 @@ CONFIG_TCP_CONG_BIC=y
|
|||
# CONFIG_NET_DIVERT is not set
|
||||
# CONFIG_ECONET is not set
|
||||
# CONFIG_WAN_ROUTER is not set
|
||||
|
||||
#
|
||||
# QoS and/or fair queueing
|
||||
#
|
||||
# CONFIG_NET_SCHED is not set
|
||||
# CONFIG_NET_CLS_ROUTE is not set
|
||||
|
||||
|
@ -238,6 +269,7 @@ CONFIG_TCP_CONG_BIC=y
|
|||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
# CONFIG_IEEE80211 is not set
|
||||
|
||||
#
|
||||
# Device Drivers
|
||||
|
@ -273,6 +305,7 @@ CONFIG_MTD_BLOCK=y
|
|||
# CONFIG_FTL is not set
|
||||
# CONFIG_NFTL is not set
|
||||
# CONFIG_INFTL is not set
|
||||
# CONFIG_RFD_FTL is not set
|
||||
|
||||
#
|
||||
# RAM/ROM/Flash chip drivers
|
||||
|
@ -307,7 +340,6 @@ CONFIG_MTD_COMPLEX_MAPPINGS=y
|
|||
# CONFIG_MTD_PHYSMAP is not set
|
||||
# CONFIG_MTD_ARM_INTEGRATOR is not set
|
||||
CONFIG_MTD_IXP2000=y
|
||||
# CONFIG_MTD_EDB7312 is not set
|
||||
# CONFIG_MTD_PCI is not set
|
||||
# CONFIG_MTD_PLATRAM is not set
|
||||
|
||||
|
@ -333,6 +365,11 @@ CONFIG_MTD_IXP2000=y
|
|||
#
|
||||
# CONFIG_MTD_NAND is not set
|
||||
|
||||
#
|
||||
# OneNAND Flash Device Drivers
|
||||
#
|
||||
# CONFIG_MTD_ONENAND is not set
|
||||
|
||||
#
|
||||
# Parallel port support
|
||||
#
|
||||
|
@ -358,21 +395,13 @@ CONFIG_BLK_DEV_RAM=y
|
|||
CONFIG_BLK_DEV_RAM_COUNT=16
|
||||
CONFIG_BLK_DEV_RAM_SIZE=8192
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
# CONFIG_CDROM_PKTCDVD is not set
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
#
|
||||
CONFIG_IOSCHED_NOOP=y
|
||||
CONFIG_IOSCHED_AS=y
|
||||
CONFIG_IOSCHED_DEADLINE=y
|
||||
CONFIG_IOSCHED_CFQ=y
|
||||
# CONFIG_ATA_OVER_ETH is not set
|
||||
|
||||
#
|
||||
# SCSI device support
|
||||
#
|
||||
# CONFIG_RAID_ATTRS is not set
|
||||
# CONFIG_SCSI is not set
|
||||
|
||||
#
|
||||
|
@ -409,6 +438,11 @@ CONFIG_DUMMY=y
|
|||
#
|
||||
# CONFIG_ARCNET is not set
|
||||
|
||||
#
|
||||
# PHY device support
|
||||
#
|
||||
# CONFIG_PHYLIB is not set
|
||||
|
||||
#
|
||||
# Ethernet (10 or 100Mbit)
|
||||
#
|
||||
|
@ -416,6 +450,7 @@ CONFIG_NET_ETHERNET=y
|
|||
CONFIG_MII=y
|
||||
# CONFIG_HAPPYMEAL is not set
|
||||
# CONFIG_SUNGEM is not set
|
||||
# CONFIG_CASSINI is not set
|
||||
# CONFIG_NET_VENDOR_3COM is not set
|
||||
# CONFIG_SMC91X is not set
|
||||
# CONFIG_DM9000 is not set
|
||||
|
@ -455,6 +490,7 @@ CONFIG_EEPRO100=y
|
|||
# CONFIG_HAMACHI is not set
|
||||
# CONFIG_YELLOWFIN is not set
|
||||
# CONFIG_R8169 is not set
|
||||
# CONFIG_SIS190 is not set
|
||||
# CONFIG_SKGE is not set
|
||||
# CONFIG_SK98LIN is not set
|
||||
# CONFIG_VIA_VELOCITY is not set
|
||||
|
@ -464,6 +500,7 @@ CONFIG_EEPRO100=y
|
|||
#
|
||||
# Ethernet (10000 Mbit)
|
||||
#
|
||||
# CONFIG_CHELSIO_T1 is not set
|
||||
# CONFIG_IXGB is not set
|
||||
# CONFIG_S2IO is not set
|
||||
|
||||
|
@ -609,6 +646,7 @@ CONFIG_IXP2000_WATCHDOG=y
|
|||
# TPM devices
|
||||
#
|
||||
# CONFIG_TCG_TPM is not set
|
||||
# CONFIG_TELCLOCK is not set
|
||||
|
||||
#
|
||||
# I2C support
|
||||
|
@ -634,7 +672,6 @@ CONFIG_I2C_ALGOBIT=y
|
|||
# CONFIG_I2C_I801 is not set
|
||||
# CONFIG_I2C_I810 is not set
|
||||
# CONFIG_I2C_PIIX4 is not set
|
||||
# CONFIG_I2C_ISA is not set
|
||||
CONFIG_I2C_IXP2000=y
|
||||
# CONFIG_I2C_NFORCE2 is not set
|
||||
# CONFIG_I2C_PARPORT_LIGHT is not set
|
||||
|
@ -649,7 +686,6 @@ CONFIG_I2C_IXP2000=y
|
|||
# CONFIG_I2C_VIAPRO is not set
|
||||
# CONFIG_I2C_VOODOO3 is not set
|
||||
# CONFIG_I2C_PCA_ISA is not set
|
||||
CONFIG_I2C_SENSOR=y
|
||||
|
||||
#
|
||||
# Miscellaneous I2C Chip support
|
||||
|
@ -662,6 +698,7 @@ CONFIG_SENSORS_EEPROM=y
|
|||
# CONFIG_SENSORS_PCF8591 is not set
|
||||
# CONFIG_SENSORS_RTC8564 is not set
|
||||
# CONFIG_SENSORS_MAX6875 is not set
|
||||
# CONFIG_RTC_X1205_I2C is not set
|
||||
# CONFIG_I2C_DEBUG_CORE is not set
|
||||
# CONFIG_I2C_DEBUG_ALGO is not set
|
||||
# CONFIG_I2C_DEBUG_BUS is not set
|
||||
|
@ -671,6 +708,7 @@ CONFIG_SENSORS_EEPROM=y
|
|||
# Hardware Monitoring support
|
||||
#
|
||||
CONFIG_HWMON=y
|
||||
# CONFIG_HWMON_VID is not set
|
||||
# CONFIG_SENSORS_ADM1021 is not set
|
||||
# CONFIG_SENSORS_ADM1025 is not set
|
||||
# CONFIG_SENSORS_ADM1026 is not set
|
||||
|
@ -701,6 +739,7 @@ CONFIG_HWMON=y
|
|||
# CONFIG_SENSORS_SMSC47B397 is not set
|
||||
# CONFIG_SENSORS_VIA686A is not set
|
||||
# CONFIG_SENSORS_W83781D is not set
|
||||
# CONFIG_SENSORS_W83792D is not set
|
||||
# CONFIG_SENSORS_W83L785TS is not set
|
||||
# CONFIG_SENSORS_W83627HF is not set
|
||||
# CONFIG_SENSORS_W83627EHF is not set
|
||||
|
@ -710,6 +749,10 @@ CONFIG_HWMON=y
|
|||
# Misc devices
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia Capabilities Port drivers
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
#
|
||||
|
@ -737,6 +780,10 @@ CONFIG_USB_ARCH_HAS_HCD=y
|
|||
CONFIG_USB_ARCH_HAS_OHCI=y
|
||||
# CONFIG_USB is not set
|
||||
|
||||
#
|
||||
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
|
||||
#
|
||||
|
||||
#
|
||||
# USB Gadget Support
|
||||
#
|
||||
|
@ -765,10 +812,6 @@ CONFIG_FS_MBCACHE=y
|
|||
# CONFIG_REISERFS_FS is not set
|
||||
# CONFIG_JFS_FS is not set
|
||||
CONFIG_FS_POSIX_ACL=y
|
||||
|
||||
#
|
||||
# XFS support
|
||||
#
|
||||
# CONFIG_XFS_FS is not set
|
||||
# CONFIG_MINIX_FS is not set
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
|
@ -777,6 +820,7 @@ CONFIG_INOTIFY=y
|
|||
CONFIG_DNOTIFY=y
|
||||
# CONFIG_AUTOFS_FS is not set
|
||||
# CONFIG_AUTOFS4_FS is not set
|
||||
# CONFIG_FUSE_FS is not set
|
||||
|
||||
#
|
||||
# CD-ROM/DVD Filesystems
|
||||
|
@ -796,11 +840,10 @@ CONFIG_DNOTIFY=y
|
|||
#
|
||||
CONFIG_PROC_FS=y
|
||||
CONFIG_SYSFS=y
|
||||
# CONFIG_DEVPTS_FS_XATTR is not set
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_TMPFS_XATTR is not set
|
||||
# CONFIG_HUGETLB_PAGE is not set
|
||||
CONFIG_RAMFS=y
|
||||
# CONFIG_RELAYFS_FS is not set
|
||||
|
||||
#
|
||||
# Miscellaneous filesystems
|
||||
|
@ -816,6 +859,7 @@ CONFIG_RAMFS=y
|
|||
CONFIG_JFFS2_FS=y
|
||||
CONFIG_JFFS2_FS_DEBUG=0
|
||||
CONFIG_JFFS2_FS_WRITEBUFFER=y
|
||||
# CONFIG_JFFS2_SUMMARY is not set
|
||||
# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
|
||||
CONFIG_JFFS2_ZLIB=y
|
||||
CONFIG_JFFS2_RTIME=y
|
||||
|
@ -848,6 +892,7 @@ CONFIG_SUNRPC=y
|
|||
# CONFIG_NCP_FS is not set
|
||||
# CONFIG_CODA_FS is not set
|
||||
# CONFIG_AFS_FS is not set
|
||||
# CONFIG_9P_FS is not set
|
||||
|
||||
#
|
||||
# Partition Types
|
||||
|
@ -886,6 +931,7 @@ CONFIG_MSDOS_PARTITION=y
|
|||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_LOG_BUF_SHIFT=14
|
||||
CONFIG_DETECT_SOFTLOCKUP=y
|
||||
# CONFIG_SCHEDSTATS is not set
|
||||
# CONFIG_DEBUG_SLAB is not set
|
||||
# CONFIG_DEBUG_SPINLOCK is not set
|
||||
|
@ -894,7 +940,9 @@ CONFIG_LOG_BUF_SHIFT=14
|
|||
CONFIG_DEBUG_BUGVERBOSE=y
|
||||
# CONFIG_DEBUG_INFO is not set
|
||||
# CONFIG_DEBUG_FS is not set
|
||||
# CONFIG_DEBUG_VM is not set
|
||||
CONFIG_FRAME_POINTER=y
|
||||
# CONFIG_RCU_TORTURE_TEST is not set
|
||||
CONFIG_DEBUG_USER=y
|
||||
# CONFIG_DEBUG_WAITQ is not set
|
||||
CONFIG_DEBUG_ERRORS=y
|
||||
|
@ -920,6 +968,7 @@ CONFIG_DEBUG_LL=y
|
|||
# Library routines
|
||||
#
|
||||
# CONFIG_CRC_CCITT is not set
|
||||
# CONFIG_CRC16 is not set
|
||||
CONFIG_CRC32=y
|
||||
# CONFIG_LIBCRC32C is not set
|
||||
CONFIG_ZLIB_INFLATE=y
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.13
|
||||
# Wed Sep 14 10:52:01 2005
|
||||
# Linux kernel version: 2.6.14-git13
|
||||
# Thu Nov 10 15:14:13 2005
|
||||
#
|
||||
CONFIG_ARM=y
|
||||
CONFIG_MMU=y
|
||||
|
@ -21,6 +21,7 @@ CONFIG_INIT_ENV_ARG_LIMIT=32
|
|||
# General setup
|
||||
#
|
||||
CONFIG_LOCALVERSION=""
|
||||
CONFIG_LOCALVERSION_AUTO=y
|
||||
CONFIG_SWAP=y
|
||||
CONFIG_SYSVIPC=y
|
||||
# CONFIG_POSIX_MQUEUE is not set
|
||||
|
@ -31,6 +32,7 @@ CONFIG_SYSCTL=y
|
|||
# CONFIG_HOTPLUG is not set
|
||||
CONFIG_KOBJECT_UEVENT=y
|
||||
# CONFIG_IKCONFIG is not set
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_EMBEDDED=y
|
||||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_ALL is not set
|
||||
|
@ -60,6 +62,23 @@ CONFIG_OBSOLETE_MODPARM=y
|
|||
# CONFIG_MODULE_SRCVERSION_ALL is not set
|
||||
CONFIG_KMOD=y
|
||||
|
||||
#
|
||||
# Block layer
|
||||
#
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
#
|
||||
CONFIG_IOSCHED_NOOP=y
|
||||
CONFIG_IOSCHED_AS=y
|
||||
CONFIG_IOSCHED_DEADLINE=y
|
||||
CONFIG_IOSCHED_CFQ=y
|
||||
CONFIG_DEFAULT_AS=y
|
||||
# CONFIG_DEFAULT_DEADLINE is not set
|
||||
# CONFIG_DEFAULT_CFQ is not set
|
||||
# CONFIG_DEFAULT_NOOP is not set
|
||||
CONFIG_DEFAULT_IOSCHED="anticipatory"
|
||||
|
||||
#
|
||||
# System Type
|
||||
#
|
||||
|
@ -82,6 +101,7 @@ CONFIG_ARCH_IXP2000=y
|
|||
# CONFIG_ARCH_LH7A40X is not set
|
||||
# CONFIG_ARCH_OMAP is not set
|
||||
# CONFIG_ARCH_VERSATILE is not set
|
||||
# CONFIG_ARCH_REALVIEW is not set
|
||||
# CONFIG_ARCH_IMX is not set
|
||||
# CONFIG_ARCH_H720X is not set
|
||||
# CONFIG_ARCH_AAEC2000 is not set
|
||||
|
@ -125,7 +145,6 @@ CONFIG_XSCALE_PMU=y
|
|||
CONFIG_ISA_DMA_API=y
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PCI_LEGACY_PROC=y
|
||||
CONFIG_PCI_NAMES=y
|
||||
# CONFIG_PCI_DEBUG is not set
|
||||
|
||||
#
|
||||
|
@ -145,6 +164,8 @@ CONFIG_FLATMEM_MANUAL=y
|
|||
# CONFIG_SPARSEMEM_MANUAL is not set
|
||||
CONFIG_FLATMEM=y
|
||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
# CONFIG_SPARSEMEM_STATIC is not set
|
||||
CONFIG_SPLIT_PTLOCK_CPUS=4096
|
||||
CONFIG_ALIGNMENT_TRAP=y
|
||||
|
||||
#
|
||||
|
@ -163,6 +184,7 @@ CONFIG_CMDLINE="console=ttyS0,57600 root=/dev/nfs ip=bootp mem=64M@0x0 pci=firmw
|
|||
# At least one emulation must be selected
|
||||
#
|
||||
CONFIG_FPE_NWFPE=y
|
||||
CONFIG_FPE_NWFPE_XP=y
|
||||
# CONFIG_FPE_FASTFPE is not set
|
||||
|
||||
#
|
||||
|
@ -206,13 +228,18 @@ CONFIG_SYN_COOKIES=y
|
|||
# CONFIG_INET_ESP is not set
|
||||
# CONFIG_INET_IPCOMP is not set
|
||||
# CONFIG_INET_TUNNEL is not set
|
||||
# CONFIG_IP_TCPDIAG is not set
|
||||
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
||||
CONFIG_INET_DIAG=y
|
||||
CONFIG_INET_TCP_DIAG=y
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_NETFILTER is not set
|
||||
|
||||
#
|
||||
# DCCP Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_IP_DCCP is not set
|
||||
|
||||
#
|
||||
# SCTP Configuration (EXPERIMENTAL)
|
||||
#
|
||||
|
@ -229,6 +256,10 @@ CONFIG_TCP_CONG_BIC=y
|
|||
# CONFIG_NET_DIVERT is not set
|
||||
# CONFIG_ECONET is not set
|
||||
# CONFIG_WAN_ROUTER is not set
|
||||
|
||||
#
|
||||
# QoS and/or fair queueing
|
||||
#
|
||||
# CONFIG_NET_SCHED is not set
|
||||
# CONFIG_NET_CLS_ROUTE is not set
|
||||
|
||||
|
@ -239,6 +270,7 @@ CONFIG_TCP_CONG_BIC=y
|
|||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
# CONFIG_IEEE80211 is not set
|
||||
|
||||
#
|
||||
# Device Drivers
|
||||
|
@ -274,6 +306,7 @@ CONFIG_MTD_BLOCK=y
|
|||
# CONFIG_FTL is not set
|
||||
# CONFIG_NFTL is not set
|
||||
# CONFIG_INFTL is not set
|
||||
# CONFIG_RFD_FTL is not set
|
||||
|
||||
#
|
||||
# RAM/ROM/Flash chip drivers
|
||||
|
@ -308,7 +341,6 @@ CONFIG_MTD_COMPLEX_MAPPINGS=y
|
|||
# CONFIG_MTD_PHYSMAP is not set
|
||||
# CONFIG_MTD_ARM_INTEGRATOR is not set
|
||||
CONFIG_MTD_IXP2000=y
|
||||
# CONFIG_MTD_EDB7312 is not set
|
||||
# CONFIG_MTD_PCI is not set
|
||||
# CONFIG_MTD_PLATRAM is not set
|
||||
|
||||
|
@ -334,6 +366,11 @@ CONFIG_MTD_IXP2000=y
|
|||
#
|
||||
# CONFIG_MTD_NAND is not set
|
||||
|
||||
#
|
||||
# OneNAND Flash Device Drivers
|
||||
#
|
||||
# CONFIG_MTD_ONENAND is not set
|
||||
|
||||
#
|
||||
# Parallel port support
|
||||
#
|
||||
|
@ -359,21 +396,13 @@ CONFIG_BLK_DEV_RAM=y
|
|||
CONFIG_BLK_DEV_RAM_COUNT=16
|
||||
CONFIG_BLK_DEV_RAM_SIZE=8192
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
# CONFIG_CDROM_PKTCDVD is not set
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
#
|
||||
CONFIG_IOSCHED_NOOP=y
|
||||
CONFIG_IOSCHED_AS=y
|
||||
CONFIG_IOSCHED_DEADLINE=y
|
||||
CONFIG_IOSCHED_CFQ=y
|
||||
# CONFIG_ATA_OVER_ETH is not set
|
||||
|
||||
#
|
||||
# SCSI device support
|
||||
#
|
||||
# CONFIG_RAID_ATTRS is not set
|
||||
# CONFIG_SCSI is not set
|
||||
|
||||
#
|
||||
|
@ -410,6 +439,11 @@ CONFIG_DUMMY=y
|
|||
#
|
||||
# CONFIG_ARCNET is not set
|
||||
|
||||
#
|
||||
# PHY device support
|
||||
#
|
||||
# CONFIG_PHYLIB is not set
|
||||
|
||||
#
|
||||
# Ethernet (10 or 100Mbit)
|
||||
#
|
||||
|
@ -417,6 +451,7 @@ CONFIG_NET_ETHERNET=y
|
|||
CONFIG_MII=y
|
||||
# CONFIG_HAPPYMEAL is not set
|
||||
# CONFIG_SUNGEM is not set
|
||||
# CONFIG_CASSINI is not set
|
||||
# CONFIG_NET_VENDOR_3COM is not set
|
||||
# CONFIG_SMC91X is not set
|
||||
# CONFIG_DM9000 is not set
|
||||
|
@ -456,6 +491,7 @@ CONFIG_EEPRO100=y
|
|||
# CONFIG_HAMACHI is not set
|
||||
# CONFIG_YELLOWFIN is not set
|
||||
# CONFIG_R8169 is not set
|
||||
# CONFIG_SIS190 is not set
|
||||
# CONFIG_SKGE is not set
|
||||
# CONFIG_SK98LIN is not set
|
||||
# CONFIG_VIA_VELOCITY is not set
|
||||
|
@ -465,6 +501,7 @@ CONFIG_EEPRO100=y
|
|||
#
|
||||
# Ethernet (10000 Mbit)
|
||||
#
|
||||
# CONFIG_CHELSIO_T1 is not set
|
||||
# CONFIG_IXGB is not set
|
||||
# CONFIG_S2IO is not set
|
||||
|
||||
|
@ -610,6 +647,7 @@ CONFIG_IXP2000_WATCHDOG=y
|
|||
# TPM devices
|
||||
#
|
||||
# CONFIG_TCG_TPM is not set
|
||||
# CONFIG_TELCLOCK is not set
|
||||
|
||||
#
|
||||
# I2C support
|
||||
|
@ -635,7 +673,6 @@ CONFIG_I2C_ALGOBIT=y
|
|||
# CONFIG_I2C_I801 is not set
|
||||
# CONFIG_I2C_I810 is not set
|
||||
# CONFIG_I2C_PIIX4 is not set
|
||||
# CONFIG_I2C_ISA is not set
|
||||
CONFIG_I2C_IXP2000=y
|
||||
# CONFIG_I2C_NFORCE2 is not set
|
||||
# CONFIG_I2C_PARPORT_LIGHT is not set
|
||||
|
@ -650,7 +687,6 @@ CONFIG_I2C_IXP2000=y
|
|||
# CONFIG_I2C_VIAPRO is not set
|
||||
# CONFIG_I2C_VOODOO3 is not set
|
||||
# CONFIG_I2C_PCA_ISA is not set
|
||||
CONFIG_I2C_SENSOR=y
|
||||
|
||||
#
|
||||
# Miscellaneous I2C Chip support
|
||||
|
@ -663,6 +699,7 @@ CONFIG_SENSORS_EEPROM=y
|
|||
# CONFIG_SENSORS_PCF8591 is not set
|
||||
# CONFIG_SENSORS_RTC8564 is not set
|
||||
# CONFIG_SENSORS_MAX6875 is not set
|
||||
# CONFIG_RTC_X1205_I2C is not set
|
||||
# CONFIG_I2C_DEBUG_CORE is not set
|
||||
# CONFIG_I2C_DEBUG_ALGO is not set
|
||||
# CONFIG_I2C_DEBUG_BUS is not set
|
||||
|
@ -672,6 +709,7 @@ CONFIG_SENSORS_EEPROM=y
|
|||
# Hardware Monitoring support
|
||||
#
|
||||
CONFIG_HWMON=y
|
||||
# CONFIG_HWMON_VID is not set
|
||||
# CONFIG_SENSORS_ADM1021 is not set
|
||||
# CONFIG_SENSORS_ADM1025 is not set
|
||||
# CONFIG_SENSORS_ADM1026 is not set
|
||||
|
@ -702,6 +740,7 @@ CONFIG_HWMON=y
|
|||
# CONFIG_SENSORS_SMSC47B397 is not set
|
||||
# CONFIG_SENSORS_VIA686A is not set
|
||||
# CONFIG_SENSORS_W83781D is not set
|
||||
# CONFIG_SENSORS_W83792D is not set
|
||||
# CONFIG_SENSORS_W83L785TS is not set
|
||||
# CONFIG_SENSORS_W83627HF is not set
|
||||
# CONFIG_SENSORS_W83627EHF is not set
|
||||
|
@ -711,6 +750,10 @@ CONFIG_HWMON=y
|
|||
# Misc devices
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia Capabilities Port drivers
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
#
|
||||
|
@ -738,6 +781,10 @@ CONFIG_USB_ARCH_HAS_HCD=y
|
|||
CONFIG_USB_ARCH_HAS_OHCI=y
|
||||
# CONFIG_USB is not set
|
||||
|
||||
#
|
||||
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
|
||||
#
|
||||
|
||||
#
|
||||
# USB Gadget Support
|
||||
#
|
||||
|
@ -766,10 +813,6 @@ CONFIG_FS_MBCACHE=y
|
|||
# CONFIG_REISERFS_FS is not set
|
||||
# CONFIG_JFS_FS is not set
|
||||
CONFIG_FS_POSIX_ACL=y
|
||||
|
||||
#
|
||||
# XFS support
|
||||
#
|
||||
# CONFIG_XFS_FS is not set
|
||||
# CONFIG_MINIX_FS is not set
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
|
@ -778,6 +821,7 @@ CONFIG_INOTIFY=y
|
|||
CONFIG_DNOTIFY=y
|
||||
# CONFIG_AUTOFS_FS is not set
|
||||
# CONFIG_AUTOFS4_FS is not set
|
||||
# CONFIG_FUSE_FS is not set
|
||||
|
||||
#
|
||||
# CD-ROM/DVD Filesystems
|
||||
|
@ -797,11 +841,10 @@ CONFIG_DNOTIFY=y
|
|||
#
|
||||
CONFIG_PROC_FS=y
|
||||
CONFIG_SYSFS=y
|
||||
# CONFIG_DEVPTS_FS_XATTR is not set
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_TMPFS_XATTR is not set
|
||||
# CONFIG_HUGETLB_PAGE is not set
|
||||
CONFIG_RAMFS=y
|
||||
# CONFIG_RELAYFS_FS is not set
|
||||
|
||||
#
|
||||
# Miscellaneous filesystems
|
||||
|
@ -817,6 +860,7 @@ CONFIG_RAMFS=y
|
|||
CONFIG_JFFS2_FS=y
|
||||
CONFIG_JFFS2_FS_DEBUG=0
|
||||
CONFIG_JFFS2_FS_WRITEBUFFER=y
|
||||
# CONFIG_JFFS2_SUMMARY is not set
|
||||
# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
|
||||
CONFIG_JFFS2_ZLIB=y
|
||||
CONFIG_JFFS2_RTIME=y
|
||||
|
@ -849,6 +893,7 @@ CONFIG_SUNRPC=y
|
|||
# CONFIG_NCP_FS is not set
|
||||
# CONFIG_CODA_FS is not set
|
||||
# CONFIG_AFS_FS is not set
|
||||
# CONFIG_9P_FS is not set
|
||||
|
||||
#
|
||||
# Partition Types
|
||||
|
@ -887,6 +932,7 @@ CONFIG_MSDOS_PARTITION=y
|
|||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_LOG_BUF_SHIFT=14
|
||||
CONFIG_DETECT_SOFTLOCKUP=y
|
||||
# CONFIG_SCHEDSTATS is not set
|
||||
# CONFIG_DEBUG_SLAB is not set
|
||||
# CONFIG_DEBUG_SPINLOCK is not set
|
||||
|
@ -895,7 +941,9 @@ CONFIG_LOG_BUF_SHIFT=14
|
|||
CONFIG_DEBUG_BUGVERBOSE=y
|
||||
# CONFIG_DEBUG_INFO is not set
|
||||
# CONFIG_DEBUG_FS is not set
|
||||
# CONFIG_DEBUG_VM is not set
|
||||
CONFIG_FRAME_POINTER=y
|
||||
# CONFIG_RCU_TORTURE_TEST is not set
|
||||
CONFIG_DEBUG_USER=y
|
||||
# CONFIG_DEBUG_WAITQ is not set
|
||||
CONFIG_DEBUG_ERRORS=y
|
||||
|
@ -921,6 +969,7 @@ CONFIG_DEBUG_LL=y
|
|||
# Library routines
|
||||
#
|
||||
# CONFIG_CRC_CCITT is not set
|
||||
# CONFIG_CRC16 is not set
|
||||
CONFIG_CRC32=y
|
||||
# CONFIG_LIBCRC32C is not set
|
||||
CONFIG_ZLIB_INFLATE=y
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.13
|
||||
# Wed Sep 14 10:52:10 2005
|
||||
# Linux kernel version: 2.6.14-git13
|
||||
# Thu Nov 10 15:14:50 2005
|
||||
#
|
||||
CONFIG_ARM=y
|
||||
CONFIG_MMU=y
|
||||
|
@ -21,6 +21,7 @@ CONFIG_INIT_ENV_ARG_LIMIT=32
|
|||
# General setup
|
||||
#
|
||||
CONFIG_LOCALVERSION=""
|
||||
CONFIG_LOCALVERSION_AUTO=y
|
||||
CONFIG_SWAP=y
|
||||
CONFIG_SYSVIPC=y
|
||||
# CONFIG_POSIX_MQUEUE is not set
|
||||
|
@ -31,6 +32,7 @@ CONFIG_SYSCTL=y
|
|||
# CONFIG_HOTPLUG is not set
|
||||
CONFIG_KOBJECT_UEVENT=y
|
||||
# CONFIG_IKCONFIG is not set
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_EMBEDDED=y
|
||||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_ALL is not set
|
||||
|
@ -60,6 +62,23 @@ CONFIG_OBSOLETE_MODPARM=y
|
|||
# CONFIG_MODULE_SRCVERSION_ALL is not set
|
||||
CONFIG_KMOD=y
|
||||
|
||||
#
|
||||
# Block layer
|
||||
#
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
#
|
||||
CONFIG_IOSCHED_NOOP=y
|
||||
CONFIG_IOSCHED_AS=y
|
||||
CONFIG_IOSCHED_DEADLINE=y
|
||||
CONFIG_IOSCHED_CFQ=y
|
||||
CONFIG_DEFAULT_AS=y
|
||||
# CONFIG_DEFAULT_DEADLINE is not set
|
||||
# CONFIG_DEFAULT_CFQ is not set
|
||||
# CONFIG_DEFAULT_NOOP is not set
|
||||
CONFIG_DEFAULT_IOSCHED="anticipatory"
|
||||
|
||||
#
|
||||
# System Type
|
||||
#
|
||||
|
@ -82,6 +101,7 @@ CONFIG_ARCH_IXP2000=y
|
|||
# CONFIG_ARCH_LH7A40X is not set
|
||||
# CONFIG_ARCH_OMAP is not set
|
||||
# CONFIG_ARCH_VERSATILE is not set
|
||||
# CONFIG_ARCH_REALVIEW is not set
|
||||
# CONFIG_ARCH_IMX is not set
|
||||
# CONFIG_ARCH_H720X is not set
|
||||
# CONFIG_ARCH_AAEC2000 is not set
|
||||
|
@ -125,7 +145,6 @@ CONFIG_XSCALE_PMU=y
|
|||
CONFIG_ISA_DMA_API=y
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PCI_LEGACY_PROC=y
|
||||
CONFIG_PCI_NAMES=y
|
||||
# CONFIG_PCI_DEBUG is not set
|
||||
|
||||
#
|
||||
|
@ -145,6 +164,8 @@ CONFIG_FLATMEM_MANUAL=y
|
|||
# CONFIG_SPARSEMEM_MANUAL is not set
|
||||
CONFIG_FLATMEM=y
|
||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
# CONFIG_SPARSEMEM_STATIC is not set
|
||||
CONFIG_SPLIT_PTLOCK_CPUS=4096
|
||||
CONFIG_ALIGNMENT_TRAP=y
|
||||
|
||||
#
|
||||
|
@ -163,6 +184,7 @@ CONFIG_CMDLINE="console=ttyS0,115200 root=/dev/nfs ip=bootp mem=64M@0x0 pci=firm
|
|||
# At least one emulation must be selected
|
||||
#
|
||||
CONFIG_FPE_NWFPE=y
|
||||
CONFIG_FPE_NWFPE_XP=y
|
||||
# CONFIG_FPE_FASTFPE is not set
|
||||
|
||||
#
|
||||
|
@ -206,13 +228,18 @@ CONFIG_SYN_COOKIES=y
|
|||
# CONFIG_INET_ESP is not set
|
||||
# CONFIG_INET_IPCOMP is not set
|
||||
# CONFIG_INET_TUNNEL is not set
|
||||
CONFIG_IP_TCPDIAG=y
|
||||
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
||||
CONFIG_INET_DIAG=y
|
||||
CONFIG_INET_TCP_DIAG=y
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_NETFILTER is not set
|
||||
|
||||
#
|
||||
# DCCP Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_IP_DCCP is not set
|
||||
|
||||
#
|
||||
# SCTP Configuration (EXPERIMENTAL)
|
||||
#
|
||||
|
@ -229,6 +256,10 @@ CONFIG_TCP_CONG_BIC=y
|
|||
# CONFIG_NET_DIVERT is not set
|
||||
# CONFIG_ECONET is not set
|
||||
# CONFIG_WAN_ROUTER is not set
|
||||
|
||||
#
|
||||
# QoS and/or fair queueing
|
||||
#
|
||||
# CONFIG_NET_SCHED is not set
|
||||
# CONFIG_NET_CLS_ROUTE is not set
|
||||
|
||||
|
@ -239,6 +270,7 @@ CONFIG_TCP_CONG_BIC=y
|
|||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
# CONFIG_IEEE80211 is not set
|
||||
|
||||
#
|
||||
# Device Drivers
|
||||
|
@ -274,6 +306,7 @@ CONFIG_MTD_BLOCK=y
|
|||
# CONFIG_FTL is not set
|
||||
# CONFIG_NFTL is not set
|
||||
# CONFIG_INFTL is not set
|
||||
# CONFIG_RFD_FTL is not set
|
||||
|
||||
#
|
||||
# RAM/ROM/Flash chip drivers
|
||||
|
@ -308,7 +341,6 @@ CONFIG_MTD_COMPLEX_MAPPINGS=y
|
|||
# CONFIG_MTD_PHYSMAP is not set
|
||||
# CONFIG_MTD_ARM_INTEGRATOR is not set
|
||||
CONFIG_MTD_IXP2000=y
|
||||
# CONFIG_MTD_EDB7312 is not set
|
||||
# CONFIG_MTD_PCI is not set
|
||||
# CONFIG_MTD_PLATRAM is not set
|
||||
|
||||
|
@ -334,6 +366,11 @@ CONFIG_MTD_IXP2000=y
|
|||
#
|
||||
# CONFIG_MTD_NAND is not set
|
||||
|
||||
#
|
||||
# OneNAND Flash Device Drivers
|
||||
#
|
||||
# CONFIG_MTD_ONENAND is not set
|
||||
|
||||
#
|
||||
# Parallel port support
|
||||
#
|
||||
|
@ -359,21 +396,13 @@ CONFIG_BLK_DEV_RAM=y
|
|||
CONFIG_BLK_DEV_RAM_COUNT=16
|
||||
CONFIG_BLK_DEV_RAM_SIZE=8192
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
# CONFIG_CDROM_PKTCDVD is not set
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
#
|
||||
CONFIG_IOSCHED_NOOP=y
|
||||
CONFIG_IOSCHED_AS=y
|
||||
CONFIG_IOSCHED_DEADLINE=y
|
||||
CONFIG_IOSCHED_CFQ=y
|
||||
# CONFIG_ATA_OVER_ETH is not set
|
||||
|
||||
#
|
||||
# SCSI device support
|
||||
#
|
||||
# CONFIG_RAID_ATTRS is not set
|
||||
# CONFIG_SCSI is not set
|
||||
|
||||
#
|
||||
|
@ -410,6 +439,11 @@ CONFIG_DUMMY=y
|
|||
#
|
||||
# CONFIG_ARCNET is not set
|
||||
|
||||
#
|
||||
# PHY device support
|
||||
#
|
||||
# CONFIG_PHYLIB is not set
|
||||
|
||||
#
|
||||
# Ethernet (10 or 100Mbit)
|
||||
#
|
||||
|
@ -417,6 +451,7 @@ CONFIG_NET_ETHERNET=y
|
|||
CONFIG_MII=y
|
||||
# CONFIG_HAPPYMEAL is not set
|
||||
# CONFIG_SUNGEM is not set
|
||||
# CONFIG_CASSINI is not set
|
||||
# CONFIG_NET_VENDOR_3COM is not set
|
||||
# CONFIG_SMC91X is not set
|
||||
# CONFIG_DM9000 is not set
|
||||
|
@ -457,6 +492,7 @@ CONFIG_EEPRO100=y
|
|||
# CONFIG_HAMACHI is not set
|
||||
# CONFIG_YELLOWFIN is not set
|
||||
# CONFIG_R8169 is not set
|
||||
# CONFIG_SIS190 is not set
|
||||
# CONFIG_SKGE is not set
|
||||
# CONFIG_SK98LIN is not set
|
||||
# CONFIG_VIA_VELOCITY is not set
|
||||
|
@ -466,6 +502,7 @@ CONFIG_EEPRO100=y
|
|||
#
|
||||
# Ethernet (10000 Mbit)
|
||||
#
|
||||
# CONFIG_CHELSIO_T1 is not set
|
||||
# CONFIG_IXGB is not set
|
||||
# CONFIG_S2IO is not set
|
||||
|
||||
|
@ -611,6 +648,7 @@ CONFIG_IXP2000_WATCHDOG=y
|
|||
# TPM devices
|
||||
#
|
||||
# CONFIG_TCG_TPM is not set
|
||||
# CONFIG_TELCLOCK is not set
|
||||
|
||||
#
|
||||
# I2C support
|
||||
|
@ -636,7 +674,6 @@ CONFIG_I2C_ALGOBIT=y
|
|||
# CONFIG_I2C_I801 is not set
|
||||
# CONFIG_I2C_I810 is not set
|
||||
# CONFIG_I2C_PIIX4 is not set
|
||||
# CONFIG_I2C_ISA is not set
|
||||
CONFIG_I2C_IXP2000=y
|
||||
# CONFIG_I2C_NFORCE2 is not set
|
||||
# CONFIG_I2C_PARPORT_LIGHT is not set
|
||||
|
@ -651,7 +688,6 @@ CONFIG_I2C_IXP2000=y
|
|||
# CONFIG_I2C_VIAPRO is not set
|
||||
# CONFIG_I2C_VOODOO3 is not set
|
||||
# CONFIG_I2C_PCA_ISA is not set
|
||||
CONFIG_I2C_SENSOR=y
|
||||
|
||||
#
|
||||
# Miscellaneous I2C Chip support
|
||||
|
@ -664,6 +700,7 @@ CONFIG_SENSORS_EEPROM=y
|
|||
# CONFIG_SENSORS_PCF8591 is not set
|
||||
# CONFIG_SENSORS_RTC8564 is not set
|
||||
# CONFIG_SENSORS_MAX6875 is not set
|
||||
# CONFIG_RTC_X1205_I2C is not set
|
||||
# CONFIG_I2C_DEBUG_CORE is not set
|
||||
# CONFIG_I2C_DEBUG_ALGO is not set
|
||||
# CONFIG_I2C_DEBUG_BUS is not set
|
||||
|
@ -673,6 +710,7 @@ CONFIG_SENSORS_EEPROM=y
|
|||
# Hardware Monitoring support
|
||||
#
|
||||
CONFIG_HWMON=y
|
||||
# CONFIG_HWMON_VID is not set
|
||||
# CONFIG_SENSORS_ADM1021 is not set
|
||||
# CONFIG_SENSORS_ADM1025 is not set
|
||||
# CONFIG_SENSORS_ADM1026 is not set
|
||||
|
@ -703,6 +741,7 @@ CONFIG_HWMON=y
|
|||
# CONFIG_SENSORS_SMSC47B397 is not set
|
||||
# CONFIG_SENSORS_VIA686A is not set
|
||||
# CONFIG_SENSORS_W83781D is not set
|
||||
# CONFIG_SENSORS_W83792D is not set
|
||||
# CONFIG_SENSORS_W83L785TS is not set
|
||||
# CONFIG_SENSORS_W83627HF is not set
|
||||
# CONFIG_SENSORS_W83627EHF is not set
|
||||
|
@ -712,6 +751,10 @@ CONFIG_HWMON=y
|
|||
# Misc devices
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia Capabilities Port drivers
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
#
|
||||
|
@ -739,6 +782,10 @@ CONFIG_USB_ARCH_HAS_HCD=y
|
|||
CONFIG_USB_ARCH_HAS_OHCI=y
|
||||
# CONFIG_USB is not set
|
||||
|
||||
#
|
||||
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
|
||||
#
|
||||
|
||||
#
|
||||
# USB Gadget Support
|
||||
#
|
||||
|
@ -767,10 +814,6 @@ CONFIG_FS_MBCACHE=y
|
|||
# CONFIG_REISERFS_FS is not set
|
||||
# CONFIG_JFS_FS is not set
|
||||
CONFIG_FS_POSIX_ACL=y
|
||||
|
||||
#
|
||||
# XFS support
|
||||
#
|
||||
# CONFIG_XFS_FS is not set
|
||||
# CONFIG_MINIX_FS is not set
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
|
@ -779,6 +822,7 @@ CONFIG_INOTIFY=y
|
|||
CONFIG_DNOTIFY=y
|
||||
# CONFIG_AUTOFS_FS is not set
|
||||
# CONFIG_AUTOFS4_FS is not set
|
||||
# CONFIG_FUSE_FS is not set
|
||||
|
||||
#
|
||||
# CD-ROM/DVD Filesystems
|
||||
|
@ -798,11 +842,10 @@ CONFIG_DNOTIFY=y
|
|||
#
|
||||
CONFIG_PROC_FS=y
|
||||
CONFIG_SYSFS=y
|
||||
# CONFIG_DEVPTS_FS_XATTR is not set
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_TMPFS_XATTR is not set
|
||||
# CONFIG_HUGETLB_PAGE is not set
|
||||
CONFIG_RAMFS=y
|
||||
# CONFIG_RELAYFS_FS is not set
|
||||
|
||||
#
|
||||
# Miscellaneous filesystems
|
||||
|
@ -818,6 +861,7 @@ CONFIG_RAMFS=y
|
|||
CONFIG_JFFS2_FS=y
|
||||
CONFIG_JFFS2_FS_DEBUG=0
|
||||
CONFIG_JFFS2_FS_WRITEBUFFER=y
|
||||
# CONFIG_JFFS2_SUMMARY is not set
|
||||
# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
|
||||
CONFIG_JFFS2_ZLIB=y
|
||||
CONFIG_JFFS2_RTIME=y
|
||||
|
@ -850,6 +894,7 @@ CONFIG_SUNRPC=y
|
|||
# CONFIG_NCP_FS is not set
|
||||
# CONFIG_CODA_FS is not set
|
||||
# CONFIG_AFS_FS is not set
|
||||
# CONFIG_9P_FS is not set
|
||||
|
||||
#
|
||||
# Partition Types
|
||||
|
@ -888,6 +933,7 @@ CONFIG_MSDOS_PARTITION=y
|
|||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_LOG_BUF_SHIFT=14
|
||||
CONFIG_DETECT_SOFTLOCKUP=y
|
||||
# CONFIG_SCHEDSTATS is not set
|
||||
# CONFIG_DEBUG_SLAB is not set
|
||||
# CONFIG_DEBUG_SPINLOCK is not set
|
||||
|
@ -896,7 +942,9 @@ CONFIG_LOG_BUF_SHIFT=14
|
|||
CONFIG_DEBUG_BUGVERBOSE=y
|
||||
# CONFIG_DEBUG_INFO is not set
|
||||
# CONFIG_DEBUG_FS is not set
|
||||
# CONFIG_DEBUG_VM is not set
|
||||
CONFIG_FRAME_POINTER=y
|
||||
# CONFIG_RCU_TORTURE_TEST is not set
|
||||
CONFIG_DEBUG_USER=y
|
||||
# CONFIG_DEBUG_WAITQ is not set
|
||||
CONFIG_DEBUG_ERRORS=y
|
||||
|
@ -922,6 +970,7 @@ CONFIG_DEBUG_LL=y
|
|||
# Library routines
|
||||
#
|
||||
# CONFIG_CRC_CCITT is not set
|
||||
# CONFIG_CRC16 is not set
|
||||
CONFIG_CRC32=y
|
||||
# CONFIG_LIBCRC32C is not set
|
||||
CONFIG_ZLIB_INFLATE=y
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.13
|
||||
# Wed Sep 14 10:52:23 2005
|
||||
# Linux kernel version: 2.6.14-git13
|
||||
# Thu Nov 10 15:14:56 2005
|
||||
#
|
||||
CONFIG_ARM=y
|
||||
CONFIG_MMU=y
|
||||
|
@ -21,6 +21,7 @@ CONFIG_INIT_ENV_ARG_LIMIT=32
|
|||
# General setup
|
||||
#
|
||||
CONFIG_LOCALVERSION=""
|
||||
CONFIG_LOCALVERSION_AUTO=y
|
||||
CONFIG_SWAP=y
|
||||
CONFIG_SYSVIPC=y
|
||||
# CONFIG_POSIX_MQUEUE is not set
|
||||
|
@ -31,6 +32,7 @@ CONFIG_SYSCTL=y
|
|||
# CONFIG_HOTPLUG is not set
|
||||
CONFIG_KOBJECT_UEVENT=y
|
||||
# CONFIG_IKCONFIG is not set
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_EMBEDDED=y
|
||||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_ALL is not set
|
||||
|
@ -60,6 +62,23 @@ CONFIG_OBSOLETE_MODPARM=y
|
|||
# CONFIG_MODULE_SRCVERSION_ALL is not set
|
||||
CONFIG_KMOD=y
|
||||
|
||||
#
|
||||
# Block layer
|
||||
#
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
#
|
||||
CONFIG_IOSCHED_NOOP=y
|
||||
CONFIG_IOSCHED_AS=y
|
||||
CONFIG_IOSCHED_DEADLINE=y
|
||||
CONFIG_IOSCHED_CFQ=y
|
||||
CONFIG_DEFAULT_AS=y
|
||||
# CONFIG_DEFAULT_DEADLINE is not set
|
||||
# CONFIG_DEFAULT_CFQ is not set
|
||||
# CONFIG_DEFAULT_NOOP is not set
|
||||
CONFIG_DEFAULT_IOSCHED="anticipatory"
|
||||
|
||||
#
|
||||
# System Type
|
||||
#
|
||||
|
@ -82,6 +101,7 @@ CONFIG_ARCH_IXP2000=y
|
|||
# CONFIG_ARCH_LH7A40X is not set
|
||||
# CONFIG_ARCH_OMAP is not set
|
||||
# CONFIG_ARCH_VERSATILE is not set
|
||||
# CONFIG_ARCH_REALVIEW is not set
|
||||
# CONFIG_ARCH_IMX is not set
|
||||
# CONFIG_ARCH_H720X is not set
|
||||
# CONFIG_ARCH_AAEC2000 is not set
|
||||
|
@ -125,7 +145,6 @@ CONFIG_XSCALE_PMU=y
|
|||
CONFIG_ISA_DMA_API=y
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PCI_LEGACY_PROC=y
|
||||
CONFIG_PCI_NAMES=y
|
||||
# CONFIG_PCI_DEBUG is not set
|
||||
|
||||
#
|
||||
|
@ -145,6 +164,8 @@ CONFIG_FLATMEM_MANUAL=y
|
|||
# CONFIG_SPARSEMEM_MANUAL is not set
|
||||
CONFIG_FLATMEM=y
|
||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
# CONFIG_SPARSEMEM_STATIC is not set
|
||||
CONFIG_SPLIT_PTLOCK_CPUS=4096
|
||||
CONFIG_ALIGNMENT_TRAP=y
|
||||
|
||||
#
|
||||
|
@ -163,6 +184,7 @@ CONFIG_CMDLINE="console=ttyS0,9600 root=/dev/nfs ip=bootp mem=64M@0x0"
|
|||
# At least one emulation must be selected
|
||||
#
|
||||
CONFIG_FPE_NWFPE=y
|
||||
CONFIG_FPE_NWFPE_XP=y
|
||||
# CONFIG_FPE_FASTFPE is not set
|
||||
|
||||
#
|
||||
|
@ -206,13 +228,18 @@ CONFIG_SYN_COOKIES=y
|
|||
# CONFIG_INET_ESP is not set
|
||||
# CONFIG_INET_IPCOMP is not set
|
||||
# CONFIG_INET_TUNNEL is not set
|
||||
# CONFIG_IP_TCPDIAG is not set
|
||||
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
||||
CONFIG_INET_DIAG=y
|
||||
CONFIG_INET_TCP_DIAG=y
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_NETFILTER is not set
|
||||
|
||||
#
|
||||
# DCCP Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_IP_DCCP is not set
|
||||
|
||||
#
|
||||
# SCTP Configuration (EXPERIMENTAL)
|
||||
#
|
||||
|
@ -229,6 +256,10 @@ CONFIG_TCP_CONG_BIC=y
|
|||
# CONFIG_NET_DIVERT is not set
|
||||
# CONFIG_ECONET is not set
|
||||
# CONFIG_WAN_ROUTER is not set
|
||||
|
||||
#
|
||||
# QoS and/or fair queueing
|
||||
#
|
||||
# CONFIG_NET_SCHED is not set
|
||||
# CONFIG_NET_CLS_ROUTE is not set
|
||||
|
||||
|
@ -239,6 +270,7 @@ CONFIG_TCP_CONG_BIC=y
|
|||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
# CONFIG_IEEE80211 is not set
|
||||
|
||||
#
|
||||
# Device Drivers
|
||||
|
@ -274,6 +306,7 @@ CONFIG_MTD_BLOCK=y
|
|||
# CONFIG_FTL is not set
|
||||
# CONFIG_NFTL is not set
|
||||
# CONFIG_INFTL is not set
|
||||
# CONFIG_RFD_FTL is not set
|
||||
|
||||
#
|
||||
# RAM/ROM/Flash chip drivers
|
||||
|
@ -308,7 +341,6 @@ CONFIG_MTD_COMPLEX_MAPPINGS=y
|
|||
# CONFIG_MTD_PHYSMAP is not set
|
||||
# CONFIG_MTD_ARM_INTEGRATOR is not set
|
||||
CONFIG_MTD_IXP2000=y
|
||||
# CONFIG_MTD_EDB7312 is not set
|
||||
# CONFIG_MTD_PCI is not set
|
||||
# CONFIG_MTD_PLATRAM is not set
|
||||
|
||||
|
@ -334,6 +366,11 @@ CONFIG_MTD_IXP2000=y
|
|||
#
|
||||
# CONFIG_MTD_NAND is not set
|
||||
|
||||
#
|
||||
# OneNAND Flash Device Drivers
|
||||
#
|
||||
# CONFIG_MTD_ONENAND is not set
|
||||
|
||||
#
|
||||
# Parallel port support
|
||||
#
|
||||
|
@ -359,21 +396,13 @@ CONFIG_BLK_DEV_RAM=y
|
|||
CONFIG_BLK_DEV_RAM_COUNT=16
|
||||
CONFIG_BLK_DEV_RAM_SIZE=8192
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
# CONFIG_CDROM_PKTCDVD is not set
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
#
|
||||
CONFIG_IOSCHED_NOOP=y
|
||||
CONFIG_IOSCHED_AS=y
|
||||
CONFIG_IOSCHED_DEADLINE=y
|
||||
CONFIG_IOSCHED_CFQ=y
|
||||
# CONFIG_ATA_OVER_ETH is not set
|
||||
|
||||
#
|
||||
# SCSI device support
|
||||
#
|
||||
# CONFIG_RAID_ATTRS is not set
|
||||
# CONFIG_SCSI is not set
|
||||
|
||||
#
|
||||
|
@ -410,6 +439,11 @@ CONFIG_DUMMY=y
|
|||
#
|
||||
# CONFIG_ARCNET is not set
|
||||
|
||||
#
|
||||
# PHY device support
|
||||
#
|
||||
# CONFIG_PHYLIB is not set
|
||||
|
||||
#
|
||||
# Ethernet (10 or 100Mbit)
|
||||
#
|
||||
|
@ -417,6 +451,7 @@ CONFIG_NET_ETHERNET=y
|
|||
CONFIG_MII=y
|
||||
# CONFIG_HAPPYMEAL is not set
|
||||
# CONFIG_SUNGEM is not set
|
||||
# CONFIG_CASSINI is not set
|
||||
# CONFIG_NET_VENDOR_3COM is not set
|
||||
# CONFIG_SMC91X is not set
|
||||
# CONFIG_DM9000 is not set
|
||||
|
@ -456,6 +491,7 @@ CONFIG_EEPRO100=y
|
|||
# CONFIG_HAMACHI is not set
|
||||
# CONFIG_YELLOWFIN is not set
|
||||
# CONFIG_R8169 is not set
|
||||
# CONFIG_SIS190 is not set
|
||||
# CONFIG_SKGE is not set
|
||||
# CONFIG_SK98LIN is not set
|
||||
# CONFIG_VIA_VELOCITY is not set
|
||||
|
@ -465,6 +501,7 @@ CONFIG_EEPRO100=y
|
|||
#
|
||||
# Ethernet (10000 Mbit)
|
||||
#
|
||||
# CONFIG_CHELSIO_T1 is not set
|
||||
# CONFIG_IXGB is not set
|
||||
# CONFIG_S2IO is not set
|
||||
|
||||
|
@ -610,6 +647,7 @@ CONFIG_IXP2000_WATCHDOG=y
|
|||
# TPM devices
|
||||
#
|
||||
# CONFIG_TCG_TPM is not set
|
||||
# CONFIG_TELCLOCK is not set
|
||||
|
||||
#
|
||||
# I2C support
|
||||
|
@ -635,7 +673,6 @@ CONFIG_I2C_ALGOBIT=y
|
|||
# CONFIG_I2C_I801 is not set
|
||||
# CONFIG_I2C_I810 is not set
|
||||
# CONFIG_I2C_PIIX4 is not set
|
||||
# CONFIG_I2C_ISA is not set
|
||||
CONFIG_I2C_IXP2000=y
|
||||
# CONFIG_I2C_NFORCE2 is not set
|
||||
# CONFIG_I2C_PARPORT_LIGHT is not set
|
||||
|
@ -650,7 +687,6 @@ CONFIG_I2C_IXP2000=y
|
|||
# CONFIG_I2C_VIAPRO is not set
|
||||
# CONFIG_I2C_VOODOO3 is not set
|
||||
# CONFIG_I2C_PCA_ISA is not set
|
||||
CONFIG_I2C_SENSOR=y
|
||||
|
||||
#
|
||||
# Miscellaneous I2C Chip support
|
||||
|
@ -663,6 +699,7 @@ CONFIG_SENSORS_EEPROM=y
|
|||
# CONFIG_SENSORS_PCF8591 is not set
|
||||
# CONFIG_SENSORS_RTC8564 is not set
|
||||
# CONFIG_SENSORS_MAX6875 is not set
|
||||
# CONFIG_RTC_X1205_I2C is not set
|
||||
# CONFIG_I2C_DEBUG_CORE is not set
|
||||
# CONFIG_I2C_DEBUG_ALGO is not set
|
||||
# CONFIG_I2C_DEBUG_BUS is not set
|
||||
|
@ -672,6 +709,7 @@ CONFIG_SENSORS_EEPROM=y
|
|||
# Hardware Monitoring support
|
||||
#
|
||||
CONFIG_HWMON=y
|
||||
# CONFIG_HWMON_VID is not set
|
||||
# CONFIG_SENSORS_ADM1021 is not set
|
||||
# CONFIG_SENSORS_ADM1025 is not set
|
||||
# CONFIG_SENSORS_ADM1026 is not set
|
||||
|
@ -702,6 +740,7 @@ CONFIG_HWMON=y
|
|||
# CONFIG_SENSORS_SMSC47B397 is not set
|
||||
# CONFIG_SENSORS_VIA686A is not set
|
||||
# CONFIG_SENSORS_W83781D is not set
|
||||
# CONFIG_SENSORS_W83792D is not set
|
||||
# CONFIG_SENSORS_W83L785TS is not set
|
||||
# CONFIG_SENSORS_W83627HF is not set
|
||||
# CONFIG_SENSORS_W83627EHF is not set
|
||||
|
@ -711,6 +750,10 @@ CONFIG_HWMON=y
|
|||
# Misc devices
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia Capabilities Port drivers
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
#
|
||||
|
@ -738,6 +781,10 @@ CONFIG_USB_ARCH_HAS_HCD=y
|
|||
CONFIG_USB_ARCH_HAS_OHCI=y
|
||||
# CONFIG_USB is not set
|
||||
|
||||
#
|
||||
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
|
||||
#
|
||||
|
||||
#
|
||||
# USB Gadget Support
|
||||
#
|
||||
|
@ -766,10 +813,6 @@ CONFIG_FS_MBCACHE=y
|
|||
# CONFIG_REISERFS_FS is not set
|
||||
# CONFIG_JFS_FS is not set
|
||||
CONFIG_FS_POSIX_ACL=y
|
||||
|
||||
#
|
||||
# XFS support
|
||||
#
|
||||
# CONFIG_XFS_FS is not set
|
||||
# CONFIG_MINIX_FS is not set
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
|
@ -778,6 +821,7 @@ CONFIG_INOTIFY=y
|
|||
CONFIG_DNOTIFY=y
|
||||
# CONFIG_AUTOFS_FS is not set
|
||||
# CONFIG_AUTOFS4_FS is not set
|
||||
# CONFIG_FUSE_FS is not set
|
||||
|
||||
#
|
||||
# CD-ROM/DVD Filesystems
|
||||
|
@ -797,11 +841,10 @@ CONFIG_DNOTIFY=y
|
|||
#
|
||||
CONFIG_PROC_FS=y
|
||||
CONFIG_SYSFS=y
|
||||
# CONFIG_DEVPTS_FS_XATTR is not set
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_TMPFS_XATTR is not set
|
||||
# CONFIG_HUGETLB_PAGE is not set
|
||||
CONFIG_RAMFS=y
|
||||
# CONFIG_RELAYFS_FS is not set
|
||||
|
||||
#
|
||||
# Miscellaneous filesystems
|
||||
|
@ -817,6 +860,7 @@ CONFIG_RAMFS=y
|
|||
CONFIG_JFFS2_FS=y
|
||||
CONFIG_JFFS2_FS_DEBUG=0
|
||||
CONFIG_JFFS2_FS_WRITEBUFFER=y
|
||||
# CONFIG_JFFS2_SUMMARY is not set
|
||||
# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
|
||||
CONFIG_JFFS2_ZLIB=y
|
||||
CONFIG_JFFS2_RTIME=y
|
||||
|
@ -849,6 +893,7 @@ CONFIG_SUNRPC=y
|
|||
# CONFIG_NCP_FS is not set
|
||||
# CONFIG_CODA_FS is not set
|
||||
# CONFIG_AFS_FS is not set
|
||||
# CONFIG_9P_FS is not set
|
||||
|
||||
#
|
||||
# Partition Types
|
||||
|
@ -887,6 +932,7 @@ CONFIG_MSDOS_PARTITION=y
|
|||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_LOG_BUF_SHIFT=14
|
||||
CONFIG_DETECT_SOFTLOCKUP=y
|
||||
# CONFIG_SCHEDSTATS is not set
|
||||
# CONFIG_DEBUG_SLAB is not set
|
||||
# CONFIG_DEBUG_SPINLOCK is not set
|
||||
|
@ -895,7 +941,9 @@ CONFIG_LOG_BUF_SHIFT=14
|
|||
CONFIG_DEBUG_BUGVERBOSE=y
|
||||
# CONFIG_DEBUG_INFO is not set
|
||||
# CONFIG_DEBUG_FS is not set
|
||||
# CONFIG_DEBUG_VM is not set
|
||||
CONFIG_FRAME_POINTER=y
|
||||
# CONFIG_RCU_TORTURE_TEST is not set
|
||||
CONFIG_DEBUG_USER=y
|
||||
# CONFIG_DEBUG_WAITQ is not set
|
||||
CONFIG_DEBUG_ERRORS=y
|
||||
|
@ -921,6 +969,7 @@ CONFIG_DEBUG_LL=y
|
|||
# Library routines
|
||||
#
|
||||
# CONFIG_CRC_CCITT is not set
|
||||
# CONFIG_CRC16 is not set
|
||||
CONFIG_CRC32=y
|
||||
# CONFIG_LIBCRC32C is not set
|
||||
CONFIG_ZLIB_INFLATE=y
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.13
|
||||
# Wed Sep 14 10:52:16 2005
|
||||
# Linux kernel version: 2.6.14-git13
|
||||
# Thu Nov 10 15:15:03 2005
|
||||
#
|
||||
CONFIG_ARM=y
|
||||
CONFIG_MMU=y
|
||||
|
@ -21,6 +21,7 @@ CONFIG_INIT_ENV_ARG_LIMIT=32
|
|||
# General setup
|
||||
#
|
||||
CONFIG_LOCALVERSION=""
|
||||
CONFIG_LOCALVERSION_AUTO=y
|
||||
CONFIG_SWAP=y
|
||||
CONFIG_SYSVIPC=y
|
||||
# CONFIG_POSIX_MQUEUE is not set
|
||||
|
@ -31,6 +32,7 @@ CONFIG_SYSCTL=y
|
|||
# CONFIG_HOTPLUG is not set
|
||||
CONFIG_KOBJECT_UEVENT=y
|
||||
# CONFIG_IKCONFIG is not set
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_EMBEDDED=y
|
||||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_ALL is not set
|
||||
|
@ -60,6 +62,23 @@ CONFIG_OBSOLETE_MODPARM=y
|
|||
# CONFIG_MODULE_SRCVERSION_ALL is not set
|
||||
CONFIG_KMOD=y
|
||||
|
||||
#
|
||||
# Block layer
|
||||
#
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
#
|
||||
CONFIG_IOSCHED_NOOP=y
|
||||
CONFIG_IOSCHED_AS=y
|
||||
CONFIG_IOSCHED_DEADLINE=y
|
||||
CONFIG_IOSCHED_CFQ=y
|
||||
CONFIG_DEFAULT_AS=y
|
||||
# CONFIG_DEFAULT_DEADLINE is not set
|
||||
# CONFIG_DEFAULT_CFQ is not set
|
||||
# CONFIG_DEFAULT_NOOP is not set
|
||||
CONFIG_DEFAULT_IOSCHED="anticipatory"
|
||||
|
||||
#
|
||||
# System Type
|
||||
#
|
||||
|
@ -82,6 +101,7 @@ CONFIG_ARCH_IXP2000=y
|
|||
# CONFIG_ARCH_LH7A40X is not set
|
||||
# CONFIG_ARCH_OMAP is not set
|
||||
# CONFIG_ARCH_VERSATILE is not set
|
||||
# CONFIG_ARCH_REALVIEW is not set
|
||||
# CONFIG_ARCH_IMX is not set
|
||||
# CONFIG_ARCH_H720X is not set
|
||||
# CONFIG_ARCH_AAEC2000 is not set
|
||||
|
@ -125,7 +145,6 @@ CONFIG_XSCALE_PMU=y
|
|||
CONFIG_ISA_DMA_API=y
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PCI_LEGACY_PROC=y
|
||||
CONFIG_PCI_NAMES=y
|
||||
# CONFIG_PCI_DEBUG is not set
|
||||
|
||||
#
|
||||
|
@ -145,6 +164,8 @@ CONFIG_FLATMEM_MANUAL=y
|
|||
# CONFIG_SPARSEMEM_MANUAL is not set
|
||||
CONFIG_FLATMEM=y
|
||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
# CONFIG_SPARSEMEM_STATIC is not set
|
||||
CONFIG_SPLIT_PTLOCK_CPUS=4096
|
||||
CONFIG_ALIGNMENT_TRAP=y
|
||||
|
||||
#
|
||||
|
@ -163,6 +184,7 @@ CONFIG_CMDLINE="console=ttyS0,115200 root=/dev/nfs ip=bootp mem=64M@0x0 pci=firm
|
|||
# At least one emulation must be selected
|
||||
#
|
||||
CONFIG_FPE_NWFPE=y
|
||||
CONFIG_FPE_NWFPE_XP=y
|
||||
# CONFIG_FPE_FASTFPE is not set
|
||||
|
||||
#
|
||||
|
@ -206,13 +228,18 @@ CONFIG_SYN_COOKIES=y
|
|||
# CONFIG_INET_ESP is not set
|
||||
# CONFIG_INET_IPCOMP is not set
|
||||
# CONFIG_INET_TUNNEL is not set
|
||||
# CONFIG_IP_TCPDIAG is not set
|
||||
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
||||
CONFIG_INET_DIAG=y
|
||||
CONFIG_INET_TCP_DIAG=y
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_NETFILTER is not set
|
||||
|
||||
#
|
||||
# DCCP Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_IP_DCCP is not set
|
||||
|
||||
#
|
||||
# SCTP Configuration (EXPERIMENTAL)
|
||||
#
|
||||
|
@ -229,6 +256,10 @@ CONFIG_TCP_CONG_BIC=y
|
|||
# CONFIG_NET_DIVERT is not set
|
||||
# CONFIG_ECONET is not set
|
||||
# CONFIG_WAN_ROUTER is not set
|
||||
|
||||
#
|
||||
# QoS and/or fair queueing
|
||||
#
|
||||
# CONFIG_NET_SCHED is not set
|
||||
# CONFIG_NET_CLS_ROUTE is not set
|
||||
|
||||
|
@ -239,6 +270,7 @@ CONFIG_TCP_CONG_BIC=y
|
|||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
# CONFIG_IEEE80211 is not set
|
||||
|
||||
#
|
||||
# Device Drivers
|
||||
|
@ -274,6 +306,7 @@ CONFIG_MTD_BLOCK=y
|
|||
# CONFIG_FTL is not set
|
||||
# CONFIG_NFTL is not set
|
||||
# CONFIG_INFTL is not set
|
||||
# CONFIG_RFD_FTL is not set
|
||||
|
||||
#
|
||||
# RAM/ROM/Flash chip drivers
|
||||
|
@ -308,7 +341,6 @@ CONFIG_MTD_COMPLEX_MAPPINGS=y
|
|||
# CONFIG_MTD_PHYSMAP is not set
|
||||
# CONFIG_MTD_ARM_INTEGRATOR is not set
|
||||
CONFIG_MTD_IXP2000=y
|
||||
# CONFIG_MTD_EDB7312 is not set
|
||||
# CONFIG_MTD_PCI is not set
|
||||
# CONFIG_MTD_PLATRAM is not set
|
||||
|
||||
|
@ -334,6 +366,11 @@ CONFIG_MTD_IXP2000=y
|
|||
#
|
||||
# CONFIG_MTD_NAND is not set
|
||||
|
||||
#
|
||||
# OneNAND Flash Device Drivers
|
||||
#
|
||||
# CONFIG_MTD_ONENAND is not set
|
||||
|
||||
#
|
||||
# Parallel port support
|
||||
#
|
||||
|
@ -359,21 +396,13 @@ CONFIG_BLK_DEV_RAM=y
|
|||
CONFIG_BLK_DEV_RAM_COUNT=16
|
||||
CONFIG_BLK_DEV_RAM_SIZE=8192
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
# CONFIG_CDROM_PKTCDVD is not set
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
#
|
||||
CONFIG_IOSCHED_NOOP=y
|
||||
CONFIG_IOSCHED_AS=y
|
||||
CONFIG_IOSCHED_DEADLINE=y
|
||||
CONFIG_IOSCHED_CFQ=y
|
||||
# CONFIG_ATA_OVER_ETH is not set
|
||||
|
||||
#
|
||||
# SCSI device support
|
||||
#
|
||||
# CONFIG_RAID_ATTRS is not set
|
||||
# CONFIG_SCSI is not set
|
||||
|
||||
#
|
||||
|
@ -410,6 +439,11 @@ CONFIG_DUMMY=y
|
|||
#
|
||||
# CONFIG_ARCNET is not set
|
||||
|
||||
#
|
||||
# PHY device support
|
||||
#
|
||||
# CONFIG_PHYLIB is not set
|
||||
|
||||
#
|
||||
# Ethernet (10 or 100Mbit)
|
||||
#
|
||||
|
@ -417,6 +451,7 @@ CONFIG_NET_ETHERNET=y
|
|||
CONFIG_MII=y
|
||||
# CONFIG_HAPPYMEAL is not set
|
||||
# CONFIG_SUNGEM is not set
|
||||
# CONFIG_CASSINI is not set
|
||||
# CONFIG_NET_VENDOR_3COM is not set
|
||||
# CONFIG_SMC91X is not set
|
||||
# CONFIG_DM9000 is not set
|
||||
|
@ -457,6 +492,7 @@ CONFIG_EEPRO100=y
|
|||
# CONFIG_HAMACHI is not set
|
||||
# CONFIG_YELLOWFIN is not set
|
||||
# CONFIG_R8169 is not set
|
||||
# CONFIG_SIS190 is not set
|
||||
# CONFIG_SKGE is not set
|
||||
# CONFIG_SK98LIN is not set
|
||||
# CONFIG_VIA_VELOCITY is not set
|
||||
|
@ -466,6 +502,7 @@ CONFIG_EEPRO100=y
|
|||
#
|
||||
# Ethernet (10000 Mbit)
|
||||
#
|
||||
# CONFIG_CHELSIO_T1 is not set
|
||||
# CONFIG_IXGB is not set
|
||||
# CONFIG_S2IO is not set
|
||||
|
||||
|
@ -611,6 +648,7 @@ CONFIG_IXP2000_WATCHDOG=y
|
|||
# TPM devices
|
||||
#
|
||||
# CONFIG_TCG_TPM is not set
|
||||
# CONFIG_TELCLOCK is not set
|
||||
|
||||
#
|
||||
# I2C support
|
||||
|
@ -636,7 +674,6 @@ CONFIG_I2C_ALGOBIT=y
|
|||
# CONFIG_I2C_I801 is not set
|
||||
# CONFIG_I2C_I810 is not set
|
||||
# CONFIG_I2C_PIIX4 is not set
|
||||
# CONFIG_I2C_ISA is not set
|
||||
CONFIG_I2C_IXP2000=y
|
||||
# CONFIG_I2C_NFORCE2 is not set
|
||||
# CONFIG_I2C_PARPORT_LIGHT is not set
|
||||
|
@ -651,7 +688,6 @@ CONFIG_I2C_IXP2000=y
|
|||
# CONFIG_I2C_VIAPRO is not set
|
||||
# CONFIG_I2C_VOODOO3 is not set
|
||||
# CONFIG_I2C_PCA_ISA is not set
|
||||
CONFIG_I2C_SENSOR=y
|
||||
|
||||
#
|
||||
# Miscellaneous I2C Chip support
|
||||
|
@ -664,6 +700,7 @@ CONFIG_SENSORS_EEPROM=y
|
|||
# CONFIG_SENSORS_PCF8591 is not set
|
||||
# CONFIG_SENSORS_RTC8564 is not set
|
||||
# CONFIG_SENSORS_MAX6875 is not set
|
||||
# CONFIG_RTC_X1205_I2C is not set
|
||||
# CONFIG_I2C_DEBUG_CORE is not set
|
||||
# CONFIG_I2C_DEBUG_ALGO is not set
|
||||
# CONFIG_I2C_DEBUG_BUS is not set
|
||||
|
@ -673,6 +710,7 @@ CONFIG_SENSORS_EEPROM=y
|
|||
# Hardware Monitoring support
|
||||
#
|
||||
CONFIG_HWMON=y
|
||||
# CONFIG_HWMON_VID is not set
|
||||
# CONFIG_SENSORS_ADM1021 is not set
|
||||
# CONFIG_SENSORS_ADM1025 is not set
|
||||
# CONFIG_SENSORS_ADM1026 is not set
|
||||
|
@ -703,6 +741,7 @@ CONFIG_HWMON=y
|
|||
# CONFIG_SENSORS_SMSC47B397 is not set
|
||||
# CONFIG_SENSORS_VIA686A is not set
|
||||
# CONFIG_SENSORS_W83781D is not set
|
||||
# CONFIG_SENSORS_W83792D is not set
|
||||
# CONFIG_SENSORS_W83L785TS is not set
|
||||
# CONFIG_SENSORS_W83627HF is not set
|
||||
# CONFIG_SENSORS_W83627EHF is not set
|
||||
|
@ -712,6 +751,10 @@ CONFIG_HWMON=y
|
|||
# Misc devices
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia Capabilities Port drivers
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
#
|
||||
|
@ -739,6 +782,10 @@ CONFIG_USB_ARCH_HAS_HCD=y
|
|||
CONFIG_USB_ARCH_HAS_OHCI=y
|
||||
# CONFIG_USB is not set
|
||||
|
||||
#
|
||||
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
|
||||
#
|
||||
|
||||
#
|
||||
# USB Gadget Support
|
||||
#
|
||||
|
@ -767,10 +814,6 @@ CONFIG_FS_MBCACHE=y
|
|||
# CONFIG_REISERFS_FS is not set
|
||||
# CONFIG_JFS_FS is not set
|
||||
CONFIG_FS_POSIX_ACL=y
|
||||
|
||||
#
|
||||
# XFS support
|
||||
#
|
||||
# CONFIG_XFS_FS is not set
|
||||
# CONFIG_MINIX_FS is not set
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
|
@ -779,6 +822,7 @@ CONFIG_INOTIFY=y
|
|||
CONFIG_DNOTIFY=y
|
||||
# CONFIG_AUTOFS_FS is not set
|
||||
# CONFIG_AUTOFS4_FS is not set
|
||||
# CONFIG_FUSE_FS is not set
|
||||
|
||||
#
|
||||
# CD-ROM/DVD Filesystems
|
||||
|
@ -798,11 +842,10 @@ CONFIG_DNOTIFY=y
|
|||
#
|
||||
CONFIG_PROC_FS=y
|
||||
CONFIG_SYSFS=y
|
||||
# CONFIG_DEVPTS_FS_XATTR is not set
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_TMPFS_XATTR is not set
|
||||
# CONFIG_HUGETLB_PAGE is not set
|
||||
CONFIG_RAMFS=y
|
||||
# CONFIG_RELAYFS_FS is not set
|
||||
|
||||
#
|
||||
# Miscellaneous filesystems
|
||||
|
@ -818,6 +861,7 @@ CONFIG_RAMFS=y
|
|||
CONFIG_JFFS2_FS=y
|
||||
CONFIG_JFFS2_FS_DEBUG=0
|
||||
CONFIG_JFFS2_FS_WRITEBUFFER=y
|
||||
# CONFIG_JFFS2_SUMMARY is not set
|
||||
# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
|
||||
CONFIG_JFFS2_ZLIB=y
|
||||
CONFIG_JFFS2_RTIME=y
|
||||
|
@ -850,6 +894,7 @@ CONFIG_SUNRPC=y
|
|||
# CONFIG_NCP_FS is not set
|
||||
# CONFIG_CODA_FS is not set
|
||||
# CONFIG_AFS_FS is not set
|
||||
# CONFIG_9P_FS is not set
|
||||
|
||||
#
|
||||
# Partition Types
|
||||
|
@ -888,6 +933,7 @@ CONFIG_MSDOS_PARTITION=y
|
|||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_LOG_BUF_SHIFT=14
|
||||
CONFIG_DETECT_SOFTLOCKUP=y
|
||||
# CONFIG_SCHEDSTATS is not set
|
||||
# CONFIG_DEBUG_SLAB is not set
|
||||
# CONFIG_DEBUG_SPINLOCK is not set
|
||||
|
@ -896,7 +942,9 @@ CONFIG_LOG_BUF_SHIFT=14
|
|||
CONFIG_DEBUG_BUGVERBOSE=y
|
||||
# CONFIG_DEBUG_INFO is not set
|
||||
# CONFIG_DEBUG_FS is not set
|
||||
# CONFIG_DEBUG_VM is not set
|
||||
CONFIG_FRAME_POINTER=y
|
||||
# CONFIG_RCU_TORTURE_TEST is not set
|
||||
CONFIG_DEBUG_USER=y
|
||||
# CONFIG_DEBUG_WAITQ is not set
|
||||
CONFIG_DEBUG_ERRORS=y
|
||||
|
@ -922,6 +970,7 @@ CONFIG_DEBUG_LL=y
|
|||
# Library routines
|
||||
#
|
||||
# CONFIG_CRC_CCITT is not set
|
||||
# CONFIG_CRC16 is not set
|
||||
CONFIG_CRC32=y
|
||||
# CONFIG_LIBCRC32C is not set
|
||||
CONFIG_ZLIB_INFLATE=y
|
||||
|
|
|
@ -26,7 +26,7 @@ td1 .req r4 @ save before use
|
|||
td2 .req r5 @ save before use
|
||||
td3 .req lr
|
||||
|
||||
.zero: mov r0, sum
|
||||
.Lzero: mov r0, sum
|
||||
add sp, sp, #4
|
||||
ldr pc, [sp], #4
|
||||
|
||||
|
@ -34,8 +34,8 @@ td3 .req lr
|
|||
* Handle 0 to 7 bytes, with any alignment of source and
|
||||
* destination pointers. Note that when we get here, C = 0
|
||||
*/
|
||||
.less8: teq len, #0 @ check for zero count
|
||||
beq .zero
|
||||
.Lless8: teq len, #0 @ check for zero count
|
||||
beq .Lzero
|
||||
|
||||
/* we must have at least one byte. */
|
||||
tst buf, #1 @ odd address?
|
||||
|
@ -44,12 +44,12 @@ td3 .req lr
|
|||
subne len, len, #1
|
||||
adcnes sum, sum, td0, put_byte_1
|
||||
|
||||
.less4: tst len, #6
|
||||
beq .less8_byte
|
||||
.Lless4: tst len, #6
|
||||
beq .Lless8_byte
|
||||
|
||||
/* we are now half-word aligned */
|
||||
|
||||
.less8_wordlp:
|
||||
.Lless8_wordlp:
|
||||
#if __LINUX_ARM_ARCH__ >= 4
|
||||
ldrh td0, [buf], #2
|
||||
sub len, len, #2
|
||||
|
@ -65,19 +65,19 @@ td3 .req lr
|
|||
#endif
|
||||
adcs sum, sum, td0
|
||||
tst len, #6
|
||||
bne .less8_wordlp
|
||||
bne .Lless8_wordlp
|
||||
|
||||
.less8_byte: tst len, #1 @ odd number of bytes
|
||||
.Lless8_byte: tst len, #1 @ odd number of bytes
|
||||
ldrneb td0, [buf], #1 @ include last byte
|
||||
adcnes sum, sum, td0, put_byte_0 @ update checksum
|
||||
|
||||
.done: adc r0, sum, #0 @ collect up the last carry
|
||||
.Ldone: adc r0, sum, #0 @ collect up the last carry
|
||||
ldr td0, [sp], #4
|
||||
tst td0, #1 @ check buffer alignment
|
||||
movne r0, r0, ror #8 @ rotate checksum by 8 bits
|
||||
ldr pc, [sp], #4 @ return
|
||||
|
||||
.not_aligned: tst buf, #1 @ odd address
|
||||
.Lnot_aligned: tst buf, #1 @ odd address
|
||||
ldrneb td0, [buf], #1 @ make even
|
||||
subne len, len, #1
|
||||
adcnes sum, sum, td0, put_byte_1 @ update checksum
|
||||
|
@ -102,14 +102,14 @@ td3 .req lr
|
|||
ENTRY(csum_partial)
|
||||
stmfd sp!, {buf, lr}
|
||||
cmp len, #8 @ Ensure that we have at least
|
||||
blo .less8 @ 8 bytes to copy.
|
||||
blo .Lless8 @ 8 bytes to copy.
|
||||
|
||||
tst buf, #1
|
||||
movne sum, sum, ror #8
|
||||
|
||||
adds sum, sum, #0 @ C = 0
|
||||
tst buf, #3 @ Test destination alignment
|
||||
blne .not_aligned @ aligh destination, return here
|
||||
blne .Lnot_aligned @ align destination, return here
|
||||
|
||||
1: bics ip, len, #31
|
||||
beq 3f
|
||||
|
@ -131,11 +131,11 @@ ENTRY(csum_partial)
|
|||
ldmfd sp!, {r4 - r5}
|
||||
|
||||
3: tst len, #0x1c @ should not change C
|
||||
beq .less4
|
||||
beq .Lless4
|
||||
|
||||
4: ldr td0, [buf], #4
|
||||
sub len, len, #4
|
||||
adcs sum, sum, td0
|
||||
tst len, #0x1c
|
||||
bne 4b
|
||||
b .less4
|
||||
b .Lless4
|
||||
|
|
|
@ -22,7 +22,7 @@ dst .req r1
|
|||
len .req r2
|
||||
sum .req r3
|
||||
|
||||
.zero: mov r0, sum
|
||||
.Lzero: mov r0, sum
|
||||
load_regs ea
|
||||
|
||||
/*
|
||||
|
@ -31,8 +31,9 @@ sum .req r3
|
|||
* the length. Note that the source pointer hasn't been
|
||||
* aligned yet.
|
||||
*/
|
||||
.dst_unaligned: tst dst, #1
|
||||
beq .dst_16bit
|
||||
.Ldst_unaligned:
|
||||
tst dst, #1
|
||||
beq .Ldst_16bit
|
||||
|
||||
load1b ip
|
||||
sub len, len, #1
|
||||
|
@ -41,7 +42,7 @@ sum .req r3
|
|||
tst dst, #2
|
||||
moveq pc, lr @ dst is now 32bit aligned
|
||||
|
||||
.dst_16bit: load2b r8, ip
|
||||
.Ldst_16bit: load2b r8, ip
|
||||
sub len, len, #2
|
||||
adcs sum, sum, r8, put_byte_0
|
||||
strb r8, [dst], #1
|
||||
|
@ -53,12 +54,12 @@ sum .req r3
|
|||
* Handle 0 to 7 bytes, with any alignment of source and
|
||||
* destination pointers. Note that when we get here, C = 0
|
||||
*/
|
||||
.less8: teq len, #0 @ check for zero count
|
||||
beq .zero
|
||||
.Lless8: teq len, #0 @ check for zero count
|
||||
beq .Lzero
|
||||
|
||||
/* we must have at least one byte. */
|
||||
tst dst, #1 @ dst 16-bit aligned
|
||||
beq .less8_aligned
|
||||
beq .Lless8_aligned
|
||||
|
||||
/* Align dst */
|
||||
load1b ip
|
||||
|
@ -66,7 +67,7 @@ sum .req r3
|
|||
adcs sum, sum, ip, put_byte_1 @ update checksum
|
||||
strb ip, [dst], #1
|
||||
tst len, #6
|
||||
beq .less8_byteonly
|
||||
beq .Lless8_byteonly
|
||||
|
||||
1: load2b r8, ip
|
||||
sub len, len, #2
|
||||
|
@ -74,15 +75,16 @@ sum .req r3
|
|||
strb r8, [dst], #1
|
||||
adcs sum, sum, ip, put_byte_1
|
||||
strb ip, [dst], #1
|
||||
.less8_aligned: tst len, #6
|
||||
.Lless8_aligned:
|
||||
tst len, #6
|
||||
bne 1b
|
||||
.less8_byteonly:
|
||||
.Lless8_byteonly:
|
||||
tst len, #1
|
||||
beq .done
|
||||
beq .Ldone
|
||||
load1b r8
|
||||
adcs sum, sum, r8, put_byte_0 @ update checksum
|
||||
strb r8, [dst], #1
|
||||
b .done
|
||||
b .Ldone
|
||||
|
||||
FN_ENTRY
|
||||
mov ip, sp
|
||||
|
@ -90,11 +92,11 @@ FN_ENTRY
|
|||
sub fp, ip, #4
|
||||
|
||||
cmp len, #8 @ Ensure that we have at least
|
||||
blo .less8 @ 8 bytes to copy.
|
||||
blo .Lless8 @ 8 bytes to copy.
|
||||
|
||||
adds sum, sum, #0 @ C = 0
|
||||
tst dst, #3 @ Test destination alignment
|
||||
blne .dst_unaligned @ align destination, return here
|
||||
blne .Ldst_unaligned @ align destination, return here
|
||||
|
||||
/*
|
||||
* Ok, the dst pointer is now 32bit aligned, and we know
|
||||
|
@ -103,7 +105,7 @@ FN_ENTRY
|
|||
*/
|
||||
|
||||
tst src, #3 @ Test source alignment
|
||||
bne .src_not_aligned
|
||||
bne .Lsrc_not_aligned
|
||||
|
||||
/* Routine for src & dst aligned */
|
||||
|
||||
|
@ -136,17 +138,17 @@ FN_ENTRY
|
|||
adcs sum, sum, r4
|
||||
|
||||
4: ands len, len, #3
|
||||
beq .done
|
||||
beq .Ldone
|
||||
load1l r4
|
||||
tst len, #2
|
||||
mov r5, r4, get_byte_0
|
||||
beq .exit
|
||||
beq .Lexit
|
||||
adcs sum, sum, r4, push #16
|
||||
strb r5, [dst], #1
|
||||
mov r5, r4, get_byte_1
|
||||
strb r5, [dst], #1
|
||||
mov r5, r4, get_byte_2
|
||||
.exit: tst len, #1
|
||||
.Lexit: tst len, #1
|
||||
strneb r5, [dst], #1
|
||||
andne r5, r5, #255
|
||||
adcnes sum, sum, r5, put_byte_0
|
||||
|
@ -157,20 +159,20 @@ FN_ENTRY
|
|||
* the inefficient byte manipulations in the
|
||||
* architecture independent code.
|
||||
*/
|
||||
.done: adc r0, sum, #0
|
||||
.Ldone: adc r0, sum, #0
|
||||
ldr sum, [sp, #0] @ dst
|
||||
tst sum, #1
|
||||
movne r0, r0, ror #8
|
||||
load_regs ea
|
||||
|
||||
.src_not_aligned:
|
||||
.Lsrc_not_aligned:
|
||||
adc sum, sum, #0 @ include C from dst alignment
|
||||
and ip, src, #3
|
||||
bic src, src, #3
|
||||
load1l r5
|
||||
cmp ip, #2
|
||||
beq .src2_aligned
|
||||
bhi .src3_aligned
|
||||
beq .Lsrc2_aligned
|
||||
bhi .Lsrc3_aligned
|
||||
mov r4, r5, pull #8 @ C = 0
|
||||
bics ip, len, #15
|
||||
beq 2f
|
||||
|
@ -211,18 +213,18 @@ FN_ENTRY
|
|||
adcs sum, sum, r4
|
||||
mov r4, r5, pull #8
|
||||
4: ands len, len, #3
|
||||
beq .done
|
||||
beq .Ldone
|
||||
mov r5, r4, get_byte_0
|
||||
tst len, #2
|
||||
beq .exit
|
||||
beq .Lexit
|
||||
adcs sum, sum, r4, push #16
|
||||
strb r5, [dst], #1
|
||||
mov r5, r4, get_byte_1
|
||||
strb r5, [dst], #1
|
||||
mov r5, r4, get_byte_2
|
||||
b .exit
|
||||
b .Lexit
|
||||
|
||||
.src2_aligned: mov r4, r5, pull #16
|
||||
.Lsrc2_aligned: mov r4, r5, pull #16
|
||||
adds sum, sum, #0
|
||||
bics ip, len, #15
|
||||
beq 2f
|
||||
|
@ -263,20 +265,20 @@ FN_ENTRY
|
|||
adcs sum, sum, r4
|
||||
mov r4, r5, pull #16
|
||||
4: ands len, len, #3
|
||||
beq .done
|
||||
beq .Ldone
|
||||
mov r5, r4, get_byte_0
|
||||
tst len, #2
|
||||
beq .exit
|
||||
beq .Lexit
|
||||
adcs sum, sum, r4
|
||||
strb r5, [dst], #1
|
||||
mov r5, r4, get_byte_1
|
||||
strb r5, [dst], #1
|
||||
tst len, #1
|
||||
beq .done
|
||||
beq .Ldone
|
||||
load1b r5
|
||||
b .exit
|
||||
b .Lexit
|
||||
|
||||
.src3_aligned: mov r4, r5, pull #24
|
||||
.Lsrc3_aligned: mov r4, r5, pull #24
|
||||
adds sum, sum, #0
|
||||
bics ip, len, #15
|
||||
beq 2f
|
||||
|
@ -317,10 +319,10 @@ FN_ENTRY
|
|||
adcs sum, sum, r4
|
||||
mov r4, r5, pull #24
|
||||
4: ands len, len, #3
|
||||
beq .done
|
||||
beq .Ldone
|
||||
mov r5, r4, get_byte_0
|
||||
tst len, #2
|
||||
beq .exit
|
||||
beq .Lexit
|
||||
strb r5, [dst], #1
|
||||
adcs sum, sum, r4
|
||||
load1l r4
|
||||
|
@ -328,4 +330,4 @@ FN_ENTRY
|
|||
strb r5, [dst], #1
|
||||
adcs sum, sum, r4, push #24
|
||||
mov r5, r4, get_byte_1
|
||||
b .exit
|
||||
b .Lexit
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
#include <asm/assembler.h>
|
||||
.text
|
||||
|
||||
LC0: .word loops_per_jiffy
|
||||
.LC0: .word loops_per_jiffy
|
||||
|
||||
/*
|
||||
* 0 <= r0 <= 2000
|
||||
|
@ -21,7 +21,7 @@ ENTRY(__udelay)
|
|||
orr r2, r2, #0x00db
|
||||
mul r0, r2, r0
|
||||
ENTRY(__const_udelay) @ 0 <= r0 <= 0x01ffffff
|
||||
ldr r2, LC0
|
||||
ldr r2, .LC0
|
||||
ldr r2, [r2] @ max = 0x0fffffff
|
||||
mov r0, r0, lsr #11 @ max = 0x00003fff
|
||||
mov r2, r2, lsr #11 @ max = 0x0003ffff
|
||||
|
|
|
@ -27,7 +27,7 @@ ENTRY(_find_first_zero_bit_le)
|
|||
mov r2, #0
|
||||
1: ldrb r3, [r0, r2, lsr #3]
|
||||
eors r3, r3, #0xff @ invert bits
|
||||
bne .found @ any now set - found zero bit
|
||||
bne .L_found @ any now set - found zero bit
|
||||
add r2, r2, #8 @ next bit pointer
|
||||
2: cmp r2, r1 @ any more?
|
||||
blo 1b
|
||||
|
@ -46,7 +46,7 @@ ENTRY(_find_next_zero_bit_le)
|
|||
ldrb r3, [r0, r2, lsr #3]
|
||||
eor r3, r3, #0xff @ now looking for a 1 bit
|
||||
movs r3, r3, lsr ip @ shift off unused bits
|
||||
bne .found
|
||||
bne .L_found
|
||||
orr r2, r2, #7 @ if zero, then no bits here
|
||||
add r2, r2, #1 @ align bit pointer
|
||||
b 2b @ loop for next bit
|
||||
|
@ -61,7 +61,7 @@ ENTRY(_find_first_bit_le)
|
|||
mov r2, #0
|
||||
1: ldrb r3, [r0, r2, lsr #3]
|
||||
movs r3, r3
|
||||
bne .found @ any now set - found zero bit
|
||||
bne .L_found @ any now set - found zero bit
|
||||
add r2, r2, #8 @ next bit pointer
|
||||
2: cmp r2, r1 @ any more?
|
||||
blo 1b
|
||||
|
@ -79,7 +79,7 @@ ENTRY(_find_next_bit_le)
|
|||
beq 1b @ If new byte, goto old routine
|
||||
ldrb r3, [r0, r2, lsr #3]
|
||||
movs r3, r3, lsr ip @ shift off unused bits
|
||||
bne .found
|
||||
bne .L_found
|
||||
orr r2, r2, #7 @ if zero, then no bits here
|
||||
add r2, r2, #1 @ align bit pointer
|
||||
b 2b @ loop for next bit
|
||||
|
@ -93,7 +93,7 @@ ENTRY(_find_first_zero_bit_be)
|
|||
1: eor r3, r2, #0x18 @ big endian byte ordering
|
||||
ldrb r3, [r0, r3, lsr #3]
|
||||
eors r3, r3, #0xff @ invert bits
|
||||
bne .found @ any now set - found zero bit
|
||||
bne .L_found @ any now set - found zero bit
|
||||
add r2, r2, #8 @ next bit pointer
|
||||
2: cmp r2, r1 @ any more?
|
||||
blo 1b
|
||||
|
@ -109,7 +109,7 @@ ENTRY(_find_next_zero_bit_be)
|
|||
ldrb r3, [r0, r3, lsr #3]
|
||||
eor r3, r3, #0xff @ now looking for a 1 bit
|
||||
movs r3, r3, lsr ip @ shift off unused bits
|
||||
bne .found
|
||||
bne .L_found
|
||||
orr r2, r2, #7 @ if zero, then no bits here
|
||||
add r2, r2, #1 @ align bit pointer
|
||||
b 2b @ loop for next bit
|
||||
|
@ -121,7 +121,7 @@ ENTRY(_find_first_bit_be)
|
|||
1: eor r3, r2, #0x18 @ big endian byte ordering
|
||||
ldrb r3, [r0, r3, lsr #3]
|
||||
movs r3, r3
|
||||
bne .found @ any now set - found zero bit
|
||||
bne .L_found @ any now set - found zero bit
|
||||
add r2, r2, #8 @ next bit pointer
|
||||
2: cmp r2, r1 @ any more?
|
||||
blo 1b
|
||||
|
@ -136,7 +136,7 @@ ENTRY(_find_next_bit_be)
|
|||
eor r3, r2, #0x18 @ big endian byte ordering
|
||||
ldrb r3, [r0, r3, lsr #3]
|
||||
movs r3, r3, lsr ip @ shift off unused bits
|
||||
bne .found
|
||||
bne .L_found
|
||||
orr r2, r2, #7 @ if zero, then no bits here
|
||||
add r2, r2, #1 @ align bit pointer
|
||||
b 2b @ loop for next bit
|
||||
|
@ -146,7 +146,7 @@ ENTRY(_find_next_bit_be)
|
|||
/*
|
||||
* One or more bits in the LSB of r3 are assumed to be set.
|
||||
*/
|
||||
.found:
|
||||
.L_found:
|
||||
#if __LINUX_ARM_ARCH__ >= 5
|
||||
rsb r1, r3, #0
|
||||
and r3, r3, r1
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
.text
|
||||
.align
|
||||
|
||||
.iosl_warning:
|
||||
.Liosl_warning:
|
||||
.ascii "<4>insl/outsl not implemented, called from %08lX\0"
|
||||
.align
|
||||
|
||||
|
@ -27,6 +27,6 @@
|
|||
*/
|
||||
ENTRY(insl)
|
||||
ENTRY(outsl)
|
||||
adr r0, .iosl_warning
|
||||
adr r0, .Liosl_warning
|
||||
mov r1, lr
|
||||
b printk
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
|
||||
.insb_align: rsb ip, ip, #4
|
||||
.Linsb_align: rsb ip, ip, #4
|
||||
cmp ip, r2
|
||||
movgt ip, r2
|
||||
cmp ip, #2
|
||||
|
@ -21,20 +21,20 @@
|
|||
ldrgtb r3, [r0]
|
||||
strgtb r3, [r1], #1
|
||||
subs r2, r2, ip
|
||||
bne .insb_aligned
|
||||
bne .Linsb_aligned
|
||||
|
||||
ENTRY(__raw_readsb)
|
||||
teq r2, #0 @ do we have to check for the zero len?
|
||||
moveq pc, lr
|
||||
ands ip, r1, #3
|
||||
bne .insb_align
|
||||
bne .Linsb_align
|
||||
|
||||
.insb_aligned: stmfd sp!, {r4 - r6, lr}
|
||||
.Linsb_aligned: stmfd sp!, {r4 - r6, lr}
|
||||
|
||||
subs r2, r2, #16
|
||||
bmi .insb_no_16
|
||||
bmi .Linsb_no_16
|
||||
|
||||
.insb_16_lp: ldrb r3, [r0]
|
||||
.Linsb_16_lp: ldrb r3, [r0]
|
||||
ldrb r4, [r0]
|
||||
ldrb r5, [r0]
|
||||
mov r3, r3, put_byte_0
|
||||
|
@ -69,13 +69,13 @@ ENTRY(__raw_readsb)
|
|||
stmia r1!, {r3 - r6}
|
||||
|
||||
subs r2, r2, #16
|
||||
bpl .insb_16_lp
|
||||
bpl .Linsb_16_lp
|
||||
|
||||
tst r2, #15
|
||||
LOADREGS(eqfd, sp!, {r4 - r6, pc})
|
||||
|
||||
.insb_no_16: tst r2, #8
|
||||
beq .insb_no_8
|
||||
.Linsb_no_16: tst r2, #8
|
||||
beq .Linsb_no_8
|
||||
|
||||
ldrb r3, [r0]
|
||||
ldrb r4, [r0]
|
||||
|
@ -95,8 +95,8 @@ ENTRY(__raw_readsb)
|
|||
orr r4, r4, ip, put_byte_3
|
||||
stmia r1!, {r3, r4}
|
||||
|
||||
.insb_no_8: tst r2, #4
|
||||
beq .insb_no_4
|
||||
.Linsb_no_8: tst r2, #4
|
||||
beq .Linsb_no_4
|
||||
|
||||
ldrb r3, [r0]
|
||||
ldrb r4, [r0]
|
||||
|
@ -108,7 +108,7 @@ ENTRY(__raw_readsb)
|
|||
orr r3, r3, r6, put_byte_3
|
||||
str r3, [r1], #4
|
||||
|
||||
.insb_no_4: ands r2, r2, #3
|
||||
.Linsb_no_4: ands r2, r2, #3
|
||||
LOADREGS(eqfd, sp!, {r4 - r6, pc})
|
||||
|
||||
cmp r2, #2
|
||||
|
|
|
@ -11,16 +11,16 @@
|
|||
#include <asm/assembler.h>
|
||||
#include <asm/hardware.h>
|
||||
|
||||
.insw_bad_alignment:
|
||||
adr r0, .insw_bad_align_msg
|
||||
.Linsw_bad_alignment:
|
||||
adr r0, .Linsw_bad_align_msg
|
||||
mov r2, lr
|
||||
b panic
|
||||
.insw_bad_align_msg:
|
||||
.Linsw_bad_align_msg:
|
||||
.asciz "insw: bad buffer alignment (0x%p, lr=0x%08lX)\n"
|
||||
.align
|
||||
|
||||
.insw_align: tst r1, #1
|
||||
bne .insw_bad_alignment
|
||||
.Linsw_align: tst r1, #1
|
||||
bne .Linsw_bad_alignment
|
||||
|
||||
ldr r3, [r0]
|
||||
strb r3, [r1], #1
|
||||
|
@ -34,16 +34,16 @@ ENTRY(__raw_readsw)
|
|||
teq r2, #0 @ do we have to check for the zero len?
|
||||
moveq pc, lr
|
||||
tst r1, #3
|
||||
bne .insw_align
|
||||
bne .Linsw_align
|
||||
|
||||
.insw_aligned: mov ip, #0xff
|
||||
.Linsw_aligned: mov ip, #0xff
|
||||
orr ip, ip, ip, lsl #8
|
||||
stmfd sp!, {r4, r5, r6, lr}
|
||||
|
||||
subs r2, r2, #8
|
||||
bmi .no_insw_8
|
||||
bmi .Lno_insw_8
|
||||
|
||||
.insw_8_lp: ldr r3, [r0]
|
||||
.Linsw_8_lp: ldr r3, [r0]
|
||||
and r3, r3, ip
|
||||
ldr r4, [r0]
|
||||
orr r3, r3, r4, lsl #16
|
||||
|
@ -66,13 +66,13 @@ ENTRY(__raw_readsw)
|
|||
stmia r1!, {r3 - r6}
|
||||
|
||||
subs r2, r2, #8
|
||||
bpl .insw_8_lp
|
||||
bpl .Linsw_8_lp
|
||||
|
||||
tst r2, #7
|
||||
LOADREGS(eqfd, sp!, {r4, r5, r6, pc})
|
||||
|
||||
.no_insw_8: tst r2, #4
|
||||
beq .no_insw_4
|
||||
.Lno_insw_8: tst r2, #4
|
||||
beq .Lno_insw_4
|
||||
|
||||
ldr r3, [r0]
|
||||
and r3, r3, ip
|
||||
|
@ -86,8 +86,8 @@ ENTRY(__raw_readsw)
|
|||
|
||||
stmia r1!, {r3, r4}
|
||||
|
||||
.no_insw_4: tst r2, #2
|
||||
beq .no_insw_2
|
||||
.Lno_insw_4: tst r2, #2
|
||||
beq .Lno_insw_2
|
||||
|
||||
ldr r3, [r0]
|
||||
and r3, r3, ip
|
||||
|
@ -96,7 +96,7 @@ ENTRY(__raw_readsw)
|
|||
|
||||
str r3, [r1], #4
|
||||
|
||||
.no_insw_2: tst r2, #1
|
||||
.Lno_insw_2: tst r2, #1
|
||||
ldrne r3, [r0]
|
||||
strneb r3, [r1], #1
|
||||
movne r3, r3, lsr #8
|
||||
|
|
|
@ -18,8 +18,8 @@
|
|||
#endif
|
||||
.endm
|
||||
|
||||
.insw_align: movs ip, r1, lsl #31
|
||||
bne .insw_noalign
|
||||
.Linsw_align: movs ip, r1, lsl #31
|
||||
bne .Linsw_noalign
|
||||
ldrh ip, [r0]
|
||||
sub r2, r2, #1
|
||||
strh ip, [r1], #2
|
||||
|
@ -28,14 +28,14 @@ ENTRY(__raw_readsw)
|
|||
teq r2, #0
|
||||
moveq pc, lr
|
||||
tst r1, #3
|
||||
bne .insw_align
|
||||
bne .Linsw_align
|
||||
|
||||
stmfd sp!, {r4, r5, lr}
|
||||
|
||||
subs r2, r2, #8
|
||||
bmi .no_insw_8
|
||||
bmi .Lno_insw_8
|
||||
|
||||
.insw_8_lp: ldrh r3, [r0]
|
||||
.Linsw_8_lp: ldrh r3, [r0]
|
||||
ldrh r4, [r0]
|
||||
pack r3, r3, r4
|
||||
|
||||
|
@ -53,10 +53,10 @@ ENTRY(__raw_readsw)
|
|||
|
||||
subs r2, r2, #8
|
||||
stmia r1!, {r3 - r5, ip}
|
||||
bpl .insw_8_lp
|
||||
bpl .Linsw_8_lp
|
||||
|
||||
.no_insw_8: tst r2, #4
|
||||
beq .no_insw_4
|
||||
.Lno_insw_8: tst r2, #4
|
||||
beq .Lno_insw_4
|
||||
|
||||
ldrh r3, [r0]
|
||||
ldrh r4, [r0]
|
||||
|
@ -68,15 +68,15 @@ ENTRY(__raw_readsw)
|
|||
|
||||
stmia r1!, {r3, r4}
|
||||
|
||||
.no_insw_4: movs r2, r2, lsl #31
|
||||
bcc .no_insw_2
|
||||
.Lno_insw_4: movs r2, r2, lsl #31
|
||||
bcc .Lno_insw_2
|
||||
|
||||
ldrh r3, [r0]
|
||||
ldrh ip, [r0]
|
||||
pack r3, r3, ip
|
||||
str r3, [r1], #4
|
||||
|
||||
.no_insw_2: ldrneh r3, [r0]
|
||||
.Lno_insw_2: ldrneh r3, [r0]
|
||||
strneh r3, [r1]
|
||||
|
||||
ldmfd sp!, {r4, r5, pc}
|
||||
|
@ -93,7 +93,7 @@ ENTRY(__raw_readsw)
|
|||
#define pull_hbyte1 lsr #8
|
||||
#endif
|
||||
|
||||
.insw_noalign: stmfd sp!, {r4, lr}
|
||||
.Linsw_noalign: stmfd sp!, {r4, lr}
|
||||
ldrccb ip, [r1, #-1]!
|
||||
bcc 1f
|
||||
|
||||
|
|
|
@ -30,7 +30,7 @@
|
|||
#endif
|
||||
.endm
|
||||
|
||||
.outsb_align: rsb ip, ip, #4
|
||||
.Loutsb_align: rsb ip, ip, #4
|
||||
cmp ip, r2
|
||||
movgt ip, r2
|
||||
cmp ip, #2
|
||||
|
@ -41,44 +41,45 @@
|
|||
ldrgtb r3, [r1], #1
|
||||
strgtb r3, [r0]
|
||||
subs r2, r2, ip
|
||||
bne .outsb_aligned
|
||||
bne .Loutsb_aligned
|
||||
|
||||
ENTRY(__raw_writesb)
|
||||
teq r2, #0 @ do we have to check for the zero len?
|
||||
moveq pc, lr
|
||||
ands ip, r1, #3
|
||||
bne .outsb_align
|
||||
bne .Loutsb_align
|
||||
|
||||
.outsb_aligned: stmfd sp!, {r4, r5, lr}
|
||||
.Loutsb_aligned:
|
||||
stmfd sp!, {r4, r5, lr}
|
||||
|
||||
subs r2, r2, #16
|
||||
bmi .outsb_no_16
|
||||
bmi .Loutsb_no_16
|
||||
|
||||
.outsb_16_lp: ldmia r1!, {r3, r4, r5, ip}
|
||||
.Loutsb_16_lp: ldmia r1!, {r3, r4, r5, ip}
|
||||
outword r3
|
||||
outword r4
|
||||
outword r5
|
||||
outword ip
|
||||
subs r2, r2, #16
|
||||
bpl .outsb_16_lp
|
||||
bpl .Loutsb_16_lp
|
||||
|
||||
tst r2, #15
|
||||
LOADREGS(eqfd, sp!, {r4, r5, pc})
|
||||
|
||||
.outsb_no_16: tst r2, #8
|
||||
beq .outsb_no_8
|
||||
.Loutsb_no_16: tst r2, #8
|
||||
beq .Loutsb_no_8
|
||||
|
||||
ldmia r1!, {r3, r4}
|
||||
outword r3
|
||||
outword r4
|
||||
|
||||
.outsb_no_8: tst r2, #4
|
||||
beq .outsb_no_4
|
||||
.Loutsb_no_8: tst r2, #4
|
||||
beq .Loutsb_no_4
|
||||
|
||||
ldr r3, [r1], #4
|
||||
outword r3
|
||||
|
||||
.outsb_no_4: ands r2, r2, #3
|
||||
.Loutsb_no_4: ands r2, r2, #3
|
||||
LOADREGS(eqfd, sp!, {r4, r5, pc})
|
||||
|
||||
cmp r2, #2
|
||||
|
|
|
@ -11,16 +11,16 @@
|
|||
#include <asm/assembler.h>
|
||||
#include <asm/hardware.h>
|
||||
|
||||
.outsw_bad_alignment:
|
||||
adr r0, .outsw_bad_align_msg
|
||||
.Loutsw_bad_alignment:
|
||||
adr r0, .Loutsw_bad_align_msg
|
||||
mov r2, lr
|
||||
b panic
|
||||
.outsw_bad_align_msg:
|
||||
.Loutsw_bad_align_msg:
|
||||
.asciz "outsw: bad buffer alignment (0x%p, lr=0x%08lX)\n"
|
||||
.align
|
||||
|
||||
.outsw_align: tst r1, #1
|
||||
bne .outsw_bad_alignment
|
||||
.Loutsw_align: tst r1, #1
|
||||
bne .Loutsw_bad_alignment
|
||||
|
||||
add r1, r1, #2
|
||||
|
||||
|
@ -35,14 +35,14 @@ ENTRY(__raw_writesw)
|
|||
teq r2, #0 @ do we have to check for the zero len?
|
||||
moveq pc, lr
|
||||
tst r1, #3
|
||||
bne .outsw_align
|
||||
bne .Loutsw_align
|
||||
|
||||
.outsw_aligned: stmfd sp!, {r4, r5, r6, lr}
|
||||
stmfd sp!, {r4, r5, r6, lr}
|
||||
|
||||
subs r2, r2, #8
|
||||
bmi .no_outsw_8
|
||||
bmi .Lno_outsw_8
|
||||
|
||||
.outsw_8_lp: ldmia r1!, {r3, r4, r5, r6}
|
||||
.Loutsw_8_lp: ldmia r1!, {r3, r4, r5, r6}
|
||||
|
||||
mov ip, r3, lsl #16
|
||||
orr ip, ip, ip, lsr #16
|
||||
|
@ -77,13 +77,13 @@ ENTRY(__raw_writesw)
|
|||
str ip, [r0]
|
||||
|
||||
subs r2, r2, #8
|
||||
bpl .outsw_8_lp
|
||||
bpl .Loutsw_8_lp
|
||||
|
||||
tst r2, #7
|
||||
LOADREGS(eqfd, sp!, {r4, r5, r6, pc})
|
||||
|
||||
.no_outsw_8: tst r2, #4
|
||||
beq .no_outsw_4
|
||||
.Lno_outsw_8: tst r2, #4
|
||||
beq .Lno_outsw_4
|
||||
|
||||
ldmia r1!, {r3, r4}
|
||||
|
||||
|
@ -103,8 +103,8 @@ ENTRY(__raw_writesw)
|
|||
orr ip, ip, ip, lsl #16
|
||||
str ip, [r0]
|
||||
|
||||
.no_outsw_4: tst r2, #2
|
||||
beq .no_outsw_2
|
||||
.Lno_outsw_4: tst r2, #2
|
||||
beq .Lno_outsw_2
|
||||
|
||||
ldr r3, [r1], #4
|
||||
|
||||
|
@ -116,7 +116,7 @@ ENTRY(__raw_writesw)
|
|||
orr ip, ip, ip, lsl #16
|
||||
str ip, [r0]
|
||||
|
||||
.no_outsw_2: tst r2, #1
|
||||
.Lno_outsw_2: tst r2, #1
|
||||
|
||||
ldrne r3, [r1]
|
||||
|
||||
|
|
|
@ -22,8 +22,8 @@
|
|||
#endif
|
||||
.endm
|
||||
|
||||
.outsw_align: movs ip, r1, lsl #31
|
||||
bne .outsw_noalign
|
||||
.Loutsw_align: movs ip, r1, lsl #31
|
||||
bne .Loutsw_noalign
|
||||
|
||||
ldrh r3, [r1], #2
|
||||
sub r2, r2, #1
|
||||
|
@ -33,35 +33,35 @@ ENTRY(__raw_writesw)
|
|||
teq r2, #0
|
||||
moveq pc, lr
|
||||
ands r3, r1, #3
|
||||
bne .outsw_align
|
||||
bne .Loutsw_align
|
||||
|
||||
stmfd sp!, {r4, r5, lr}
|
||||
|
||||
subs r2, r2, #8
|
||||
bmi .no_outsw_8
|
||||
bmi .Lno_outsw_8
|
||||
|
||||
.outsw_8_lp: ldmia r1!, {r3, r4, r5, ip}
|
||||
.Loutsw_8_lp: ldmia r1!, {r3, r4, r5, ip}
|
||||
subs r2, r2, #8
|
||||
outword r3
|
||||
outword r4
|
||||
outword r5
|
||||
outword ip
|
||||
bpl .outsw_8_lp
|
||||
bpl .Loutsw_8_lp
|
||||
|
||||
.no_outsw_8: tst r2, #4
|
||||
beq .no_outsw_4
|
||||
.Lno_outsw_8: tst r2, #4
|
||||
beq .Lno_outsw_4
|
||||
|
||||
ldmia r1!, {r3, ip}
|
||||
outword r3
|
||||
outword ip
|
||||
|
||||
.no_outsw_4: movs r2, r2, lsl #31
|
||||
bcc .no_outsw_2
|
||||
.Lno_outsw_4: movs r2, r2, lsl #31
|
||||
bcc .Lno_outsw_2
|
||||
|
||||
ldr r3, [r1], #4
|
||||
outword r3
|
||||
|
||||
.no_outsw_2: ldrneh r3, [r1]
|
||||
.Lno_outsw_2: ldrneh r3, [r1]
|
||||
strneh r3, [r0]
|
||||
|
||||
ldmfd sp!, {r4, r5, pc}
|
||||
|
@ -74,7 +74,8 @@ ENTRY(__raw_writesw)
|
|||
#define push_hbyte1 lsl #8
|
||||
#endif
|
||||
|
||||
.outsw_noalign: ldr r3, [r1, -r3]!
|
||||
.Loutsw_noalign:
|
||||
ldr r3, [r1, -r3]!
|
||||
subcs r2, r2, #1
|
||||
bcs 2f
|
||||
subs r2, r2, #2
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
* Returns : Number of bytes NOT copied.
|
||||
*/
|
||||
|
||||
.c2u_dest_not_aligned:
|
||||
.Lc2u_dest_not_aligned:
|
||||
rsb ip, ip, #4
|
||||
cmp ip, #2
|
||||
ldrb r3, [r1], #1
|
||||
|
@ -37,32 +37,32 @@ USER( strgebt r3, [r0], #1) @ May fault
|
|||
ldrgtb r3, [r1], #1
|
||||
USER( strgtbt r3, [r0], #1) @ May fault
|
||||
sub r2, r2, ip
|
||||
b .c2u_dest_aligned
|
||||
b .Lc2u_dest_aligned
|
||||
|
||||
ENTRY(__arch_copy_to_user)
|
||||
stmfd sp!, {r2, r4 - r7, lr}
|
||||
cmp r2, #4
|
||||
blt .c2u_not_enough
|
||||
blt .Lc2u_not_enough
|
||||
ands ip, r0, #3
|
||||
bne .c2u_dest_not_aligned
|
||||
.c2u_dest_aligned:
|
||||
bne .Lc2u_dest_not_aligned
|
||||
.Lc2u_dest_aligned:
|
||||
|
||||
ands ip, r1, #3
|
||||
bne .c2u_src_not_aligned
|
||||
bne .Lc2u_src_not_aligned
|
||||
/*
|
||||
* Seeing as there has to be at least 8 bytes to copy, we can
|
||||
* copy one word, and force a user-mode page fault...
|
||||
*/
|
||||
|
||||
.c2u_0fupi: subs r2, r2, #4
|
||||
.Lc2u_0fupi: subs r2, r2, #4
|
||||
addmi ip, r2, #4
|
||||
bmi .c2u_0nowords
|
||||
bmi .Lc2u_0nowords
|
||||
ldr r3, [r1], #4
|
||||
USER( strt r3, [r0], #4) @ May fault
|
||||
mov ip, r0, lsl #32 - PAGE_SHIFT @ On each page, use a ld/st??t instruction
|
||||
rsb ip, ip, #0
|
||||
movs ip, ip, lsr #32 - PAGE_SHIFT
|
||||
beq .c2u_0fupi
|
||||
beq .Lc2u_0fupi
|
||||
/*
|
||||
* ip = max no. of bytes to copy before needing another "strt" insn
|
||||
*/
|
||||
|
@ -70,16 +70,16 @@ USER( strt r3, [r0], #4) @ May fault
|
|||
movlt ip, r2
|
||||
sub r2, r2, ip
|
||||
subs ip, ip, #32
|
||||
blt .c2u_0rem8lp
|
||||
blt .Lc2u_0rem8lp
|
||||
|
||||
.c2u_0cpy8lp: ldmia r1!, {r3 - r6}
|
||||
.Lc2u_0cpy8lp: ldmia r1!, {r3 - r6}
|
||||
stmia r0!, {r3 - r6} @ Shouldnt fault
|
||||
ldmia r1!, {r3 - r6}
|
||||
subs ip, ip, #32
|
||||
stmia r0!, {r3 - r6} @ Shouldnt fault
|
||||
bpl .c2u_0cpy8lp
|
||||
bpl .Lc2u_0cpy8lp
|
||||
|
||||
.c2u_0rem8lp: cmn ip, #16
|
||||
.Lc2u_0rem8lp: cmn ip, #16
|
||||
ldmgeia r1!, {r3 - r6}
|
||||
stmgeia r0!, {r3 - r6} @ Shouldnt fault
|
||||
tst ip, #8
|
||||
|
@ -89,33 +89,33 @@ USER( strt r3, [r0], #4) @ May fault
|
|||
ldrne r3, [r1], #4
|
||||
strnet r3, [r0], #4 @ Shouldnt fault
|
||||
ands ip, ip, #3
|
||||
beq .c2u_0fupi
|
||||
.c2u_0nowords: teq ip, #0
|
||||
beq .c2u_finished
|
||||
.c2u_nowords: cmp ip, #2
|
||||
beq .Lc2u_0fupi
|
||||
.Lc2u_0nowords: teq ip, #0
|
||||
beq .Lc2u_finished
|
||||
.Lc2u_nowords: cmp ip, #2
|
||||
ldrb r3, [r1], #1
|
||||
USER( strbt r3, [r0], #1) @ May fault
|
||||
ldrgeb r3, [r1], #1
|
||||
USER( strgebt r3, [r0], #1) @ May fault
|
||||
ldrgtb r3, [r1], #1
|
||||
USER( strgtbt r3, [r0], #1) @ May fault
|
||||
b .c2u_finished
|
||||
b .Lc2u_finished
|
||||
|
||||
.c2u_not_enough:
|
||||
.Lc2u_not_enough:
|
||||
movs ip, r2
|
||||
bne .c2u_nowords
|
||||
.c2u_finished: mov r0, #0
|
||||
bne .Lc2u_nowords
|
||||
.Lc2u_finished: mov r0, #0
|
||||
LOADREGS(fd,sp!,{r2, r4 - r7, pc})
|
||||
|
||||
.c2u_src_not_aligned:
|
||||
.Lc2u_src_not_aligned:
|
||||
bic r1, r1, #3
|
||||
ldr r7, [r1], #4
|
||||
cmp ip, #2
|
||||
bgt .c2u_3fupi
|
||||
beq .c2u_2fupi
|
||||
.c2u_1fupi: subs r2, r2, #4
|
||||
bgt .Lc2u_3fupi
|
||||
beq .Lc2u_2fupi
|
||||
.Lc2u_1fupi: subs r2, r2, #4
|
||||
addmi ip, r2, #4
|
||||
bmi .c2u_1nowords
|
||||
bmi .Lc2u_1nowords
|
||||
mov r3, r7, pull #8
|
||||
ldr r7, [r1], #4
|
||||
orr r3, r3, r7, push #24
|
||||
|
@ -123,14 +123,14 @@ USER( strt r3, [r0], #4) @ May fault
|
|||
mov ip, r0, lsl #32 - PAGE_SHIFT
|
||||
rsb ip, ip, #0
|
||||
movs ip, ip, lsr #32 - PAGE_SHIFT
|
||||
beq .c2u_1fupi
|
||||
beq .Lc2u_1fupi
|
||||
cmp r2, ip
|
||||
movlt ip, r2
|
||||
sub r2, r2, ip
|
||||
subs ip, ip, #16
|
||||
blt .c2u_1rem8lp
|
||||
blt .Lc2u_1rem8lp
|
||||
|
||||
.c2u_1cpy8lp: mov r3, r7, pull #8
|
||||
.Lc2u_1cpy8lp: mov r3, r7, pull #8
|
||||
ldmia r1!, {r4 - r7}
|
||||
subs ip, ip, #16
|
||||
orr r3, r3, r4, push #24
|
||||
|
@ -141,9 +141,9 @@ USER( strt r3, [r0], #4) @ May fault
|
|||
mov r6, r6, pull #8
|
||||
orr r6, r6, r7, push #24
|
||||
stmia r0!, {r3 - r6} @ Shouldnt fault
|
||||
bpl .c2u_1cpy8lp
|
||||
bpl .Lc2u_1cpy8lp
|
||||
|
||||
.c2u_1rem8lp: tst ip, #8
|
||||
.Lc2u_1rem8lp: tst ip, #8
|
||||
movne r3, r7, pull #8
|
||||
ldmneia r1!, {r4, r7}
|
||||
orrne r3, r3, r4, push #24
|
||||
|
@ -156,21 +156,21 @@ USER( strt r3, [r0], #4) @ May fault
|
|||
orrne r3, r3, r7, push #24
|
||||
strnet r3, [r0], #4 @ Shouldnt fault
|
||||
ands ip, ip, #3
|
||||
beq .c2u_1fupi
|
||||
.c2u_1nowords: mov r3, r7, get_byte_1
|
||||
beq .Lc2u_1fupi
|
||||
.Lc2u_1nowords: mov r3, r7, get_byte_1
|
||||
teq ip, #0
|
||||
beq .c2u_finished
|
||||
beq .Lc2u_finished
|
||||
cmp ip, #2
|
||||
USER( strbt r3, [r0], #1) @ May fault
|
||||
movge r3, r7, get_byte_2
|
||||
USER( strgebt r3, [r0], #1) @ May fault
|
||||
movgt r3, r7, get_byte_3
|
||||
USER( strgtbt r3, [r0], #1) @ May fault
|
||||
b .c2u_finished
|
||||
b .Lc2u_finished
|
||||
|
||||
.c2u_2fupi: subs r2, r2, #4
|
||||
.Lc2u_2fupi: subs r2, r2, #4
|
||||
addmi ip, r2, #4
|
||||
bmi .c2u_2nowords
|
||||
bmi .Lc2u_2nowords
|
||||
mov r3, r7, pull #16
|
||||
ldr r7, [r1], #4
|
||||
orr r3, r3, r7, push #16
|
||||
|
@ -178,14 +178,14 @@ USER( strt r3, [r0], #4) @ May fault
|
|||
mov ip, r0, lsl #32 - PAGE_SHIFT
|
||||
rsb ip, ip, #0
|
||||
movs ip, ip, lsr #32 - PAGE_SHIFT
|
||||
beq .c2u_2fupi
|
||||
beq .Lc2u_2fupi
|
||||
cmp r2, ip
|
||||
movlt ip, r2
|
||||
sub r2, r2, ip
|
||||
subs ip, ip, #16
|
||||
blt .c2u_2rem8lp
|
||||
blt .Lc2u_2rem8lp
|
||||
|
||||
.c2u_2cpy8lp: mov r3, r7, pull #16
|
||||
.Lc2u_2cpy8lp: mov r3, r7, pull #16
|
||||
ldmia r1!, {r4 - r7}
|
||||
subs ip, ip, #16
|
||||
orr r3, r3, r4, push #16
|
||||
|
@ -196,9 +196,9 @@ USER( strt r3, [r0], #4) @ May fault
|
|||
mov r6, r6, pull #16
|
||||
orr r6, r6, r7, push #16
|
||||
stmia r0!, {r3 - r6} @ Shouldnt fault
|
||||
bpl .c2u_2cpy8lp
|
||||
bpl .Lc2u_2cpy8lp
|
||||
|
||||
.c2u_2rem8lp: tst ip, #8
|
||||
.Lc2u_2rem8lp: tst ip, #8
|
||||
movne r3, r7, pull #16
|
||||
ldmneia r1!, {r4, r7}
|
||||
orrne r3, r3, r4, push #16
|
||||
|
@ -211,21 +211,21 @@ USER( strt r3, [r0], #4) @ May fault
|
|||
orrne r3, r3, r7, push #16
|
||||
strnet r3, [r0], #4 @ Shouldnt fault
|
||||
ands ip, ip, #3
|
||||
beq .c2u_2fupi
|
||||
.c2u_2nowords: mov r3, r7, get_byte_2
|
||||
beq .Lc2u_2fupi
|
||||
.Lc2u_2nowords: mov r3, r7, get_byte_2
|
||||
teq ip, #0
|
||||
beq .c2u_finished
|
||||
beq .Lc2u_finished
|
||||
cmp ip, #2
|
||||
USER( strbt r3, [r0], #1) @ May fault
|
||||
movge r3, r7, get_byte_3
|
||||
USER( strgebt r3, [r0], #1) @ May fault
|
||||
ldrgtb r3, [r1], #0
|
||||
USER( strgtbt r3, [r0], #1) @ May fault
|
||||
b .c2u_finished
|
||||
b .Lc2u_finished
|
||||
|
||||
.c2u_3fupi: subs r2, r2, #4
|
||||
.Lc2u_3fupi: subs r2, r2, #4
|
||||
addmi ip, r2, #4
|
||||
bmi .c2u_3nowords
|
||||
bmi .Lc2u_3nowords
|
||||
mov r3, r7, pull #24
|
||||
ldr r7, [r1], #4
|
||||
orr r3, r3, r7, push #8
|
||||
|
@ -233,14 +233,14 @@ USER( strt r3, [r0], #4) @ May fault
|
|||
mov ip, r0, lsl #32 - PAGE_SHIFT
|
||||
rsb ip, ip, #0
|
||||
movs ip, ip, lsr #32 - PAGE_SHIFT
|
||||
beq .c2u_3fupi
|
||||
beq .Lc2u_3fupi
|
||||
cmp r2, ip
|
||||
movlt ip, r2
|
||||
sub r2, r2, ip
|
||||
subs ip, ip, #16
|
||||
blt .c2u_3rem8lp
|
||||
blt .Lc2u_3rem8lp
|
||||
|
||||
.c2u_3cpy8lp: mov r3, r7, pull #24
|
||||
.Lc2u_3cpy8lp: mov r3, r7, pull #24
|
||||
ldmia r1!, {r4 - r7}
|
||||
subs ip, ip, #16
|
||||
orr r3, r3, r4, push #8
|
||||
|
@ -251,9 +251,9 @@ USER( strt r3, [r0], #4) @ May fault
|
|||
mov r6, r6, pull #24
|
||||
orr r6, r6, r7, push #8
|
||||
stmia r0!, {r3 - r6} @ Shouldnt fault
|
||||
bpl .c2u_3cpy8lp
|
||||
bpl .Lc2u_3cpy8lp
|
||||
|
||||
.c2u_3rem8lp: tst ip, #8
|
||||
.Lc2u_3rem8lp: tst ip, #8
|
||||
movne r3, r7, pull #24
|
||||
ldmneia r1!, {r4, r7}
|
||||
orrne r3, r3, r4, push #8
|
||||
|
@ -266,17 +266,17 @@ USER( strt r3, [r0], #4) @ May fault
|
|||
orrne r3, r3, r7, push #8
|
||||
strnet r3, [r0], #4 @ Shouldnt fault
|
||||
ands ip, ip, #3
|
||||
beq .c2u_3fupi
|
||||
.c2u_3nowords: mov r3, r7, get_byte_3
|
||||
beq .Lc2u_3fupi
|
||||
.Lc2u_3nowords: mov r3, r7, get_byte_3
|
||||
teq ip, #0
|
||||
beq .c2u_finished
|
||||
beq .Lc2u_finished
|
||||
cmp ip, #2
|
||||
USER( strbt r3, [r0], #1) @ May fault
|
||||
ldrgeb r3, [r1], #1
|
||||
USER( strgebt r3, [r0], #1) @ May fault
|
||||
ldrgtb r3, [r1], #0
|
||||
USER( strgtbt r3, [r0], #1) @ May fault
|
||||
b .c2u_finished
|
||||
b .Lc2u_finished
|
||||
|
||||
.section .fixup,"ax"
|
||||
.align 0
|
||||
|
@ -290,7 +290,7 @@ USER( strgtbt r3, [r0], #1) @ May fault
|
|||
* : n - number of bytes to copy
|
||||
* Returns : Number of bytes NOT copied.
|
||||
*/
|
||||
.cfu_dest_not_aligned:
|
||||
.Lcfu_dest_not_aligned:
|
||||
rsb ip, ip, #4
|
||||
cmp ip, #2
|
||||
USER( ldrbt r3, [r1], #1) @ May fault
|
||||
|
@ -300,31 +300,32 @@ USER( ldrgebt r3, [r1], #1) @ May fault
|
|||
USER( ldrgtbt r3, [r1], #1) @ May fault
|
||||
strgtb r3, [r0], #1
|
||||
sub r2, r2, ip
|
||||
b .cfu_dest_aligned
|
||||
b .Lcfu_dest_aligned
|
||||
|
||||
ENTRY(__arch_copy_from_user)
|
||||
stmfd sp!, {r0, r2, r4 - r7, lr}
|
||||
cmp r2, #4
|
||||
blt .cfu_not_enough
|
||||
blt .Lcfu_not_enough
|
||||
ands ip, r0, #3
|
||||
bne .cfu_dest_not_aligned
|
||||
.cfu_dest_aligned:
|
||||
bne .Lcfu_dest_not_aligned
|
||||
.Lcfu_dest_aligned:
|
||||
ands ip, r1, #3
|
||||
bne .cfu_src_not_aligned
|
||||
bne .Lcfu_src_not_aligned
|
||||
|
||||
/*
|
||||
* Seeing as there has to be at least 8 bytes to copy, we can
|
||||
* copy one word, and force a user-mode page fault...
|
||||
*/
|
||||
|
||||
.cfu_0fupi: subs r2, r2, #4
|
||||
.Lcfu_0fupi: subs r2, r2, #4
|
||||
addmi ip, r2, #4
|
||||
bmi .cfu_0nowords
|
||||
bmi .Lcfu_0nowords
|
||||
USER( ldrt r3, [r1], #4)
|
||||
str r3, [r0], #4
|
||||
mov ip, r1, lsl #32 - PAGE_SHIFT @ On each page, use a ld/st??t instruction
|
||||
rsb ip, ip, #0
|
||||
movs ip, ip, lsr #32 - PAGE_SHIFT
|
||||
beq .cfu_0fupi
|
||||
beq .Lcfu_0fupi
|
||||
/*
|
||||
* ip = max no. of bytes to copy before needing another "strt" insn
|
||||
*/
|
||||
|
@ -332,16 +333,16 @@ USER( ldrt r3, [r1], #4)
|
|||
movlt ip, r2
|
||||
sub r2, r2, ip
|
||||
subs ip, ip, #32
|
||||
blt .cfu_0rem8lp
|
||||
blt .Lcfu_0rem8lp
|
||||
|
||||
.cfu_0cpy8lp: ldmia r1!, {r3 - r6} @ Shouldnt fault
|
||||
.Lcfu_0cpy8lp: ldmia r1!, {r3 - r6} @ Shouldnt fault
|
||||
stmia r0!, {r3 - r6}
|
||||
ldmia r1!, {r3 - r6} @ Shouldnt fault
|
||||
subs ip, ip, #32
|
||||
stmia r0!, {r3 - r6}
|
||||
bpl .cfu_0cpy8lp
|
||||
bpl .Lcfu_0cpy8lp
|
||||
|
||||
.cfu_0rem8lp: cmn ip, #16
|
||||
.Lcfu_0rem8lp: cmn ip, #16
|
||||
ldmgeia r1!, {r3 - r6} @ Shouldnt fault
|
||||
stmgeia r0!, {r3 - r6}
|
||||
tst ip, #8
|
||||
|
@ -351,34 +352,34 @@ USER( ldrt r3, [r1], #4)
|
|||
ldrnet r3, [r1], #4 @ Shouldnt fault
|
||||
strne r3, [r0], #4
|
||||
ands ip, ip, #3
|
||||
beq .cfu_0fupi
|
||||
.cfu_0nowords: teq ip, #0
|
||||
beq .cfu_finished
|
||||
.cfu_nowords: cmp ip, #2
|
||||
beq .Lcfu_0fupi
|
||||
.Lcfu_0nowords: teq ip, #0
|
||||
beq .Lcfu_finished
|
||||
.Lcfu_nowords: cmp ip, #2
|
||||
USER( ldrbt r3, [r1], #1) @ May fault
|
||||
strb r3, [r0], #1
|
||||
USER( ldrgebt r3, [r1], #1) @ May fault
|
||||
strgeb r3, [r0], #1
|
||||
USER( ldrgtbt r3, [r1], #1) @ May fault
|
||||
strgtb r3, [r0], #1
|
||||
b .cfu_finished
|
||||
b .Lcfu_finished
|
||||
|
||||
.cfu_not_enough:
|
||||
.Lcfu_not_enough:
|
||||
movs ip, r2
|
||||
bne .cfu_nowords
|
||||
.cfu_finished: mov r0, #0
|
||||
bne .Lcfu_nowords
|
||||
.Lcfu_finished: mov r0, #0
|
||||
add sp, sp, #8
|
||||
LOADREGS(fd,sp!,{r4 - r7, pc})
|
||||
|
||||
.cfu_src_not_aligned:
|
||||
.Lcfu_src_not_aligned:
|
||||
bic r1, r1, #3
|
||||
USER( ldrt r7, [r1], #4) @ May fault
|
||||
cmp ip, #2
|
||||
bgt .cfu_3fupi
|
||||
beq .cfu_2fupi
|
||||
.cfu_1fupi: subs r2, r2, #4
|
||||
bgt .Lcfu_3fupi
|
||||
beq .Lcfu_2fupi
|
||||
.Lcfu_1fupi: subs r2, r2, #4
|
||||
addmi ip, r2, #4
|
||||
bmi .cfu_1nowords
|
||||
bmi .Lcfu_1nowords
|
||||
mov r3, r7, pull #8
|
||||
USER( ldrt r7, [r1], #4) @ May fault
|
||||
orr r3, r3, r7, push #24
|
||||
|
@ -386,14 +387,14 @@ USER( ldrt r7, [r1], #4) @ May fault
|
|||
mov ip, r1, lsl #32 - PAGE_SHIFT
|
||||
rsb ip, ip, #0
|
||||
movs ip, ip, lsr #32 - PAGE_SHIFT
|
||||
beq .cfu_1fupi
|
||||
beq .Lcfu_1fupi
|
||||
cmp r2, ip
|
||||
movlt ip, r2
|
||||
sub r2, r2, ip
|
||||
subs ip, ip, #16
|
||||
blt .cfu_1rem8lp
|
||||
blt .Lcfu_1rem8lp
|
||||
|
||||
.cfu_1cpy8lp: mov r3, r7, pull #8
|
||||
.Lcfu_1cpy8lp: mov r3, r7, pull #8
|
||||
ldmia r1!, {r4 - r7} @ Shouldnt fault
|
||||
subs ip, ip, #16
|
||||
orr r3, r3, r4, push #24
|
||||
|
@ -404,9 +405,9 @@ USER( ldrt r7, [r1], #4) @ May fault
|
|||
mov r6, r6, pull #8
|
||||
orr r6, r6, r7, push #24
|
||||
stmia r0!, {r3 - r6}
|
||||
bpl .cfu_1cpy8lp
|
||||
bpl .Lcfu_1cpy8lp
|
||||
|
||||
.cfu_1rem8lp: tst ip, #8
|
||||
.Lcfu_1rem8lp: tst ip, #8
|
||||
movne r3, r7, pull #8
|
||||
ldmneia r1!, {r4, r7} @ Shouldnt fault
|
||||
orrne r3, r3, r4, push #24
|
||||
|
@ -419,21 +420,21 @@ USER( ldrnet r7, [r1], #4) @ May fault
|
|||
orrne r3, r3, r7, push #24
|
||||
strne r3, [r0], #4
|
||||
ands ip, ip, #3
|
||||
beq .cfu_1fupi
|
||||
.cfu_1nowords: mov r3, r7, get_byte_1
|
||||
beq .Lcfu_1fupi
|
||||
.Lcfu_1nowords: mov r3, r7, get_byte_1
|
||||
teq ip, #0
|
||||
beq .cfu_finished
|
||||
beq .Lcfu_finished
|
||||
cmp ip, #2
|
||||
strb r3, [r0], #1
|
||||
movge r3, r7, get_byte_2
|
||||
strgeb r3, [r0], #1
|
||||
movgt r3, r7, get_byte_3
|
||||
strgtb r3, [r0], #1
|
||||
b .cfu_finished
|
||||
b .Lcfu_finished
|
||||
|
||||
.cfu_2fupi: subs r2, r2, #4
|
||||
.Lcfu_2fupi: subs r2, r2, #4
|
||||
addmi ip, r2, #4
|
||||
bmi .cfu_2nowords
|
||||
bmi .Lcfu_2nowords
|
||||
mov r3, r7, pull #16
|
||||
USER( ldrt r7, [r1], #4) @ May fault
|
||||
orr r3, r3, r7, push #16
|
||||
|
@ -441,14 +442,15 @@ USER( ldrt r7, [r1], #4) @ May fault
|
|||
mov ip, r1, lsl #32 - PAGE_SHIFT
|
||||
rsb ip, ip, #0
|
||||
movs ip, ip, lsr #32 - PAGE_SHIFT
|
||||
beq .cfu_2fupi
|
||||
beq .Lcfu_2fupi
|
||||
cmp r2, ip
|
||||
movlt ip, r2
|
||||
sub r2, r2, ip
|
||||
subs ip, ip, #16
|
||||
blt .cfu_2rem8lp
|
||||
blt .Lcfu_2rem8lp
|
||||
|
||||
.cfu_2cpy8lp: mov r3, r7, pull #16
|
||||
|
||||
.Lcfu_2cpy8lp: mov r3, r7, pull #16
|
||||
ldmia r1!, {r4 - r7} @ Shouldnt fault
|
||||
subs ip, ip, #16
|
||||
orr r3, r3, r4, push #16
|
||||
|
@ -459,9 +461,9 @@ USER( ldrt r7, [r1], #4) @ May fault
|
|||
mov r6, r6, pull #16
|
||||
orr r6, r6, r7, push #16
|
||||
stmia r0!, {r3 - r6}
|
||||
bpl .cfu_2cpy8lp
|
||||
bpl .Lcfu_2cpy8lp
|
||||
|
||||
.cfu_2rem8lp: tst ip, #8
|
||||
.Lcfu_2rem8lp: tst ip, #8
|
||||
movne r3, r7, pull #16
|
||||
ldmneia r1!, {r4, r7} @ Shouldnt fault
|
||||
orrne r3, r3, r4, push #16
|
||||
|
@ -474,21 +476,21 @@ USER( ldrnet r7, [r1], #4) @ May fault
|
|||
orrne r3, r3, r7, push #16
|
||||
strne r3, [r0], #4
|
||||
ands ip, ip, #3
|
||||
beq .cfu_2fupi
|
||||
.cfu_2nowords: mov r3, r7, get_byte_2
|
||||
beq .Lcfu_2fupi
|
||||
.Lcfu_2nowords: mov r3, r7, get_byte_2
|
||||
teq ip, #0
|
||||
beq .cfu_finished
|
||||
beq .Lcfu_finished
|
||||
cmp ip, #2
|
||||
strb r3, [r0], #1
|
||||
movge r3, r7, get_byte_3
|
||||
strgeb r3, [r0], #1
|
||||
USER( ldrgtbt r3, [r1], #0) @ May fault
|
||||
strgtb r3, [r0], #1
|
||||
b .cfu_finished
|
||||
b .Lcfu_finished
|
||||
|
||||
.cfu_3fupi: subs r2, r2, #4
|
||||
.Lcfu_3fupi: subs r2, r2, #4
|
||||
addmi ip, r2, #4
|
||||
bmi .cfu_3nowords
|
||||
bmi .Lcfu_3nowords
|
||||
mov r3, r7, pull #24
|
||||
USER( ldrt r7, [r1], #4) @ May fault
|
||||
orr r3, r3, r7, push #8
|
||||
|
@ -496,14 +498,14 @@ USER( ldrt r7, [r1], #4) @ May fault
|
|||
mov ip, r1, lsl #32 - PAGE_SHIFT
|
||||
rsb ip, ip, #0
|
||||
movs ip, ip, lsr #32 - PAGE_SHIFT
|
||||
beq .cfu_3fupi
|
||||
beq .Lcfu_3fupi
|
||||
cmp r2, ip
|
||||
movlt ip, r2
|
||||
sub r2, r2, ip
|
||||
subs ip, ip, #16
|
||||
blt .cfu_3rem8lp
|
||||
blt .Lcfu_3rem8lp
|
||||
|
||||
.cfu_3cpy8lp: mov r3, r7, pull #24
|
||||
.Lcfu_3cpy8lp: mov r3, r7, pull #24
|
||||
ldmia r1!, {r4 - r7} @ Shouldnt fault
|
||||
orr r3, r3, r4, push #8
|
||||
mov r4, r4, pull #24
|
||||
|
@ -514,9 +516,9 @@ USER( ldrt r7, [r1], #4) @ May fault
|
|||
orr r6, r6, r7, push #8
|
||||
stmia r0!, {r3 - r6}
|
||||
subs ip, ip, #16
|
||||
bpl .cfu_3cpy8lp
|
||||
bpl .Lcfu_3cpy8lp
|
||||
|
||||
.cfu_3rem8lp: tst ip, #8
|
||||
.Lcfu_3rem8lp: tst ip, #8
|
||||
movne r3, r7, pull #24
|
||||
ldmneia r1!, {r4, r7} @ Shouldnt fault
|
||||
orrne r3, r3, r4, push #8
|
||||
|
@ -529,17 +531,17 @@ USER( ldrnet r7, [r1], #4) @ May fault
|
|||
orrne r3, r3, r7, push #8
|
||||
strne r3, [r0], #4
|
||||
ands ip, ip, #3
|
||||
beq .cfu_3fupi
|
||||
.cfu_3nowords: mov r3, r7, get_byte_3
|
||||
beq .Lcfu_3fupi
|
||||
.Lcfu_3nowords: mov r3, r7, get_byte_3
|
||||
teq ip, #0
|
||||
beq .cfu_finished
|
||||
beq .Lcfu_finished
|
||||
cmp ip, #2
|
||||
strb r3, [r0], #1
|
||||
USER( ldrgebt r3, [r1], #1) @ May fault
|
||||
strgeb r3, [r0], #1
|
||||
USER( ldrgtbt r3, [r1], #1) @ May fault
|
||||
strgtb r3, [r0], #1
|
||||
b .cfu_finished
|
||||
b .Lcfu_finished
|
||||
|
||||
.section .fixup,"ax"
|
||||
.align 0
|
||||
|
|
|
@ -191,7 +191,7 @@ void __init corgi_ssp_set_machinfo(struct corgissp_machinfo *machinfo)
|
|||
ssp_machinfo = machinfo;
|
||||
}
|
||||
|
||||
static int __init corgi_ssp_probe(struct device *dev)
|
||||
static int __init corgi_ssp_probe(struct platform_device *dev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
|
@ -216,13 +216,13 @@ static int __init corgi_ssp_probe(struct device *dev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int corgi_ssp_remove(struct device *dev)
|
||||
static int corgi_ssp_remove(struct platform_device *dev)
|
||||
{
|
||||
ssp_exit(&corgi_ssp_dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int corgi_ssp_suspend(struct device *dev, pm_message_t state)
|
||||
static int corgi_ssp_suspend(struct platform_device *dev, pm_message_t state)
|
||||
{
|
||||
ssp_flush(&corgi_ssp_dev);
|
||||
ssp_save_state(&corgi_ssp_dev,&corgi_ssp_state);
|
||||
|
@ -230,7 +230,7 @@ static int corgi_ssp_suspend(struct device *dev, pm_message_t state)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int corgi_ssp_resume(struct device *dev)
|
||||
static int corgi_ssp_resume(struct platform_device *dev)
|
||||
{
|
||||
GPSR(ssp_machinfo->cs_lcdcon) = GPIO_bit(ssp_machinfo->cs_lcdcon); /* High - Disable LCD Control/Timing Gen */
|
||||
GPSR(ssp_machinfo->cs_max1111) = GPIO_bit(ssp_machinfo->cs_max1111); /* High - Disable MAX1111*/
|
||||
|
@ -241,18 +241,19 @@ static int corgi_ssp_resume(struct device *dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static struct device_driver corgissp_driver = {
|
||||
.name = "corgi-ssp",
|
||||
.bus = &platform_bus_type,
|
||||
static struct platform_driver corgissp_driver = {
|
||||
.probe = corgi_ssp_probe,
|
||||
.remove = corgi_ssp_remove,
|
||||
.suspend = corgi_ssp_suspend,
|
||||
.resume = corgi_ssp_resume,
|
||||
.driver = {
|
||||
.name = "corgi-ssp",
|
||||
},
|
||||
};
|
||||
|
||||
int __init corgi_ssp_init(void)
|
||||
{
|
||||
return driver_register(&corgissp_driver);
|
||||
return platform_driver_register(&corgissp_driver);
|
||||
}
|
||||
|
||||
arch_initcall(corgi_ssp_init);
|
||||
|
|
|
@ -137,7 +137,7 @@ static struct sa1100_port_fns neponset_port_fns __initdata = {
|
|||
.get_mctrl = neponset_get_mctrl,
|
||||
};
|
||||
|
||||
static int neponset_probe(struct device *dev)
|
||||
static int neponset_probe(struct platform_device *dev)
|
||||
{
|
||||
sa1100_register_uart_fns(&neponset_port_fns);
|
||||
|
||||
|
@ -178,27 +178,27 @@ static int neponset_probe(struct device *dev)
|
|||
/*
|
||||
* LDM power management.
|
||||
*/
|
||||
static int neponset_suspend(struct device *dev, pm_message_t state)
|
||||
static int neponset_suspend(struct platform_device *dev, pm_message_t state)
|
||||
{
|
||||
/*
|
||||
* Save state.
|
||||
*/
|
||||
if (!dev->power.saved_state)
|
||||
dev->power.saved_state = kmalloc(sizeof(unsigned int), GFP_KERNEL);
|
||||
if (!dev->power.saved_state)
|
||||
if (!dev->dev.power.saved_state)
|
||||
dev->dev.power.saved_state = kmalloc(sizeof(unsigned int), GFP_KERNEL);
|
||||
if (!dev->dev.power.saved_state)
|
||||
return -ENOMEM;
|
||||
|
||||
*(unsigned int *)dev->power.saved_state = NCR_0;
|
||||
*(unsigned int *)dev->dev.power.saved_state = NCR_0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int neponset_resume(struct device *dev)
|
||||
static int neponset_resume(struct platform_device *dev)
|
||||
{
|
||||
if (dev->power.saved_state) {
|
||||
NCR_0 = *(unsigned int *)dev->power.saved_state;
|
||||
kfree(dev->power.saved_state);
|
||||
dev->power.saved_state = NULL;
|
||||
if (dev->dev.power.saved_state) {
|
||||
NCR_0 = *(unsigned int *)dev->dev.power.saved_state;
|
||||
kfree(dev->dev.power.saved_state);
|
||||
dev->dev.power.saved_state = NULL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -209,12 +209,13 @@ static int neponset_resume(struct device *dev)
|
|||
#define neponset_resume NULL
|
||||
#endif
|
||||
|
||||
static struct device_driver neponset_device_driver = {
|
||||
.name = "neponset",
|
||||
.bus = &platform_bus_type,
|
||||
static struct platform_driver neponset_device_driver = {
|
||||
.probe = neponset_probe,
|
||||
.suspend = neponset_suspend,
|
||||
.resume = neponset_resume,
|
||||
.driver = {
|
||||
.name = "neponset",
|
||||
},
|
||||
};
|
||||
|
||||
static struct resource neponset_resources[] = {
|
||||
|
@ -293,7 +294,7 @@ static struct platform_device *devices[] __initdata = {
|
|||
|
||||
static int __init neponset_init(void)
|
||||
{
|
||||
driver_register(&neponset_device_driver);
|
||||
platform_driver_register(&neponset_device_driver);
|
||||
|
||||
/*
|
||||
* The Neponset is only present on the Assabet machine type.
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
#
|
||||
# http://www.arm.linux.org.uk/developer/machines/?action=new
|
||||
#
|
||||
# Last update: Mon Oct 10 09:46:25 2005
|
||||
# Last update: Fri Nov 11 21:55:04 2005
|
||||
#
|
||||
# machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number
|
||||
#
|
||||
|
@ -460,7 +460,7 @@ esl_sarva MACH_ESL_SARVA ESL_SARVA 443
|
|||
xm250 MACH_XM250 XM250 444
|
||||
t6tc1xb MACH_T6TC1XB T6TC1XB 445
|
||||
ess710 MACH_ESS710 ESS710 446
|
||||
mx31ads MACH_MX3ADS MX3ADS 447
|
||||
mx31ads MACH_MX31ADS MX31ADS 447
|
||||
himalaya MACH_HIMALAYA HIMALAYA 448
|
||||
bolfenk MACH_BOLFENK BOLFENK 449
|
||||
at91rm9200kr MACH_AT91RM9200KR AT91RM9200KR 450
|
||||
|
@ -802,7 +802,7 @@ cpuat91 MACH_CPUAT91 CPUAT91 787
|
|||
rea9200 MACH_REA9200 REA9200 788
|
||||
acts_pune_sa1110 MACH_ACTS_PUNE_SA1110 ACTS_PUNE_SA1110 789
|
||||
ixp425 MACH_IXP425 IXP425 790
|
||||
argonplusodyssey MACH_ODYSSEY ODYSSEY 791
|
||||
argonplusodyssey MACH_ARGONPLUSODYSSEY ARGONPLUSODYSSEY 791
|
||||
perch MACH_PERCH PERCH 792
|
||||
eis05r1 MACH_EIS05R1 EIS05R1 793
|
||||
pepperpad MACH_PEPPERPAD PEPPERPAD 794
|
||||
|
@ -816,7 +816,7 @@ iq_nextgen_c MACH_IQ_NEXTGEN_C IQ_NEXTGEN_C 801
|
|||
iq_nextgen_d MACH_IQ_NEXTGEN_D IQ_NEXTGEN_D 802
|
||||
iq_nextgen_e MACH_IQ_NEXTGEN_E IQ_NEXTGEN_E 803
|
||||
mallow_at91 MACH_MALLOW_AT91 MALLOW_AT91 804
|
||||
cybertracker MACH_CYBERTRACKER CYBERTRACKER 805
|
||||
cybertracker_i MACH_CYBERTRACKER_I CYBERTRACKER_I 805
|
||||
gesbc931x MACH_GESBC931X GESBC931X 806
|
||||
centipad MACH_CENTIPAD CENTIPAD 807
|
||||
armsoc MACH_ARMSOC ARMSOC 808
|
||||
|
@ -869,3 +869,38 @@ davinci_dvdp MACH_DAVINCI_DVDP DAVINCI_DVDP 854
|
|||
htcuniversal MACH_HTCUNIVERSAL HTCUNIVERSAL 855
|
||||
tpad MACH_TPAD TPAD 856
|
||||
roverp3 MACH_ROVERP3 ROVERP3 857
|
||||
jornada928 MACH_JORNADA928 JORNADA928 858
|
||||
mv88fxx81 MACH_MV88FXX81 MV88FXX81 859
|
||||
stmp36xx MACH_STMP36XX STMP36XX 860
|
||||
sxni79524 MACH_SXNI79524 SXNI79524 861
|
||||
ams_delta MACH_AMS_DELTA AMS_DELTA 862
|
||||
uranium MACH_URANIUM URANIUM 863
|
||||
ucon MACH_UCON UCON 864
|
||||
nas100d MACH_NAS100D NAS100D 865
|
||||
l083 MACH_L083_1000 L083_1000 866
|
||||
ezx MACH_EZX EZX 867
|
||||
pnx5220 MACH_PNX5220 PNX5220 868
|
||||
butte MACH_BUTTE BUTTE 869
|
||||
srm2 MACH_SRM2 SRM2 870
|
||||
dsbr MACH_DSBR DSBR 871
|
||||
crystalball MACH_CRYSTALBALL CRYSTALBALL 872
|
||||
tinypxa27x MACH_TINYPXA27X TINYPXA27X 873
|
||||
herbie MACH_HERBIE HERBIE 874
|
||||
magician MACH_MAGICIAN MAGICIAN 875
|
||||
cm4002 MACH_CM4002 CM4002 876
|
||||
b4 MACH_B4 B4 877
|
||||
maui MACH_MAUI MAUI 878
|
||||
cybertracker_g MACH_CYBERTRACKER_G CYBERTRACKER_G 879
|
||||
nxdkn MACH_NXDKN NXDKN 880
|
||||
mio8390 MACH_MIO8390 MIO8390 881
|
||||
omi_board MACH_OMI_BOARD OMI_BOARD 882
|
||||
mx21civ MACH_MX21CIV MX21CIV 883
|
||||
mahi_cdac MACH_MAHI_CDAC MAHI_CDAC 884
|
||||
xscale_palmtx MACH_XSCALE_PALMTX XSCALE_PALMTX 885
|
||||
arch_s3c2413 MACH_ARCH_S3C2413 ARCH_S3C2413 886
|
||||
s3c2413 MACH_S3C2413 S3C2413 887
|
||||
samsys_ep0 MACH_SAMSYS_EP0 SAMSYS_EP0 888
|
||||
wg302v1 MACH_WG302V1 WG302V1 889
|
||||
wg302v2 MACH_WG302V2 WG302V2 890
|
||||
eb42x MACH_EB42X EB42X 891
|
||||
iq331es MACH_IQ331ES IQ331ES 892
|
||||
|
|
|
@ -164,6 +164,19 @@ config IA64_PAGE_SIZE_64KB
|
|||
|
||||
endchoice
|
||||
|
||||
choice
|
||||
prompt "Page Table Levels"
|
||||
default PGTABLE_3
|
||||
|
||||
config PGTABLE_3
|
||||
bool "3 Levels"
|
||||
|
||||
config PGTABLE_4
|
||||
depends on !IA64_PAGE_SIZE_64KB
|
||||
bool "4 Levels"
|
||||
|
||||
endchoice
|
||||
|
||||
source kernel/Kconfig.hz
|
||||
|
||||
config IA64_BRL_EMU
|
||||
|
|
|
@ -80,6 +80,8 @@ CONFIG_MCKINLEY=y
|
|||
# CONFIG_IA64_PAGE_SIZE_8KB is not set
|
||||
CONFIG_IA64_PAGE_SIZE_16KB=y
|
||||
# CONFIG_IA64_PAGE_SIZE_64KB is not set
|
||||
# CONFIG_PGTABLE_3 is not set
|
||||
CONFIG_PGTABLE_4=y
|
||||
# CONFIG_HZ_100 is not set
|
||||
CONFIG_HZ_250=y
|
||||
# CONFIG_HZ_1000 is not set
|
||||
|
|
|
@ -82,6 +82,8 @@ CONFIG_MCKINLEY=y
|
|||
# CONFIG_IA64_PAGE_SIZE_8KB is not set
|
||||
CONFIG_IA64_PAGE_SIZE_16KB=y
|
||||
# CONFIG_IA64_PAGE_SIZE_64KB is not set
|
||||
CONFIG_PGTABLE_3=y
|
||||
# CONFIG_PGTABLE_4 is not set
|
||||
# CONFIG_HZ_100 is not set
|
||||
CONFIG_HZ_250=y
|
||||
# CONFIG_HZ_1000 is not set
|
||||
|
|
|
@ -114,7 +114,7 @@ ENTRY(vhpt_miss)
|
|||
shl r21=r16,3 // shift bit 60 into sign bit
|
||||
shr.u r17=r16,61 // get the region number into r17
|
||||
;;
|
||||
shr r22=r21,3
|
||||
shr.u r22=r21,3
|
||||
#ifdef CONFIG_HUGETLB_PAGE
|
||||
extr.u r26=r25,2,6
|
||||
;;
|
||||
|
@ -140,20 +140,34 @@ ENTRY(vhpt_miss)
|
|||
(p6) dep r17=r18,r19,3,(PAGE_SHIFT-3) // r17=PTA + IFA(33,42)*8
|
||||
(p7) dep r17=r18,r17,3,(PAGE_SHIFT-6) // r17=PTA + (((IFA(61,63) << 7) | IFA(33,39))*8)
|
||||
cmp.eq p7,p6=0,r21 // unused address bits all zeroes?
|
||||
shr.u r18=r22,PMD_SHIFT // shift L2 index into position
|
||||
#ifdef CONFIG_PGTABLE_4
|
||||
shr.u r28=r22,PUD_SHIFT // shift L2 index into position
|
||||
#else
|
||||
shr.u r18=r22,PMD_SHIFT // shift L3 index into position
|
||||
#endif
|
||||
;;
|
||||
ld8 r17=[r17] // fetch the L1 entry (may be 0)
|
||||
;;
|
||||
(p7) cmp.eq p6,p7=r17,r0 // was L1 entry NULL?
|
||||
dep r17=r18,r17,3,(PAGE_SHIFT-3) // compute address of L2 page table entry
|
||||
#ifdef CONFIG_PGTABLE_4
|
||||
dep r28=r28,r17,3,(PAGE_SHIFT-3) // compute address of L2 page table entry
|
||||
;;
|
||||
(p7) ld8 r20=[r17] // fetch the L2 entry (may be 0)
|
||||
shr.u r19=r22,PAGE_SHIFT // shift L3 index into position
|
||||
shr.u r18=r22,PMD_SHIFT // shift L3 index into position
|
||||
(p7) ld8 r29=[r28] // fetch the L2 entry (may be 0)
|
||||
;;
|
||||
(p7) cmp.eq.or.andcm p6,p7=r20,r0 // was L2 entry NULL?
|
||||
dep r21=r19,r20,3,(PAGE_SHIFT-3) // compute address of L3 page table entry
|
||||
(p7) cmp.eq.or.andcm p6,p7=r29,r0 // was L2 entry NULL?
|
||||
dep r17=r18,r29,3,(PAGE_SHIFT-3) // compute address of L3 page table entry
|
||||
#else
|
||||
dep r17=r18,r17,3,(PAGE_SHIFT-3) // compute address of L3 page table entry
|
||||
#endif
|
||||
;;
|
||||
(p7) ld8 r18=[r21] // read the L3 PTE
|
||||
(p7) ld8 r20=[r17] // fetch the L3 entry (may be 0)
|
||||
shr.u r19=r22,PAGE_SHIFT // shift L4 index into position
|
||||
;;
|
||||
(p7) cmp.eq.or.andcm p6,p7=r20,r0 // was L3 entry NULL?
|
||||
dep r21=r19,r20,3,(PAGE_SHIFT-3) // compute address of L4 page table entry
|
||||
;;
|
||||
(p7) ld8 r18=[r21] // read the L4 PTE
|
||||
mov r19=cr.isr // cr.isr bit 0 tells us if this is an insn miss
|
||||
;;
|
||||
(p7) tbit.z p6,p7=r18,_PAGE_P_BIT // page present bit cleared?
|
||||
|
@ -192,14 +206,21 @@ ENTRY(vhpt_miss)
|
|||
* between reading the pagetable and the "itc". If so, flush the entry we
|
||||
* inserted and retry.
|
||||
*/
|
||||
ld8 r25=[r21] // read L3 PTE again
|
||||
ld8 r26=[r17] // read L2 entry again
|
||||
ld8 r25=[r21] // read L4 entry again
|
||||
ld8 r26=[r17] // read L3 PTE again
|
||||
#ifdef CONFIG_PGTABLE_4
|
||||
ld8 r18=[r28] // read L2 entry again
|
||||
#endif
|
||||
cmp.ne p6,p7=r0,r0
|
||||
;;
|
||||
cmp.ne p6,p7=r26,r20 // did L2 entry change
|
||||
cmp.ne.or.andcm p6,p7=r26,r20 // did L3 entry change
|
||||
#ifdef CONFIG_PGTABLE_4
|
||||
cmp.ne.or.andcm p6,p7=r29,r18 // did L4 PTE change
|
||||
#endif
|
||||
mov r27=PAGE_SHIFT<<2
|
||||
;;
|
||||
(p6) ptc.l r22,r27 // purge PTE page translation
|
||||
(p7) cmp.ne.or.andcm p6,p7=r25,r18 // did L3 PTE change
|
||||
(p7) cmp.ne.or.andcm p6,p7=r25,r18 // did L4 PTE change
|
||||
;;
|
||||
(p6) ptc.l r16,r27 // purge translation
|
||||
#endif
|
||||
|
@ -432,18 +453,30 @@ ENTRY(nested_dtlb_miss)
|
|||
(p6) dep r17=r18,r19,3,(PAGE_SHIFT-3) // r17=PTA + IFA(33,42)*8
|
||||
(p7) dep r17=r18,r17,3,(PAGE_SHIFT-6) // r17=PTA + (((IFA(61,63) << 7) | IFA(33,39))*8)
|
||||
cmp.eq p7,p6=0,r21 // unused address bits all zeroes?
|
||||
shr.u r18=r22,PMD_SHIFT // shift L2 index into position
|
||||
#ifdef CONFIG_PGTABLE_4
|
||||
shr.u r18=r22,PUD_SHIFT // shift L2 index into position
|
||||
#else
|
||||
shr.u r18=r22,PMD_SHIFT // shift L3 index into position
|
||||
#endif
|
||||
;;
|
||||
ld8 r17=[r17] // fetch the L1 entry (may be 0)
|
||||
;;
|
||||
(p7) cmp.eq p6,p7=r17,r0 // was L1 entry NULL?
|
||||
dep r17=r18,r17,3,(PAGE_SHIFT-3) // compute address of L2 page table entry
|
||||
;;
|
||||
#ifdef CONFIG_PGTABLE_4
|
||||
(p7) ld8 r17=[r17] // fetch the L2 entry (may be 0)
|
||||
shr.u r19=r22,PAGE_SHIFT // shift L3 index into position
|
||||
shr.u r18=r22,PMD_SHIFT // shift L3 index into position
|
||||
;;
|
||||
(p7) cmp.eq.or.andcm p6,p7=r17,r0 // was L2 entry NULL?
|
||||
dep r17=r19,r17,3,(PAGE_SHIFT-3) // compute address of L3 page table entry
|
||||
dep r17=r18,r17,3,(PAGE_SHIFT-3) // compute address of L2 page table entry
|
||||
;;
|
||||
#endif
|
||||
(p7) ld8 r17=[r17] // fetch the L3 entry (may be 0)
|
||||
shr.u r19=r22,PAGE_SHIFT // shift L4 index into position
|
||||
;;
|
||||
(p7) cmp.eq.or.andcm p6,p7=r17,r0 // was L3 entry NULL?
|
||||
dep r17=r19,r17,3,(PAGE_SHIFT-3) // compute address of L4 page table entry
|
||||
(p6) br.cond.spnt page_fault
|
||||
mov b0=r30
|
||||
br.sptk.many b0 // return to continuation point
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
#include <linux/root_dev.h>
|
||||
#include <linux/nodemask.h>
|
||||
#include <linux/pm.h>
|
||||
#include <linux/efi.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/sal.h>
|
||||
|
@ -242,6 +243,135 @@ static void __init sn_check_for_wars(void)
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Scan the EFI PCDP table (if it exists) for an acceptable VGA console
|
||||
* output device. If one exists, pick it and set sn_legacy_{io,mem} to
|
||||
* reflect the bus offsets needed to address it.
|
||||
*
|
||||
* Since pcdp support in SN is not supported in the 2.4 kernel (or at least
|
||||
* the one lbs is based on) just declare the needed structs here.
|
||||
*
|
||||
* Reference spec http://www.dig64.org/specifications/DIG64_PCDPv20.pdf
|
||||
*
|
||||
* Returns 0 if no acceptable vga is found, !0 otherwise.
|
||||
*
|
||||
* Note: This stuff is duped here because Altix requires the PCDP to
|
||||
* locate a usable VGA device due to lack of proper ACPI support. Structures
|
||||
* could be used from drivers/firmware/pcdp.h, but it was decided that moving
|
||||
* this file to a more public location just for Altix use was undesireable.
|
||||
*/
|
||||
|
||||
struct hcdp_uart_desc {
|
||||
u8 pad[45];
|
||||
};
|
||||
|
||||
struct pcdp {
|
||||
u8 signature[4]; /* should be 'HCDP' */
|
||||
u32 length;
|
||||
u8 rev; /* should be >=3 for pcdp, <3 for hcdp */
|
||||
u8 sum;
|
||||
u8 oem_id[6];
|
||||
u64 oem_tableid;
|
||||
u32 oem_rev;
|
||||
u32 creator_id;
|
||||
u32 creator_rev;
|
||||
u32 num_type0;
|
||||
struct hcdp_uart_desc uart[0]; /* num_type0 of these */
|
||||
/* pcdp descriptors follow */
|
||||
} __attribute__((packed));
|
||||
|
||||
struct pcdp_device_desc {
|
||||
u8 type;
|
||||
u8 primary;
|
||||
u16 length;
|
||||
u16 index;
|
||||
/* interconnect specific structure follows */
|
||||
/* device specific structure follows that */
|
||||
} __attribute__((packed));
|
||||
|
||||
struct pcdp_interface_pci {
|
||||
u8 type; /* 1 == pci */
|
||||
u8 reserved;
|
||||
u16 length;
|
||||
u8 segment;
|
||||
u8 bus;
|
||||
u8 dev;
|
||||
u8 fun;
|
||||
u16 devid;
|
||||
u16 vendid;
|
||||
u32 acpi_interrupt;
|
||||
u64 mmio_tra;
|
||||
u64 ioport_tra;
|
||||
u8 flags;
|
||||
u8 translation;
|
||||
} __attribute__((packed));
|
||||
|
||||
struct pcdp_vga_device {
|
||||
u8 num_eas_desc;
|
||||
/* ACPI Extended Address Space Desc follows */
|
||||
} __attribute__((packed));
|
||||
|
||||
/* from pcdp_device_desc.primary */
|
||||
#define PCDP_PRIMARY_CONSOLE 0x01
|
||||
|
||||
/* from pcdp_device_desc.type */
|
||||
#define PCDP_CONSOLE_INOUT 0x0
|
||||
#define PCDP_CONSOLE_DEBUG 0x1
|
||||
#define PCDP_CONSOLE_OUT 0x2
|
||||
#define PCDP_CONSOLE_IN 0x3
|
||||
#define PCDP_CONSOLE_TYPE_VGA 0x8
|
||||
|
||||
#define PCDP_CONSOLE_VGA (PCDP_CONSOLE_TYPE_VGA | PCDP_CONSOLE_OUT)
|
||||
|
||||
/* from pcdp_interface_pci.type */
|
||||
#define PCDP_IF_PCI 1
|
||||
|
||||
/* from pcdp_interface_pci.translation */
|
||||
#define PCDP_PCI_TRANS_IOPORT 0x02
|
||||
#define PCDP_PCI_TRANS_MMIO 0x01
|
||||
|
||||
static void
|
||||
sn_scan_pcdp(void)
|
||||
{
|
||||
u8 *bp;
|
||||
struct pcdp *pcdp;
|
||||
struct pcdp_device_desc device;
|
||||
struct pcdp_interface_pci if_pci;
|
||||
extern struct efi efi;
|
||||
|
||||
pcdp = efi.hcdp;
|
||||
if (! pcdp)
|
||||
return; /* no hcdp/pcdp table */
|
||||
|
||||
if (pcdp->rev < 3)
|
||||
return; /* only support PCDP (rev >= 3) */
|
||||
|
||||
for (bp = (u8 *)&pcdp->uart[pcdp->num_type0];
|
||||
bp < (u8 *)pcdp + pcdp->length;
|
||||
bp += device.length) {
|
||||
memcpy(&device, bp, sizeof(device));
|
||||
if (! (device.primary & PCDP_PRIMARY_CONSOLE))
|
||||
continue; /* not primary console */
|
||||
|
||||
if (device.type != PCDP_CONSOLE_VGA)
|
||||
continue; /* not VGA descriptor */
|
||||
|
||||
memcpy(&if_pci, bp+sizeof(device), sizeof(if_pci));
|
||||
if (if_pci.type != PCDP_IF_PCI)
|
||||
continue; /* not PCI interconnect */
|
||||
|
||||
if (if_pci.translation & PCDP_PCI_TRANS_IOPORT)
|
||||
vga_console_iobase =
|
||||
if_pci.ioport_tra | __IA64_UNCACHED_OFFSET;
|
||||
|
||||
if (if_pci.translation & PCDP_PCI_TRANS_MMIO)
|
||||
vga_console_membase =
|
||||
if_pci.mmio_tra | __IA64_UNCACHED_OFFSET;
|
||||
|
||||
break; /* once we find the primary, we're done */
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* sn_setup - SN platform setup routine
|
||||
* @cmdline_p: kernel command line
|
||||
|
@ -263,16 +393,35 @@ void __init sn_setup(char **cmdline_p)
|
|||
|
||||
#if defined(CONFIG_VT) && defined(CONFIG_VGA_CONSOLE)
|
||||
/*
|
||||
* If there was a primary vga adapter identified through the
|
||||
* EFI PCDP table, make it the preferred console. Otherwise
|
||||
* zero out conswitchp.
|
||||
* Handle SN vga console.
|
||||
*
|
||||
* SN systems do not have enough ACPI table information
|
||||
* being passed from prom to identify VGA adapters and the legacy
|
||||
* addresses to access them. Until that is done, SN systems rely
|
||||
* on the PCDP table to identify the primary VGA console if one
|
||||
* exists.
|
||||
*
|
||||
* However, kernel PCDP support is optional, and even if it is built
|
||||
* into the kernel, it will not be used if the boot cmdline contains
|
||||
* console= directives.
|
||||
*
|
||||
* So, to work around this mess, we duplicate some of the PCDP code
|
||||
* here so that the primary VGA console (as defined by PCDP) will
|
||||
* work on SN systems even if a different console (e.g. serial) is
|
||||
* selected on the boot line (or CONFIG_EFI_PCDP is off).
|
||||
*/
|
||||
|
||||
if (! vga_console_membase)
|
||||
sn_scan_pcdp();
|
||||
|
||||
if (vga_console_membase) {
|
||||
/* usable vga ... make tty0 the preferred default console */
|
||||
add_preferred_console("tty", 0, NULL);
|
||||
if (!strstr(*cmdline_p, "console="))
|
||||
add_preferred_console("tty", 0, NULL);
|
||||
} else {
|
||||
printk(KERN_DEBUG "SGI: Disabling VGA console\n");
|
||||
if (!strstr(*cmdline_p, "console="))
|
||||
add_preferred_console("ttySG", 0, NULL);
|
||||
#ifdef CONFIG_DUMMY_CONSOLE
|
||||
conswitchp = &dummy_con;
|
||||
#else
|
||||
|
|
|
@ -581,17 +581,12 @@ config ARCH_FLATMEM_ENABLE
|
|||
def_bool y
|
||||
depends on PPC64 && !NUMA
|
||||
|
||||
config ARCH_DISCONTIGMEM_ENABLE
|
||||
def_bool y
|
||||
depends on SMP && PPC_PSERIES
|
||||
|
||||
config ARCH_DISCONTIGMEM_DEFAULT
|
||||
def_bool y
|
||||
depends on ARCH_DISCONTIGMEM_ENABLE
|
||||
|
||||
config ARCH_SPARSEMEM_ENABLE
|
||||
def_bool y
|
||||
depends on ARCH_DISCONTIGMEM_ENABLE
|
||||
|
||||
config ARCH_SPARSEMEM_DEFAULT
|
||||
def_bool y
|
||||
depends on SMP && PPC_PSERIES
|
||||
|
||||
source "mm/Kconfig"
|
||||
|
||||
|
|
|
@ -12,11 +12,13 @@ CFLAGS_btext.o += -fPIC
|
|||
endif
|
||||
|
||||
obj-y := semaphore.o cputable.o ptrace.o syscalls.o \
|
||||
irq.o signal_32.o pmc.o
|
||||
irq.o signal_32.o pmc.o vdso.o
|
||||
obj-y += vdso32/
|
||||
obj-$(CONFIG_PPC64) += setup_64.o binfmt_elf32.o sys_ppc32.o \
|
||||
signal_64.o ptrace32.o systbl.o \
|
||||
paca.o ioctl32.o cpu_setup_power4.o \
|
||||
firmware.o sysfs.o
|
||||
firmware.o sysfs.o udbg.o
|
||||
obj-$(CONFIG_PPC64) += vdso64/
|
||||
obj-$(CONFIG_ALTIVEC) += vecemu.o vector.o
|
||||
obj-$(CONFIG_POWER4) += idle_power4.o
|
||||
obj-$(CONFIG_PPC_OF) += of_device.o
|
||||
|
@ -29,6 +31,10 @@ obj-$(CONFIG_RTAS_PROC) += rtas-proc.o
|
|||
obj-$(CONFIG_LPARCFG) += lparcfg.o
|
||||
obj-$(CONFIG_IBMVIO) += vio.o
|
||||
obj-$(CONFIG_GENERIC_TBSYNC) += smp-tbsync.o
|
||||
obj-$(CONFIG_PPC_PSERIES) += udbg_16550.o
|
||||
obj-$(CONFIG_PPC_MAPLE) += udbg_16550.o
|
||||
udbgscc-$(CONFIG_PPC64) := udbg_scc.o
|
||||
obj-$(CONFIG_PPC_PMAC) += $(udbgscc-y)
|
||||
|
||||
ifeq ($(CONFIG_PPC_MERGE),y)
|
||||
|
||||
|
|
|
@ -37,12 +37,12 @@
|
|||
#include <asm/cputable.h>
|
||||
#include <asm/thread_info.h>
|
||||
#include <asm/rtas.h>
|
||||
#include <asm/vdso_datapage.h>
|
||||
#ifdef CONFIG_PPC64
|
||||
#include <asm/paca.h>
|
||||
#include <asm/lppaca.h>
|
||||
#include <asm/iseries/hv_lp_event.h>
|
||||
#include <asm/cache.h>
|
||||
#include <asm/systemcfg.h>
|
||||
#include <asm/compat.h>
|
||||
#endif
|
||||
|
||||
|
@ -251,25 +251,42 @@ int main(void)
|
|||
|
||||
DEFINE(TASK_SIZE, TASK_SIZE);
|
||||
DEFINE(NUM_USER_SEGMENTS, TASK_SIZE>>28);
|
||||
#else /* CONFIG_PPC64 */
|
||||
/* systemcfg offsets for use by vdso */
|
||||
DEFINE(CFG_TB_ORIG_STAMP, offsetof(struct systemcfg, tb_orig_stamp));
|
||||
DEFINE(CFG_TB_TICKS_PER_SEC, offsetof(struct systemcfg, tb_ticks_per_sec));
|
||||
DEFINE(CFG_TB_TO_XS, offsetof(struct systemcfg, tb_to_xs));
|
||||
DEFINE(CFG_STAMP_XSEC, offsetof(struct systemcfg, stamp_xsec));
|
||||
DEFINE(CFG_TB_UPDATE_COUNT, offsetof(struct systemcfg, tb_update_count));
|
||||
DEFINE(CFG_TZ_MINUTEWEST, offsetof(struct systemcfg, tz_minuteswest));
|
||||
DEFINE(CFG_TZ_DSTTIME, offsetof(struct systemcfg, tz_dsttime));
|
||||
DEFINE(CFG_SYSCALL_MAP32, offsetof(struct systemcfg, syscall_map_32));
|
||||
DEFINE(CFG_SYSCALL_MAP64, offsetof(struct systemcfg, syscall_map_64));
|
||||
#endif /* ! CONFIG_PPC64 */
|
||||
|
||||
/* timeval/timezone offsets for use by vdso */
|
||||
/* datapage offsets for use by vdso */
|
||||
DEFINE(CFG_TB_ORIG_STAMP, offsetof(struct vdso_data, tb_orig_stamp));
|
||||
DEFINE(CFG_TB_TICKS_PER_SEC, offsetof(struct vdso_data, tb_ticks_per_sec));
|
||||
DEFINE(CFG_TB_TO_XS, offsetof(struct vdso_data, tb_to_xs));
|
||||
DEFINE(CFG_STAMP_XSEC, offsetof(struct vdso_data, stamp_xsec));
|
||||
DEFINE(CFG_TB_UPDATE_COUNT, offsetof(struct vdso_data, tb_update_count));
|
||||
DEFINE(CFG_TZ_MINUTEWEST, offsetof(struct vdso_data, tz_minuteswest));
|
||||
DEFINE(CFG_TZ_DSTTIME, offsetof(struct vdso_data, tz_dsttime));
|
||||
DEFINE(CFG_SYSCALL_MAP32, offsetof(struct vdso_data, syscall_map_32));
|
||||
DEFINE(WTOM_CLOCK_SEC, offsetof(struct vdso_data, wtom_clock_sec));
|
||||
DEFINE(WTOM_CLOCK_NSEC, offsetof(struct vdso_data, wtom_clock_nsec));
|
||||
#ifdef CONFIG_PPC64
|
||||
DEFINE(CFG_SYSCALL_MAP64, offsetof(struct vdso_data, syscall_map_64));
|
||||
DEFINE(TVAL64_TV_SEC, offsetof(struct timeval, tv_sec));
|
||||
DEFINE(TVAL64_TV_USEC, offsetof(struct timeval, tv_usec));
|
||||
DEFINE(TVAL32_TV_SEC, offsetof(struct compat_timeval, tv_sec));
|
||||
DEFINE(TVAL32_TV_USEC, offsetof(struct compat_timeval, tv_usec));
|
||||
DEFINE(TSPC32_TV_SEC, offsetof(struct compat_timespec, tv_sec));
|
||||
DEFINE(TSPC32_TV_NSEC, offsetof(struct compat_timespec, tv_nsec));
|
||||
#else
|
||||
DEFINE(TVAL32_TV_SEC, offsetof(struct timeval, tv_sec));
|
||||
DEFINE(TVAL32_TV_USEC, offsetof(struct timeval, tv_usec));
|
||||
DEFINE(TSPEC32_TV_SEC, offsetof(struct timespec, tv_sec));
|
||||
DEFINE(TSPEC32_TV_NSEC, offsetof(struct timespec, tv_nsec));
|
||||
#endif
|
||||
/* timeval/timezone offsets for use by vdso */
|
||||
DEFINE(TZONE_TZ_MINWEST, offsetof(struct timezone, tz_minuteswest));
|
||||
DEFINE(TZONE_TZ_DSTTIME, offsetof(struct timezone, tz_dsttime));
|
||||
#endif /* CONFIG_PPC64 */
|
||||
|
||||
/* Other bits used by the vdso */
|
||||
DEFINE(CLOCK_REALTIME, CLOCK_REALTIME);
|
||||
DEFINE(CLOCK_MONOTONIC, CLOCK_MONOTONIC);
|
||||
DEFINE(NSEC_PER_SEC, NSEC_PER_SEC);
|
||||
DEFINE(CLOCK_REALTIME_RES, TICK_NSEC);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -1100,6 +1100,7 @@ start_here:
|
|||
mr r3,r31
|
||||
mr r4,r30
|
||||
bl machine_init
|
||||
bl __save_cpu_setup
|
||||
bl MMU_init
|
||||
|
||||
#ifdef CONFIG_APUS
|
||||
|
|
|
@ -40,10 +40,6 @@ IOCTL_TABLE_START
|
|||
#define DECLARES
|
||||
#include "compat_ioctl.c"
|
||||
|
||||
/* Little p (/dev/rtc, /dev/envctrl, etc.) */
|
||||
COMPATIBLE_IOCTL(_IOR('p', 20, int[7])) /* RTCGET */
|
||||
COMPATIBLE_IOCTL(_IOW('p', 21, int[7])) /* RTCSET */
|
||||
|
||||
IOCTL_TABLE_END
|
||||
|
||||
int ioctl_table_size = ARRAY_SIZE(ioctl_start);
|
||||
|
|
|
@ -35,7 +35,7 @@
|
|||
#include <asm/time.h>
|
||||
#include <asm/iseries/it_exp_vpd_panel.h>
|
||||
#include <asm/prom.h>
|
||||
#include <asm/systemcfg.h>
|
||||
#include <asm/vdso_datapage.h>
|
||||
|
||||
#define MODULE_VERS "1.6"
|
||||
#define MODULE_NAME "lparcfg"
|
||||
|
@ -43,7 +43,7 @@
|
|||
/* #define LPARCFG_DEBUG */
|
||||
|
||||
/* find a better place for this function... */
|
||||
void log_plpar_hcall_return(unsigned long rc, char *tag)
|
||||
static void log_plpar_hcall_return(unsigned long rc, char *tag)
|
||||
{
|
||||
if (rc == 0) /* success, return */
|
||||
return;
|
||||
|
@ -213,11 +213,10 @@ static void h_pic(unsigned long *pool_idle_time, unsigned long *num_procs)
|
|||
unsigned long dummy;
|
||||
rc = plpar_hcall(H_PIC, 0, 0, 0, 0, pool_idle_time, num_procs, &dummy);
|
||||
|
||||
log_plpar_hcall_return(rc, "H_PIC");
|
||||
if (rc != H_Authority)
|
||||
log_plpar_hcall_return(rc, "H_PIC");
|
||||
}
|
||||
|
||||
static unsigned long get_purr(void);
|
||||
|
||||
/* Track sum of all purrs across all processors. This is used to further */
|
||||
/* calculate usage values by different applications */
|
||||
|
||||
|
@ -319,8 +318,6 @@ static void parse_system_parameter_string(struct seq_file *m)
|
|||
kfree(local_buffer);
|
||||
}
|
||||
|
||||
static int lparcfg_count_active_processors(void);
|
||||
|
||||
/* Return the number of processors in the system.
|
||||
* This function reads through the device tree and counts
|
||||
* the virtual processors, this does not include threads.
|
||||
|
@ -372,7 +369,7 @@ static int lparcfg_data(struct seq_file *m, void *v)
|
|||
lrdrp = (int *)get_property(rtas_node, "ibm,lrdr-capacity", NULL);
|
||||
|
||||
if (lrdrp == NULL) {
|
||||
partition_potential_processors = _systemcfg->processorCount;
|
||||
partition_potential_processors = vdso_data->processorCount;
|
||||
} else {
|
||||
partition_potential_processors = *(lrdrp + 4);
|
||||
}
|
||||
|
@ -548,7 +545,7 @@ static ssize_t lparcfg_write(struct file *file, const char __user * buf,
|
|||
retval = -EIO;
|
||||
}
|
||||
|
||||
out:
|
||||
out:
|
||||
kfree(kbuf);
|
||||
return retval;
|
||||
}
|
||||
|
@ -561,10 +558,10 @@ static int lparcfg_open(struct inode *inode, struct file *file)
|
|||
}
|
||||
|
||||
struct file_operations lparcfg_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.read = seq_read,
|
||||
.open = lparcfg_open,
|
||||
.release = single_release,
|
||||
.owner = THIS_MODULE,
|
||||
.read = seq_read,
|
||||
.open = lparcfg_open,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
int __init lparcfg_init(void)
|
||||
|
|
|
@ -15,17 +15,10 @@
|
|||
#include <asm/processor.h>
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/systemcfg.h>
|
||||
#include <asm/lppaca.h>
|
||||
#include <asm/iseries/it_lp_queue.h>
|
||||
#include <asm/paca.h>
|
||||
|
||||
static union {
|
||||
struct systemcfg data;
|
||||
u8 page[PAGE_SIZE];
|
||||
} systemcfg_store __attribute__((__section__(".data.page.aligned")));
|
||||
struct systemcfg *_systemcfg = &systemcfg_store.data;
|
||||
|
||||
|
||||
/* This symbol is provided by the linker - let it fill in the paca
|
||||
* field correctly */
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
#include <linux/slab.h>
|
||||
#include <linux/kernel.h>
|
||||
|
||||
#include <asm/systemcfg.h>
|
||||
#include <asm/vdso_datapage.h>
|
||||
#include <asm/rtas.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/prom.h>
|
||||
|
@ -72,7 +72,7 @@ static int __init proc_ppc64_init(void)
|
|||
if (!pde)
|
||||
return 1;
|
||||
pde->nlink = 1;
|
||||
pde->data = _systemcfg;
|
||||
pde->data = vdso_data;
|
||||
pde->size = PAGE_SIZE;
|
||||
pde->proc_fops = &page_map_fops;
|
||||
|
||||
|
|
|
@ -32,7 +32,6 @@
|
|||
#include <asm/rtas.h>
|
||||
#include <asm/machdep.h> /* for ppc_md */
|
||||
#include <asm/time.h>
|
||||
#include <asm/systemcfg.h>
|
||||
|
||||
/* Token for Sensors */
|
||||
#define KEY_SWITCH 0x0001
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
#include <asm/io.h>
|
||||
#include <asm/prom.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/systemcfg.h>
|
||||
#include <asm/vdso_datapage.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/smp.h>
|
||||
#include <asm/elf.h>
|
||||
|
@ -444,10 +444,8 @@ void __init check_for_initrd(void)
|
|||
if (initrd_start >= KERNELBASE && initrd_end >= KERNELBASE &&
|
||||
initrd_end > initrd_start)
|
||||
ROOT_DEV = Root_RAM0;
|
||||
else {
|
||||
printk("Bogus initrd %08lx %08lx\n", initrd_start, initrd_end);
|
||||
else
|
||||
initrd_start = initrd_end = 0;
|
||||
}
|
||||
|
||||
if (initrd_start)
|
||||
printk("Found initrd at 0x%lx:0x%lx\n", initrd_start, initrd_end);
|
||||
|
@ -566,7 +564,7 @@ void __init smp_setup_cpu_maps(void)
|
|||
cpu_set(cpu ^ 0x1, cpu_sibling_map[cpu]);
|
||||
}
|
||||
|
||||
_systemcfg->processorCount = num_present_cpus();
|
||||
vdso_data->processorCount = num_present_cpus();
|
||||
#endif /* CONFIG_PPC64 */
|
||||
}
|
||||
#endif /* CONFIG_SMP */
|
||||
|
|
|
@ -57,7 +57,6 @@
|
|||
#include <asm/lmb.h>
|
||||
#include <asm/iseries/it_lp_naca.h>
|
||||
#include <asm/firmware.h>
|
||||
#include <asm/systemcfg.h>
|
||||
#include <asm/xmon.h>
|
||||
#include <asm/udbg.h>
|
||||
|
||||
|
@ -375,9 +374,8 @@ static void __init initialize_cache_info(void)
|
|||
DBG("Argh, can't find dcache properties ! "
|
||||
"sizep: %p, lsizep: %p\n", sizep, lsizep);
|
||||
|
||||
_systemcfg->dcache_size = ppc64_caches.dsize = size;
|
||||
_systemcfg->dcache_line_size =
|
||||
ppc64_caches.dline_size = lsize;
|
||||
ppc64_caches.dsize = size;
|
||||
ppc64_caches.dline_size = lsize;
|
||||
ppc64_caches.log_dline_size = __ilog2(lsize);
|
||||
ppc64_caches.dlines_per_page = PAGE_SIZE / lsize;
|
||||
|
||||
|
@ -393,22 +391,13 @@ static void __init initialize_cache_info(void)
|
|||
DBG("Argh, can't find icache properties ! "
|
||||
"sizep: %p, lsizep: %p\n", sizep, lsizep);
|
||||
|
||||
_systemcfg->icache_size = ppc64_caches.isize = size;
|
||||
_systemcfg->icache_line_size =
|
||||
ppc64_caches.iline_size = lsize;
|
||||
ppc64_caches.isize = size;
|
||||
ppc64_caches.iline_size = lsize;
|
||||
ppc64_caches.log_iline_size = __ilog2(lsize);
|
||||
ppc64_caches.ilines_per_page = PAGE_SIZE / lsize;
|
||||
}
|
||||
}
|
||||
|
||||
/* Add an eye catcher and the systemcfg layout version number */
|
||||
strcpy(_systemcfg->eye_catcher, "SYSTEMCFG:PPC64");
|
||||
_systemcfg->version.major = SYSTEMCFG_MAJOR;
|
||||
_systemcfg->version.minor = SYSTEMCFG_MINOR;
|
||||
_systemcfg->processor = mfspr(SPRN_PVR);
|
||||
_systemcfg->platform = _machine;
|
||||
_systemcfg->physicalMemorySize = lmb_phys_mem_size();
|
||||
|
||||
DBG(" <- initialize_cache_info()\n");
|
||||
}
|
||||
|
||||
|
@ -495,15 +484,14 @@ void __init setup_system(void)
|
|||
|
||||
printk("-----------------------------------------------------\n");
|
||||
printk("ppc64_pft_size = 0x%lx\n", ppc64_pft_size);
|
||||
printk("ppc64_interrupt_controller = 0x%ld\n", ppc64_interrupt_controller);
|
||||
printk("systemcfg = 0x%p\n", _systemcfg);
|
||||
printk("systemcfg->platform = 0x%x\n", _systemcfg->platform);
|
||||
printk("systemcfg->processorCount = 0x%lx\n", _systemcfg->processorCount);
|
||||
printk("systemcfg->physicalMemorySize = 0x%lx\n", _systemcfg->physicalMemorySize);
|
||||
printk("ppc64_interrupt_controller = 0x%ld\n",
|
||||
ppc64_interrupt_controller);
|
||||
printk("platform = 0x%x\n", _machine);
|
||||
printk("physicalMemorySize = 0x%lx\n", lmb_phys_mem_size());
|
||||
printk("ppc64_caches.dcache_line_size = 0x%x\n",
|
||||
ppc64_caches.dline_size);
|
||||
ppc64_caches.dline_size);
|
||||
printk("ppc64_caches.icache_line_size = 0x%x\n",
|
||||
ppc64_caches.iline_size);
|
||||
ppc64_caches.iline_size);
|
||||
printk("htab_address = 0x%p\n", htab_address);
|
||||
printk("htab_hash_mask = 0x%lx\n", htab_hash_mask);
|
||||
printk("-----------------------------------------------------\n");
|
||||
|
@ -567,33 +555,6 @@ static void __init emergency_stack_init(void)
|
|||
__va(lmb_alloc_base(HW_PAGE_SIZE, 128, limit)) + HW_PAGE_SIZE;
|
||||
}
|
||||
|
||||
/*
|
||||
* Called from setup_arch to initialize the bitmap of available
|
||||
* syscalls in the systemcfg page
|
||||
*/
|
||||
void __init setup_syscall_map(void)
|
||||
{
|
||||
unsigned int i, count64 = 0, count32 = 0;
|
||||
extern unsigned long *sys_call_table;
|
||||
extern unsigned long sys_ni_syscall;
|
||||
|
||||
|
||||
for (i = 0; i < __NR_syscalls; i++) {
|
||||
if (sys_call_table[i*2] != sys_ni_syscall) {
|
||||
count64++;
|
||||
_systemcfg->syscall_map_64[i >> 5] |=
|
||||
0x80000000UL >> (i & 0x1f);
|
||||
}
|
||||
if (sys_call_table[i*2+1] != sys_ni_syscall) {
|
||||
count32++;
|
||||
_systemcfg->syscall_map_32[i >> 5] |=
|
||||
0x80000000UL >> (i & 0x1f);
|
||||
}
|
||||
}
|
||||
printk(KERN_INFO "Syscall map setup, %d 32-bit and %d 64-bit syscalls\n",
|
||||
count32, count64);
|
||||
}
|
||||
|
||||
/*
|
||||
* Called into from start_kernel, after lock_kernel has been called.
|
||||
* Initializes bootmem, which is unsed to manage page allocation until
|
||||
|
@ -635,9 +596,6 @@ void __init setup_arch(char **cmdline_p)
|
|||
do_init_bootmem();
|
||||
sparse_init();
|
||||
|
||||
/* initialize the syscall map in systemcfg */
|
||||
setup_syscall_map();
|
||||
|
||||
#ifdef CONFIG_DUMMY_CONSOLE
|
||||
conswitchp = &dummy_con;
|
||||
#endif
|
||||
|
|
|
@ -43,10 +43,10 @@
|
|||
#include <asm/uaccess.h>
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/sigcontext.h>
|
||||
#include <asm/vdso.h>
|
||||
#ifdef CONFIG_PPC64
|
||||
#include "ppc32.h"
|
||||
#include <asm/unistd.h>
|
||||
#include <asm/vdso.h>
|
||||
#else
|
||||
#include <asm/ucontext.h>
|
||||
#include <asm/pgtable.h>
|
||||
|
@ -809,14 +809,11 @@ static int handle_rt_signal(unsigned long sig, struct k_sigaction *ka,
|
|||
|
||||
/* Save user registers on the stack */
|
||||
frame = &rt_sf->uc.uc_mcontext;
|
||||
#ifdef CONFIG_PPC64
|
||||
if (vdso32_rt_sigtramp && current->thread.vdso_base) {
|
||||
if (save_user_regs(regs, frame, 0))
|
||||
goto badframe;
|
||||
regs->link = current->thread.vdso_base + vdso32_rt_sigtramp;
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
} else {
|
||||
if (save_user_regs(regs, frame, __NR_rt_sigreturn))
|
||||
goto badframe;
|
||||
regs->link = (unsigned long) frame->tramp;
|
||||
|
@ -1090,14 +1087,11 @@ static int handle_signal(unsigned long sig, struct k_sigaction *ka,
|
|||
|| __put_user(sig, &sc->signal))
|
||||
goto badframe;
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
if (vdso32_sigtramp && current->thread.vdso_base) {
|
||||
if (save_user_regs(regs, &frame->mctx, 0))
|
||||
goto badframe;
|
||||
regs->link = current->thread.vdso_base + vdso32_sigtramp;
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
} else {
|
||||
if (save_user_regs(regs, &frame->mctx, __NR_sigreturn))
|
||||
goto badframe;
|
||||
regs->link = (unsigned long) frame->mctx.tramp;
|
||||
|
|
|
@ -44,7 +44,7 @@
|
|||
#include <asm/cputable.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/mpic.h>
|
||||
#include <asm/systemcfg.h>
|
||||
#include <asm/vdso_datapage.h>
|
||||
#ifdef CONFIG_PPC64
|
||||
#include <asm/paca.h>
|
||||
#endif
|
||||
|
@ -371,7 +371,7 @@ int generic_cpu_disable(void)
|
|||
|
||||
cpu_clear(cpu, cpu_online_map);
|
||||
#ifdef CONFIG_PPC64
|
||||
_systemcfg->processorCount--;
|
||||
vdso_data->processorCount--;
|
||||
fixup_irqs(cpu_online_map);
|
||||
#endif
|
||||
return 0;
|
||||
|
|
|
@ -16,7 +16,6 @@
|
|||
#include <asm/firmware.h>
|
||||
#include <asm/hvcall.h>
|
||||
#include <asm/prom.h>
|
||||
#include <asm/systemcfg.h>
|
||||
#include <asm/paca.h>
|
||||
#include <asm/lppaca.h>
|
||||
#include <asm/machdep.h>
|
||||
|
|
|
@ -62,8 +62,8 @@
|
|||
#include <asm/irq.h>
|
||||
#include <asm/div64.h>
|
||||
#include <asm/smp.h>
|
||||
#include <asm/vdso_datapage.h>
|
||||
#ifdef CONFIG_PPC64
|
||||
#include <asm/systemcfg.h>
|
||||
#include <asm/firmware.h>
|
||||
#endif
|
||||
#ifdef CONFIG_PPC_ISERIES
|
||||
|
@ -261,7 +261,6 @@ static inline void update_gtod(u64 new_tb_stamp, u64 new_stamp_xsec,
|
|||
do_gtod.varp = temp_varp;
|
||||
do_gtod.var_idx = temp_idx;
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
/*
|
||||
* tb_update_count is used to allow the userspace gettimeofday code
|
||||
* to assure itself that it sees a consistent view of the tb_to_xs and
|
||||
|
@ -271,14 +270,15 @@ static inline void update_gtod(u64 new_tb_stamp, u64 new_stamp_xsec,
|
|||
* tb_to_xs and stamp_xsec values are consistent. If not, then it
|
||||
* loops back and reads them again until this criteria is met.
|
||||
*/
|
||||
++(_systemcfg->tb_update_count);
|
||||
++(vdso_data->tb_update_count);
|
||||
smp_wmb();
|
||||
_systemcfg->tb_orig_stamp = new_tb_stamp;
|
||||
_systemcfg->stamp_xsec = new_stamp_xsec;
|
||||
_systemcfg->tb_to_xs = new_tb_to_xs;
|
||||
vdso_data->tb_orig_stamp = new_tb_stamp;
|
||||
vdso_data->stamp_xsec = new_stamp_xsec;
|
||||
vdso_data->tb_to_xs = new_tb_to_xs;
|
||||
vdso_data->wtom_clock_sec = wall_to_monotonic.tv_sec;
|
||||
vdso_data->wtom_clock_nsec = wall_to_monotonic.tv_nsec;
|
||||
smp_wmb();
|
||||
++(_systemcfg->tb_update_count);
|
||||
#endif
|
||||
++(vdso_data->tb_update_count);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -357,9 +357,8 @@ static void iSeries_tb_recal(void)
|
|||
do_gtod.tb_ticks_per_sec = tb_ticks_per_sec;
|
||||
tb_to_xs = divres.result_low;
|
||||
do_gtod.varp->tb_to_xs = tb_to_xs;
|
||||
_systemcfg->tb_ticks_per_sec =
|
||||
tb_ticks_per_sec;
|
||||
_systemcfg->tb_to_xs = tb_to_xs;
|
||||
vdso_data->tb_ticks_per_sec = tb_ticks_per_sec;
|
||||
vdso_data->tb_to_xs = tb_to_xs;
|
||||
}
|
||||
else {
|
||||
printk( "Titan recalibrate: FAILED (difference > 4 percent)\n"
|
||||
|
@ -561,10 +560,8 @@ int do_settimeofday(struct timespec *tv)
|
|||
new_xsec += (u64)new_sec * XSEC_PER_SEC - tb_delta_xs;
|
||||
update_gtod(tb_last_jiffy, new_xsec, do_gtod.varp->tb_to_xs);
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
_systemcfg->tz_minuteswest = sys_tz.tz_minuteswest;
|
||||
_systemcfg->tz_dsttime = sys_tz.tz_dsttime;
|
||||
#endif
|
||||
vdso_data->tz_minuteswest = sys_tz.tz_minuteswest;
|
||||
vdso_data->tz_dsttime = sys_tz.tz_dsttime;
|
||||
|
||||
write_sequnlock_irqrestore(&xtime_lock, flags);
|
||||
clock_was_set();
|
||||
|
@ -713,13 +710,12 @@ void __init time_init(void)
|
|||
do_gtod.tb_ticks_per_sec = tb_ticks_per_sec;
|
||||
do_gtod.varp->tb_to_xs = tb_to_xs;
|
||||
do_gtod.tb_to_us = tb_to_us;
|
||||
#ifdef CONFIG_PPC64
|
||||
_systemcfg->tb_orig_stamp = tb_last_jiffy;
|
||||
_systemcfg->tb_update_count = 0;
|
||||
_systemcfg->tb_ticks_per_sec = tb_ticks_per_sec;
|
||||
_systemcfg->stamp_xsec = xtime.tv_sec * XSEC_PER_SEC;
|
||||
_systemcfg->tb_to_xs = tb_to_xs;
|
||||
#endif
|
||||
|
||||
vdso_data->tb_orig_stamp = tb_last_jiffy;
|
||||
vdso_data->tb_update_count = 0;
|
||||
vdso_data->tb_ticks_per_sec = tb_ticks_per_sec;
|
||||
vdso_data->stamp_xsec = xtime.tv_sec * XSEC_PER_SEC;
|
||||
vdso_data->tb_to_xs = tb_to_xs;
|
||||
|
||||
time_freq = 0;
|
||||
|
||||
|
|
|
@ -49,7 +49,6 @@
|
|||
#ifdef CONFIG_PPC64
|
||||
#include <asm/firmware.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/systemcfg.h>
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PPC64 /* XXX */
|
||||
|
|
|
@ -0,0 +1,746 @@
|
|||
/*
|
||||
* linux/arch/ppc64/kernel/vdso.c
|
||||
*
|
||||
* Copyright (C) 2004 Benjamin Herrenschmidt, IBM Corp.
|
||||
* <benh@kernel.crashing.org>
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/smp.h>
|
||||
#include <linux/smp_lock.h>
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/unistd.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/user.h>
|
||||
#include <linux/elf.h>
|
||||
#include <linux/security.h>
|
||||
#include <linux/bootmem.h>
|
||||
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/mmu.h>
|
||||
#include <asm/mmu_context.h>
|
||||
#include <asm/lmb.h>
|
||||
#include <asm/machdep.h>
|
||||
#include <asm/cputable.h>
|
||||
#include <asm/sections.h>
|
||||
#include <asm/vdso.h>
|
||||
#include <asm/vdso_datapage.h>
|
||||
|
||||
#undef DEBUG
|
||||
|
||||
#ifdef DEBUG
|
||||
#define DBG(fmt...) printk(fmt)
|
||||
#else
|
||||
#define DBG(fmt...)
|
||||
#endif
|
||||
|
||||
/* Max supported size for symbol names */
|
||||
#define MAX_SYMNAME 64
|
||||
|
||||
extern char vdso32_start, vdso32_end;
|
||||
static void *vdso32_kbase = &vdso32_start;
|
||||
unsigned int vdso32_pages;
|
||||
unsigned long vdso32_sigtramp;
|
||||
unsigned long vdso32_rt_sigtramp;
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
extern char vdso64_start, vdso64_end;
|
||||
static void *vdso64_kbase = &vdso64_start;
|
||||
unsigned int vdso64_pages;
|
||||
unsigned long vdso64_rt_sigtramp;
|
||||
#endif /* CONFIG_PPC64 */
|
||||
|
||||
/*
|
||||
* The vdso data page (aka. systemcfg for old ppc64 fans) is here.
|
||||
* Once the early boot kernel code no longer needs to muck around
|
||||
* with it, it will become dynamically allocated
|
||||
*/
|
||||
static union {
|
||||
struct vdso_data data;
|
||||
u8 page[PAGE_SIZE];
|
||||
} vdso_data_store __attribute__((__section__(".data.page_aligned")));
|
||||
struct vdso_data *vdso_data = &vdso_data_store.data;
|
||||
|
||||
/* Format of the patch table */
|
||||
struct vdso_patch_def
|
||||
{
|
||||
unsigned long ftr_mask, ftr_value;
|
||||
const char *gen_name;
|
||||
const char *fix_name;
|
||||
};
|
||||
|
||||
/* Table of functions to patch based on the CPU type/revision
|
||||
*
|
||||
* Currently, we only change sync_dicache to do nothing on processors
|
||||
* with a coherent icache
|
||||
*/
|
||||
static struct vdso_patch_def vdso_patches[] = {
|
||||
{
|
||||
CPU_FTR_COHERENT_ICACHE, CPU_FTR_COHERENT_ICACHE,
|
||||
"__kernel_sync_dicache", "__kernel_sync_dicache_p5"
|
||||
},
|
||||
{
|
||||
CPU_FTR_USE_TB, 0,
|
||||
"__kernel_gettimeofday", NULL
|
||||
},
|
||||
};
|
||||
|
||||
/*
|
||||
* Some infos carried around for each of them during parsing at
|
||||
* boot time.
|
||||
*/
|
||||
struct lib32_elfinfo
|
||||
{
|
||||
Elf32_Ehdr *hdr; /* ptr to ELF */
|
||||
Elf32_Sym *dynsym; /* ptr to .dynsym section */
|
||||
unsigned long dynsymsize; /* size of .dynsym section */
|
||||
char *dynstr; /* ptr to .dynstr section */
|
||||
unsigned long text; /* offset of .text section in .so */
|
||||
};
|
||||
|
||||
struct lib64_elfinfo
|
||||
{
|
||||
Elf64_Ehdr *hdr;
|
||||
Elf64_Sym *dynsym;
|
||||
unsigned long dynsymsize;
|
||||
char *dynstr;
|
||||
unsigned long text;
|
||||
};
|
||||
|
||||
|
||||
#ifdef __DEBUG
|
||||
static void dump_one_vdso_page(struct page *pg, struct page *upg)
|
||||
{
|
||||
printk("kpg: %p (c:%d,f:%08lx)", __va(page_to_pfn(pg) << PAGE_SHIFT),
|
||||
page_count(pg),
|
||||
pg->flags);
|
||||
if (upg/* && pg != upg*/) {
|
||||
printk(" upg: %p (c:%d,f:%08lx)", __va(page_to_pfn(upg)
|
||||
<< PAGE_SHIFT),
|
||||
page_count(upg),
|
||||
upg->flags);
|
||||
}
|
||||
printk("\n");
|
||||
}
|
||||
|
||||
static void dump_vdso_pages(struct vm_area_struct * vma)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!vma || test_thread_flag(TIF_32BIT)) {
|
||||
printk("vDSO32 @ %016lx:\n", (unsigned long)vdso32_kbase);
|
||||
for (i=0; i<vdso32_pages; i++) {
|
||||
struct page *pg = virt_to_page(vdso32_kbase +
|
||||
i*PAGE_SIZE);
|
||||
struct page *upg = (vma && vma->vm_mm) ?
|
||||
follow_page(vma->vm_mm, vma->vm_start +
|
||||
i*PAGE_SIZE, 0)
|
||||
: NULL;
|
||||
dump_one_vdso_page(pg, upg);
|
||||
}
|
||||
}
|
||||
if (!vma || !test_thread_flag(TIF_32BIT)) {
|
||||
printk("vDSO64 @ %016lx:\n", (unsigned long)vdso64_kbase);
|
||||
for (i=0; i<vdso64_pages; i++) {
|
||||
struct page *pg = virt_to_page(vdso64_kbase +
|
||||
i*PAGE_SIZE);
|
||||
struct page *upg = (vma && vma->vm_mm) ?
|
||||
follow_page(vma->vm_mm, vma->vm_start +
|
||||
i*PAGE_SIZE, 0)
|
||||
: NULL;
|
||||
dump_one_vdso_page(pg, upg);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* DEBUG */
|
||||
|
||||
/*
|
||||
* Keep a dummy vma_close for now, it will prevent VMA merging.
|
||||
*/
|
||||
static void vdso_vma_close(struct vm_area_struct * vma)
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
* Our nopage() function, maps in the actual vDSO kernel pages, they will
|
||||
* be mapped read-only by do_no_page(), and eventually COW'ed, either
|
||||
* right away for an initial write access, or by do_wp_page().
|
||||
*/
|
||||
static struct page * vdso_vma_nopage(struct vm_area_struct * vma,
|
||||
unsigned long address, int *type)
|
||||
{
|
||||
unsigned long offset = address - vma->vm_start;
|
||||
struct page *pg;
|
||||
#ifdef CONFIG_PPC64
|
||||
void *vbase = test_thread_flag(TIF_32BIT) ?
|
||||
vdso32_kbase : vdso64_kbase;
|
||||
#else
|
||||
void *vbase = vdso32_kbase;
|
||||
#endif
|
||||
|
||||
DBG("vdso_vma_nopage(current: %s, address: %016lx, off: %lx)\n",
|
||||
current->comm, address, offset);
|
||||
|
||||
if (address < vma->vm_start || address > vma->vm_end)
|
||||
return NOPAGE_SIGBUS;
|
||||
|
||||
/*
|
||||
* Last page is systemcfg.
|
||||
*/
|
||||
if ((vma->vm_end - address) <= PAGE_SIZE)
|
||||
pg = virt_to_page(vdso_data);
|
||||
else
|
||||
pg = virt_to_page(vbase + offset);
|
||||
|
||||
get_page(pg);
|
||||
DBG(" ->page count: %d\n", page_count(pg));
|
||||
|
||||
return pg;
|
||||
}
|
||||
|
||||
static struct vm_operations_struct vdso_vmops = {
|
||||
.close = vdso_vma_close,
|
||||
.nopage = vdso_vma_nopage,
|
||||
};
|
||||
|
||||
/*
|
||||
* This is called from binfmt_elf, we create the special vma for the
|
||||
* vDSO and insert it into the mm struct tree
|
||||
*/
|
||||
int arch_setup_additional_pages(struct linux_binprm *bprm,
|
||||
int executable_stack)
|
||||
{
|
||||
struct mm_struct *mm = current->mm;
|
||||
struct vm_area_struct *vma;
|
||||
unsigned long vdso_pages;
|
||||
unsigned long vdso_base;
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
if (test_thread_flag(TIF_32BIT)) {
|
||||
vdso_pages = vdso32_pages;
|
||||
vdso_base = VDSO32_MBASE;
|
||||
} else {
|
||||
vdso_pages = vdso64_pages;
|
||||
vdso_base = VDSO64_MBASE;
|
||||
}
|
||||
#else
|
||||
vdso_pages = vdso32_pages;
|
||||
vdso_base = VDSO32_MBASE;
|
||||
#endif
|
||||
|
||||
current->thread.vdso_base = 0;
|
||||
|
||||
/* vDSO has a problem and was disabled, just don't "enable" it for the
|
||||
* process
|
||||
*/
|
||||
if (vdso_pages == 0)
|
||||
return 0;
|
||||
|
||||
vma = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL);
|
||||
if (vma == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
memset(vma, 0, sizeof(*vma));
|
||||
|
||||
/* Add a page to the vdso size for the data page */
|
||||
vdso_pages ++;
|
||||
|
||||
/*
|
||||
* pick a base address for the vDSO in process space. We try to put it
|
||||
* at vdso_base which is the "natural" base for it, but we might fail
|
||||
* and end up putting it elsewhere.
|
||||
*/
|
||||
vdso_base = get_unmapped_area(NULL, vdso_base,
|
||||
vdso_pages << PAGE_SHIFT, 0, 0);
|
||||
if (vdso_base & ~PAGE_MASK) {
|
||||
kmem_cache_free(vm_area_cachep, vma);
|
||||
return (int)vdso_base;
|
||||
}
|
||||
|
||||
current->thread.vdso_base = vdso_base;
|
||||
|
||||
vma->vm_mm = mm;
|
||||
vma->vm_start = current->thread.vdso_base;
|
||||
vma->vm_end = vma->vm_start + (vdso_pages << PAGE_SHIFT);
|
||||
|
||||
/*
|
||||
* our vma flags don't have VM_WRITE so by default, the process isn't
|
||||
* allowed to write those pages.
|
||||
* gdb can break that with ptrace interface, and thus trigger COW on
|
||||
* those pages but it's then your responsibility to never do that on
|
||||
* the "data" page of the vDSO or you'll stop getting kernel updates
|
||||
* and your nice userland gettimeofday will be totally dead.
|
||||
* It's fine to use that for setting breakpoints in the vDSO code
|
||||
* pages though
|
||||
*/
|
||||
vma->vm_flags = VM_READ | VM_EXEC | VM_MAYREAD | VM_MAYWRITE |
|
||||
VM_MAYEXEC | VM_RESERVED;
|
||||
vma->vm_flags |= mm->def_flags;
|
||||
vma->vm_page_prot = protection_map[vma->vm_flags & 0x7];
|
||||
vma->vm_ops = &vdso_vmops;
|
||||
|
||||
down_write(&mm->mmap_sem);
|
||||
if (insert_vm_struct(mm, vma)) {
|
||||
up_write(&mm->mmap_sem);
|
||||
kmem_cache_free(vm_area_cachep, vma);
|
||||
return -ENOMEM;
|
||||
}
|
||||
mm->total_vm += (vma->vm_end - vma->vm_start) >> PAGE_SHIFT;
|
||||
up_write(&mm->mmap_sem);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void * __init find_section32(Elf32_Ehdr *ehdr, const char *secname,
|
||||
unsigned long *size)
|
||||
{
|
||||
Elf32_Shdr *sechdrs;
|
||||
unsigned int i;
|
||||
char *secnames;
|
||||
|
||||
/* Grab section headers and strings so we can tell who is who */
|
||||
sechdrs = (void *)ehdr + ehdr->e_shoff;
|
||||
secnames = (void *)ehdr + sechdrs[ehdr->e_shstrndx].sh_offset;
|
||||
|
||||
/* Find the section they want */
|
||||
for (i = 1; i < ehdr->e_shnum; i++) {
|
||||
if (strcmp(secnames+sechdrs[i].sh_name, secname) == 0) {
|
||||
if (size)
|
||||
*size = sechdrs[i].sh_size;
|
||||
return (void *)ehdr + sechdrs[i].sh_offset;
|
||||
}
|
||||
}
|
||||
*size = 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static Elf32_Sym * __init find_symbol32(struct lib32_elfinfo *lib,
|
||||
const char *symname)
|
||||
{
|
||||
unsigned int i;
|
||||
char name[MAX_SYMNAME], *c;
|
||||
|
||||
for (i = 0; i < (lib->dynsymsize / sizeof(Elf32_Sym)); i++) {
|
||||
if (lib->dynsym[i].st_name == 0)
|
||||
continue;
|
||||
strlcpy(name, lib->dynstr + lib->dynsym[i].st_name,
|
||||
MAX_SYMNAME);
|
||||
c = strchr(name, '@');
|
||||
if (c)
|
||||
*c = 0;
|
||||
if (strcmp(symname, name) == 0)
|
||||
return &lib->dynsym[i];
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Note that we assume the section is .text and the symbol is relative to
|
||||
* the library base
|
||||
*/
|
||||
static unsigned long __init find_function32(struct lib32_elfinfo *lib,
|
||||
const char *symname)
|
||||
{
|
||||
Elf32_Sym *sym = find_symbol32(lib, symname);
|
||||
|
||||
if (sym == NULL) {
|
||||
printk(KERN_WARNING "vDSO32: function %s not found !\n",
|
||||
symname);
|
||||
return 0;
|
||||
}
|
||||
return sym->st_value - VDSO32_LBASE;
|
||||
}
|
||||
|
||||
static int vdso_do_func_patch32(struct lib32_elfinfo *v32,
|
||||
struct lib64_elfinfo *v64,
|
||||
const char *orig, const char *fix)
|
||||
{
|
||||
Elf32_Sym *sym32_gen, *sym32_fix;
|
||||
|
||||
sym32_gen = find_symbol32(v32, orig);
|
||||
if (sym32_gen == NULL) {
|
||||
printk(KERN_ERR "vDSO32: Can't find symbol %s !\n", orig);
|
||||
return -1;
|
||||
}
|
||||
if (fix == NULL) {
|
||||
sym32_gen->st_name = 0;
|
||||
return 0;
|
||||
}
|
||||
sym32_fix = find_symbol32(v32, fix);
|
||||
if (sym32_fix == NULL) {
|
||||
printk(KERN_ERR "vDSO32: Can't find symbol %s !\n", fix);
|
||||
return -1;
|
||||
}
|
||||
sym32_gen->st_value = sym32_fix->st_value;
|
||||
sym32_gen->st_size = sym32_fix->st_size;
|
||||
sym32_gen->st_info = sym32_fix->st_info;
|
||||
sym32_gen->st_other = sym32_fix->st_other;
|
||||
sym32_gen->st_shndx = sym32_fix->st_shndx;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
|
||||
static void * __init find_section64(Elf64_Ehdr *ehdr, const char *secname,
|
||||
unsigned long *size)
|
||||
{
|
||||
Elf64_Shdr *sechdrs;
|
||||
unsigned int i;
|
||||
char *secnames;
|
||||
|
||||
/* Grab section headers and strings so we can tell who is who */
|
||||
sechdrs = (void *)ehdr + ehdr->e_shoff;
|
||||
secnames = (void *)ehdr + sechdrs[ehdr->e_shstrndx].sh_offset;
|
||||
|
||||
/* Find the section they want */
|
||||
for (i = 1; i < ehdr->e_shnum; i++) {
|
||||
if (strcmp(secnames+sechdrs[i].sh_name, secname) == 0) {
|
||||
if (size)
|
||||
*size = sechdrs[i].sh_size;
|
||||
return (void *)ehdr + sechdrs[i].sh_offset;
|
||||
}
|
||||
}
|
||||
if (size)
|
||||
*size = 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static Elf64_Sym * __init find_symbol64(struct lib64_elfinfo *lib,
|
||||
const char *symname)
|
||||
{
|
||||
unsigned int i;
|
||||
char name[MAX_SYMNAME], *c;
|
||||
|
||||
for (i = 0; i < (lib->dynsymsize / sizeof(Elf64_Sym)); i++) {
|
||||
if (lib->dynsym[i].st_name == 0)
|
||||
continue;
|
||||
strlcpy(name, lib->dynstr + lib->dynsym[i].st_name,
|
||||
MAX_SYMNAME);
|
||||
c = strchr(name, '@');
|
||||
if (c)
|
||||
*c = 0;
|
||||
if (strcmp(symname, name) == 0)
|
||||
return &lib->dynsym[i];
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Note that we assume the section is .text and the symbol is relative to
|
||||
* the library base
|
||||
*/
|
||||
static unsigned long __init find_function64(struct lib64_elfinfo *lib,
|
||||
const char *symname)
|
||||
{
|
||||
Elf64_Sym *sym = find_symbol64(lib, symname);
|
||||
|
||||
if (sym == NULL) {
|
||||
printk(KERN_WARNING "vDSO64: function %s not found !\n",
|
||||
symname);
|
||||
return 0;
|
||||
}
|
||||
#ifdef VDS64_HAS_DESCRIPTORS
|
||||
return *((u64 *)(vdso64_kbase + sym->st_value - VDSO64_LBASE)) -
|
||||
VDSO64_LBASE;
|
||||
#else
|
||||
return sym->st_value - VDSO64_LBASE;
|
||||
#endif
|
||||
}
|
||||
|
||||
static int vdso_do_func_patch64(struct lib32_elfinfo *v32,
|
||||
struct lib64_elfinfo *v64,
|
||||
const char *orig, const char *fix)
|
||||
{
|
||||
Elf64_Sym *sym64_gen, *sym64_fix;
|
||||
|
||||
sym64_gen = find_symbol64(v64, orig);
|
||||
if (sym64_gen == NULL) {
|
||||
printk(KERN_ERR "vDSO64: Can't find symbol %s !\n", orig);
|
||||
return -1;
|
||||
}
|
||||
if (fix == NULL) {
|
||||
sym64_gen->st_name = 0;
|
||||
return 0;
|
||||
}
|
||||
sym64_fix = find_symbol64(v64, fix);
|
||||
if (sym64_fix == NULL) {
|
||||
printk(KERN_ERR "vDSO64: Can't find symbol %s !\n", fix);
|
||||
return -1;
|
||||
}
|
||||
sym64_gen->st_value = sym64_fix->st_value;
|
||||
sym64_gen->st_size = sym64_fix->st_size;
|
||||
sym64_gen->st_info = sym64_fix->st_info;
|
||||
sym64_gen->st_other = sym64_fix->st_other;
|
||||
sym64_gen->st_shndx = sym64_fix->st_shndx;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_PPC64 */
|
||||
|
||||
|
||||
static __init int vdso_do_find_sections(struct lib32_elfinfo *v32,
|
||||
struct lib64_elfinfo *v64)
|
||||
{
|
||||
void *sect;
|
||||
|
||||
/*
|
||||
* Locate symbol tables & text section
|
||||
*/
|
||||
|
||||
v32->dynsym = find_section32(v32->hdr, ".dynsym", &v32->dynsymsize);
|
||||
v32->dynstr = find_section32(v32->hdr, ".dynstr", NULL);
|
||||
if (v32->dynsym == NULL || v32->dynstr == NULL) {
|
||||
printk(KERN_ERR "vDSO32: required symbol section not found\n");
|
||||
return -1;
|
||||
}
|
||||
sect = find_section32(v32->hdr, ".text", NULL);
|
||||
if (sect == NULL) {
|
||||
printk(KERN_ERR "vDSO32: the .text section was not found\n");
|
||||
return -1;
|
||||
}
|
||||
v32->text = sect - vdso32_kbase;
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
v64->dynsym = find_section64(v64->hdr, ".dynsym", &v64->dynsymsize);
|
||||
v64->dynstr = find_section64(v64->hdr, ".dynstr", NULL);
|
||||
if (v64->dynsym == NULL || v64->dynstr == NULL) {
|
||||
printk(KERN_ERR "vDSO64: required symbol section not found\n");
|
||||
return -1;
|
||||
}
|
||||
sect = find_section64(v64->hdr, ".text", NULL);
|
||||
if (sect == NULL) {
|
||||
printk(KERN_ERR "vDSO64: the .text section was not found\n");
|
||||
return -1;
|
||||
}
|
||||
v64->text = sect - vdso64_kbase;
|
||||
#endif /* CONFIG_PPC64 */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static __init void vdso_setup_trampolines(struct lib32_elfinfo *v32,
|
||||
struct lib64_elfinfo *v64)
|
||||
{
|
||||
/*
|
||||
* Find signal trampolines
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
vdso64_rt_sigtramp = find_function64(v64, "__kernel_sigtramp_rt64");
|
||||
#endif
|
||||
vdso32_sigtramp = find_function32(v32, "__kernel_sigtramp32");
|
||||
vdso32_rt_sigtramp = find_function32(v32, "__kernel_sigtramp_rt32");
|
||||
}
|
||||
|
||||
static __init int vdso_fixup_datapage(struct lib32_elfinfo *v32,
|
||||
struct lib64_elfinfo *v64)
|
||||
{
|
||||
Elf32_Sym *sym32;
|
||||
#ifdef CONFIG_PPC64
|
||||
Elf64_Sym *sym64;
|
||||
|
||||
sym64 = find_symbol64(v64, "__kernel_datapage_offset");
|
||||
if (sym64 == NULL) {
|
||||
printk(KERN_ERR "vDSO64: Can't find symbol "
|
||||
"__kernel_datapage_offset !\n");
|
||||
return -1;
|
||||
}
|
||||
*((int *)(vdso64_kbase + sym64->st_value - VDSO64_LBASE)) =
|
||||
(vdso64_pages << PAGE_SHIFT) -
|
||||
(sym64->st_value - VDSO64_LBASE);
|
||||
#endif /* CONFIG_PPC64 */
|
||||
|
||||
sym32 = find_symbol32(v32, "__kernel_datapage_offset");
|
||||
if (sym32 == NULL) {
|
||||
printk(KERN_ERR "vDSO32: Can't find symbol "
|
||||
"__kernel_datapage_offset !\n");
|
||||
return -1;
|
||||
}
|
||||
*((int *)(vdso32_kbase + (sym32->st_value - VDSO32_LBASE))) =
|
||||
(vdso32_pages << PAGE_SHIFT) -
|
||||
(sym32->st_value - VDSO32_LBASE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static __init int vdso_fixup_alt_funcs(struct lib32_elfinfo *v32,
|
||||
struct lib64_elfinfo *v64)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(vdso_patches); i++) {
|
||||
struct vdso_patch_def *patch = &vdso_patches[i];
|
||||
int match = (cur_cpu_spec->cpu_features & patch->ftr_mask)
|
||||
== patch->ftr_value;
|
||||
if (!match)
|
||||
continue;
|
||||
|
||||
DBG("replacing %s with %s...\n", patch->gen_name,
|
||||
patch->fix_name ? "NONE" : patch->fix_name);
|
||||
|
||||
/*
|
||||
* Patch the 32 bits and 64 bits symbols. Note that we do not
|
||||
* patch the "." symbol on 64 bits.
|
||||
* It would be easy to do, but doesn't seem to be necessary,
|
||||
* patching the OPD symbol is enough.
|
||||
*/
|
||||
vdso_do_func_patch32(v32, v64, patch->gen_name,
|
||||
patch->fix_name);
|
||||
#ifdef CONFIG_PPC64
|
||||
vdso_do_func_patch64(v32, v64, patch->gen_name,
|
||||
patch->fix_name);
|
||||
#endif /* CONFIG_PPC64 */
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static __init int vdso_setup(void)
|
||||
{
|
||||
struct lib32_elfinfo v32;
|
||||
struct lib64_elfinfo v64;
|
||||
|
||||
v32.hdr = vdso32_kbase;
|
||||
#ifdef CONFIG_PPC64
|
||||
v64.hdr = vdso64_kbase;
|
||||
#endif
|
||||
if (vdso_do_find_sections(&v32, &v64))
|
||||
return -1;
|
||||
|
||||
if (vdso_fixup_datapage(&v32, &v64))
|
||||
return -1;
|
||||
|
||||
if (vdso_fixup_alt_funcs(&v32, &v64))
|
||||
return -1;
|
||||
|
||||
vdso_setup_trampolines(&v32, &v64);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Called from setup_arch to initialize the bitmap of available
|
||||
* syscalls in the systemcfg page
|
||||
*/
|
||||
static void __init vdso_setup_syscall_map(void)
|
||||
{
|
||||
unsigned int i;
|
||||
extern unsigned long *sys_call_table;
|
||||
extern unsigned long sys_ni_syscall;
|
||||
|
||||
|
||||
for (i = 0; i < __NR_syscalls; i++) {
|
||||
#ifdef CONFIG_PPC64
|
||||
if (sys_call_table[i*2] != sys_ni_syscall)
|
||||
vdso_data->syscall_map_64[i >> 5] |=
|
||||
0x80000000UL >> (i & 0x1f);
|
||||
if (sys_call_table[i*2+1] != sys_ni_syscall)
|
||||
vdso_data->syscall_map_32[i >> 5] |=
|
||||
0x80000000UL >> (i & 0x1f);
|
||||
#else /* CONFIG_PPC64 */
|
||||
if (sys_call_table[i] != sys_ni_syscall)
|
||||
vdso_data->syscall_map_32[i >> 5] |=
|
||||
0x80000000UL >> (i & 0x1f);
|
||||
#endif /* CONFIG_PPC64 */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void __init vdso_init(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
/*
|
||||
* Fill up the "systemcfg" stuff for backward compatiblity
|
||||
*/
|
||||
strcpy(vdso_data->eye_catcher, "SYSTEMCFG:PPC64");
|
||||
vdso_data->version.major = SYSTEMCFG_MAJOR;
|
||||
vdso_data->version.minor = SYSTEMCFG_MINOR;
|
||||
vdso_data->processor = mfspr(SPRN_PVR);
|
||||
vdso_data->platform = _machine;
|
||||
vdso_data->physicalMemorySize = lmb_phys_mem_size();
|
||||
vdso_data->dcache_size = ppc64_caches.dsize;
|
||||
vdso_data->dcache_line_size = ppc64_caches.dline_size;
|
||||
vdso_data->icache_size = ppc64_caches.isize;
|
||||
vdso_data->icache_line_size = ppc64_caches.iline_size;
|
||||
|
||||
/*
|
||||
* Calculate the size of the 64 bits vDSO
|
||||
*/
|
||||
vdso64_pages = (&vdso64_end - &vdso64_start) >> PAGE_SHIFT;
|
||||
DBG("vdso64_kbase: %p, 0x%x pages\n", vdso64_kbase, vdso64_pages);
|
||||
#endif /* CONFIG_PPC64 */
|
||||
|
||||
|
||||
/*
|
||||
* Calculate the size of the 32 bits vDSO
|
||||
*/
|
||||
vdso32_pages = (&vdso32_end - &vdso32_start) >> PAGE_SHIFT;
|
||||
DBG("vdso32_kbase: %p, 0x%x pages\n", vdso32_kbase, vdso32_pages);
|
||||
|
||||
|
||||
/*
|
||||
* Setup the syscall map in the vDOS
|
||||
*/
|
||||
vdso_setup_syscall_map();
|
||||
/*
|
||||
* Initialize the vDSO images in memory, that is do necessary
|
||||
* fixups of vDSO symbols, locate trampolines, etc...
|
||||
*/
|
||||
if (vdso_setup()) {
|
||||
printk(KERN_ERR "vDSO setup failure, not enabled !\n");
|
||||
vdso32_pages = 0;
|
||||
#ifdef CONFIG_PPC64
|
||||
vdso64_pages = 0;
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
/* Make sure pages are in the correct state */
|
||||
for (i = 0; i < vdso32_pages; i++) {
|
||||
struct page *pg = virt_to_page(vdso32_kbase + i*PAGE_SIZE);
|
||||
ClearPageReserved(pg);
|
||||
get_page(pg);
|
||||
|
||||
}
|
||||
#ifdef CONFIG_PPC64
|
||||
for (i = 0; i < vdso64_pages; i++) {
|
||||
struct page *pg = virt_to_page(vdso64_kbase + i*PAGE_SIZE);
|
||||
ClearPageReserved(pg);
|
||||
get_page(pg);
|
||||
}
|
||||
#endif /* CONFIG_PPC64 */
|
||||
|
||||
get_page(virt_to_page(vdso_data));
|
||||
}
|
||||
|
||||
int in_gate_area_no_task(unsigned long addr)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int in_gate_area(struct task_struct *task, unsigned long addr)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct vm_area_struct *get_gate_vma(struct task_struct *tsk)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
|
@ -5,6 +5,10 @@ obj-vdso32 = sigtramp.o gettimeofday.o datapage.o cacheflush.o note.o
|
|||
|
||||
# Build rules
|
||||
|
||||
ifeq ($(CONFIG_PPC32),y)
|
||||
CROSS32CC := $(CC)
|
||||
endif
|
||||
|
||||
targets := $(obj-vdso32) vdso32.so
|
||||
obj-vdso32 := $(addprefix $(obj)/, $(obj-vdso32))
|
||||
|
||||
|
@ -15,7 +19,7 @@ EXTRA_AFLAGS := -D__VDSO32__ -s
|
|||
|
||||
obj-y += vdso32_wrapper.o
|
||||
extra-y += vdso32.lds
|
||||
CPPFLAGS_vdso32.lds += -P -C -U$(ARCH)
|
||||
CPPFLAGS_vdso32.lds += -P -C -Upowerpc
|
||||
|
||||
# Force dependency (incbin is bad)
|
||||
$(obj)/vdso32_wrapper.o : $(obj)/vdso32.so
|
|
@ -66,3 +66,19 @@ V_FUNCTION_BEGIN(__kernel_get_syscall_map)
|
|||
blr
|
||||
.cfi_endproc
|
||||
V_FUNCTION_END(__kernel_get_syscall_map)
|
||||
|
||||
/*
|
||||
* void unsigned long long __kernel_get_tbfreq(void);
|
||||
*
|
||||
* returns the timebase frequency in HZ
|
||||
*/
|
||||
V_FUNCTION_BEGIN(__kernel_get_tbfreq)
|
||||
.cfi_startproc
|
||||
mflr r12
|
||||
.cfi_register lr,r12
|
||||
bl __get_datapage@local
|
||||
lwz r3,CFG_TB_TICKS_PER_SEC(r3)
|
||||
lwz r4,(CFG_TB_TICKS_PER_SEC + 4)(r3)
|
||||
mtlr r12
|
||||
.cfi_endproc
|
||||
V_FUNCTION_END(__kernel_get_tbfreq)
|
|
@ -0,0 +1,315 @@
|
|||
/*
|
||||
* Userland implementation of gettimeofday() for 32 bits processes in a
|
||||
* ppc64 kernel for use in the vDSO
|
||||
*
|
||||
* Copyright (C) 2004 Benjamin Herrenschmuidt (benh@kernel.crashing.org,
|
||||
* IBM Corp.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#include <linux/config.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/ppc_asm.h>
|
||||
#include <asm/vdso.h>
|
||||
#include <asm/asm-offsets.h>
|
||||
#include <asm/unistd.h>
|
||||
|
||||
.text
|
||||
/*
|
||||
* Exact prototype of gettimeofday
|
||||
*
|
||||
* int __kernel_gettimeofday(struct timeval *tv, struct timezone *tz);
|
||||
*
|
||||
*/
|
||||
V_FUNCTION_BEGIN(__kernel_gettimeofday)
|
||||
.cfi_startproc
|
||||
mflr r12
|
||||
.cfi_register lr,r12
|
||||
|
||||
mr r10,r3 /* r10 saves tv */
|
||||
mr r11,r4 /* r11 saves tz */
|
||||
bl __get_datapage@local /* get data page */
|
||||
mr r9, r3 /* datapage ptr in r9 */
|
||||
bl __do_get_xsec@local /* get xsec from tb & kernel */
|
||||
bne- 2f /* out of line -> do syscall */
|
||||
|
||||
/* seconds are xsec >> 20 */
|
||||
rlwinm r5,r4,12,20,31
|
||||
rlwimi r5,r3,12,0,19
|
||||
stw r5,TVAL32_TV_SEC(r10)
|
||||
|
||||
/* get remaining xsec and convert to usec. we scale
|
||||
* up remaining xsec by 12 bits and get the top 32 bits
|
||||
* of the multiplication
|
||||
*/
|
||||
rlwinm r5,r4,12,0,19
|
||||
lis r6,1000000@h
|
||||
ori r6,r6,1000000@l
|
||||
mulhwu r5,r5,r6
|
||||
stw r5,TVAL32_TV_USEC(r10)
|
||||
|
||||
cmpli cr0,r11,0 /* check if tz is NULL */
|
||||
beq 1f
|
||||
lwz r4,CFG_TZ_MINUTEWEST(r9)/* fill tz */
|
||||
lwz r5,CFG_TZ_DSTTIME(r9)
|
||||
stw r4,TZONE_TZ_MINWEST(r11)
|
||||
stw r5,TZONE_TZ_DSTTIME(r11)
|
||||
|
||||
1: mtlr r12
|
||||
li r3,0
|
||||
blr
|
||||
|
||||
2:
|
||||
mtlr r12
|
||||
mr r3,r10
|
||||
mr r4,r11
|
||||
li r0,__NR_gettimeofday
|
||||
sc
|
||||
blr
|
||||
.cfi_endproc
|
||||
V_FUNCTION_END(__kernel_gettimeofday)
|
||||
|
||||
/*
|
||||
* Exact prototype of clock_gettime()
|
||||
*
|
||||
* int __kernel_clock_gettime(clockid_t clock_id, struct timespec *tp);
|
||||
*
|
||||
*/
|
||||
V_FUNCTION_BEGIN(__kernel_clock_gettime)
|
||||
.cfi_startproc
|
||||
/* Check for supported clock IDs */
|
||||
cmpli cr0,r3,CLOCK_REALTIME
|
||||
cmpli cr1,r3,CLOCK_MONOTONIC
|
||||
cror cr0,cr0,cr1
|
||||
bne cr0,99f
|
||||
|
||||
mflr r12 /* r12 saves lr */
|
||||
.cfi_register lr,r12
|
||||
mr r10,r3 /* r10 saves id */
|
||||
mr r11,r4 /* r11 saves tp */
|
||||
bl __get_datapage@local /* get data page */
|
||||
mr r9, r3 /* datapage ptr in r9 */
|
||||
beq cr1,50f /* if monotonic -> jump there */
|
||||
|
||||
/*
|
||||
* CLOCK_REALTIME
|
||||
*/
|
||||
|
||||
bl __do_get_xsec@local /* get xsec from tb & kernel */
|
||||
bne- 98f /* out of line -> do syscall */
|
||||
|
||||
/* seconds are xsec >> 20 */
|
||||
rlwinm r5,r4,12,20,31
|
||||
rlwimi r5,r3,12,0,19
|
||||
stw r5,TSPC32_TV_SEC(r11)
|
||||
|
||||
/* get remaining xsec and convert to nsec. we scale
|
||||
* up remaining xsec by 12 bits and get the top 32 bits
|
||||
* of the multiplication, then we multiply by 1000
|
||||
*/
|
||||
rlwinm r5,r4,12,0,19
|
||||
lis r6,1000000@h
|
||||
ori r6,r6,1000000@l
|
||||
mulhwu r5,r5,r6
|
||||
mulli r5,r5,1000
|
||||
stw r5,TSPC32_TV_NSEC(r11)
|
||||
mtlr r12
|
||||
li r3,0
|
||||
blr
|
||||
|
||||
/*
|
||||
* CLOCK_MONOTONIC
|
||||
*/
|
||||
|
||||
50: bl __do_get_xsec@local /* get xsec from tb & kernel */
|
||||
bne- 98f /* out of line -> do syscall */
|
||||
|
||||
/* seconds are xsec >> 20 */
|
||||
rlwinm r6,r4,12,20,31
|
||||
rlwimi r6,r3,12,0,19
|
||||
|
||||
/* get remaining xsec and convert to nsec. we scale
|
||||
* up remaining xsec by 12 bits and get the top 32 bits
|
||||
* of the multiplication, then we multiply by 1000
|
||||
*/
|
||||
rlwinm r7,r4,12,0,19
|
||||
lis r5,1000000@h
|
||||
ori r5,r5,1000000@l
|
||||
mulhwu r7,r7,r5
|
||||
mulli r7,r7,1000
|
||||
|
||||
/* now we must fixup using wall to monotonic. We need to snapshot
|
||||
* that value and do the counter trick again. Fortunately, we still
|
||||
* have the counter value in r8 that was returned by __do_get_xsec.
|
||||
* At this point, r6,r7 contain our sec/nsec values, r3,r4 and r5
|
||||
* can be used
|
||||
*/
|
||||
|
||||
lwz r3,WTOM_CLOCK_SEC(r9)
|
||||
lwz r4,WTOM_CLOCK_NSEC(r9)
|
||||
|
||||
/* We now have our result in r3,r4. We create a fake dependency
|
||||
* on that result and re-check the counter
|
||||
*/
|
||||
or r5,r4,r3
|
||||
xor r0,r5,r5
|
||||
add r9,r9,r0
|
||||
#ifdef CONFIG_PPC64
|
||||
lwz r0,(CFG_TB_UPDATE_COUNT+4)(r9)
|
||||
#else
|
||||
lwz r0,(CFG_TB_UPDATE_COUNT)(r9)
|
||||
#endif
|
||||
cmpl cr0,r8,r0 /* check if updated */
|
||||
bne- 50b
|
||||
|
||||
/* Calculate and store result. Note that this mimmics the C code,
|
||||
* which may cause funny results if nsec goes negative... is that
|
||||
* possible at all ?
|
||||
*/
|
||||
add r3,r3,r6
|
||||
add r4,r4,r7
|
||||
lis r5,NSEC_PER_SEC@h
|
||||
ori r5,r5,NSEC_PER_SEC@l
|
||||
cmpli cr0,r4,r5
|
||||
blt 1f
|
||||
subf r4,r5,r4
|
||||
addi r3,r3,1
|
||||
1: stw r3,TSPC32_TV_SEC(r11)
|
||||
stw r4,TSPC32_TV_NSEC(r11)
|
||||
|
||||
mtlr r12
|
||||
li r3,0
|
||||
blr
|
||||
|
||||
/*
|
||||
* syscall fallback
|
||||
*/
|
||||
98:
|
||||
mtlr r12
|
||||
mr r3,r10
|
||||
mr r4,r11
|
||||
99:
|
||||
li r0,__NR_clock_gettime
|
||||
sc
|
||||
blr
|
||||
.cfi_endproc
|
||||
V_FUNCTION_END(__kernel_clock_gettime)
|
||||
|
||||
|
||||
/*
|
||||
* Exact prototype of clock_getres()
|
||||
*
|
||||
* int __kernel_clock_getres(clockid_t clock_id, struct timespec *res);
|
||||
*
|
||||
*/
|
||||
V_FUNCTION_BEGIN(__kernel_clock_getres)
|
||||
.cfi_startproc
|
||||
/* Check for supported clock IDs */
|
||||
cmpwi cr0,r3,CLOCK_REALTIME
|
||||
cmpwi cr1,r3,CLOCK_MONOTONIC
|
||||
cror cr0,cr0,cr1
|
||||
bne cr0,99f
|
||||
|
||||
li r3,0
|
||||
cmpli cr0,r4,0
|
||||
beqlr
|
||||
lis r5,CLOCK_REALTIME_RES@h
|
||||
ori r5,r5,CLOCK_REALTIME_RES@l
|
||||
stw r3,TSPC32_TV_SEC(r4)
|
||||
stw r5,TSPC32_TV_NSEC(r4)
|
||||
blr
|
||||
|
||||
/*
|
||||
* syscall fallback
|
||||
*/
|
||||
99:
|
||||
li r0,__NR_clock_getres
|
||||
sc
|
||||
blr
|
||||
.cfi_endproc
|
||||
V_FUNCTION_END(__kernel_clock_getres)
|
||||
|
||||
|
||||
/*
|
||||
* This is the core of gettimeofday() & friends, it returns the xsec
|
||||
* value in r3 & r4 and expects the datapage ptr (non clobbered)
|
||||
* in r9. clobbers r0,r4,r5,r6,r7,r8.
|
||||
* When returning, r8 contains the counter value that can be reused
|
||||
* by the monotonic clock implementation
|
||||
*/
|
||||
__do_get_xsec:
|
||||
.cfi_startproc
|
||||
/* Check for update count & load values. We use the low
|
||||
* order 32 bits of the update count
|
||||
*/
|
||||
#ifdef CONFIG_PPC64
|
||||
1: lwz r8,(CFG_TB_UPDATE_COUNT+4)(r9)
|
||||
#else
|
||||
1: lwz r8,(CFG_TB_UPDATE_COUNT)(r9)
|
||||
#endif
|
||||
andi. r0,r8,1 /* pending update ? loop */
|
||||
bne- 1b
|
||||
xor r0,r8,r8 /* create dependency */
|
||||
add r9,r9,r0
|
||||
|
||||
/* Load orig stamp (offset to TB) */
|
||||
lwz r5,CFG_TB_ORIG_STAMP(r9)
|
||||
lwz r6,(CFG_TB_ORIG_STAMP+4)(r9)
|
||||
|
||||
/* Get a stable TB value */
|
||||
2: mftbu r3
|
||||
mftbl r4
|
||||
mftbu r0
|
||||
cmpl cr0,r3,r0
|
||||
bne- 2b
|
||||
|
||||
/* Substract tb orig stamp. If the high part is non-zero, we jump to
|
||||
* the slow path which call the syscall.
|
||||
* If it's ok, then we have our 32 bits tb_ticks value in r7
|
||||
*/
|
||||
subfc r7,r6,r4
|
||||
subfe. r0,r5,r3
|
||||
bne- 3f
|
||||
|
||||
/* Load scale factor & do multiplication */
|
||||
lwz r5,CFG_TB_TO_XS(r9) /* load values */
|
||||
lwz r6,(CFG_TB_TO_XS+4)(r9)
|
||||
mulhwu r4,r7,r5
|
||||
mulhwu r6,r7,r6
|
||||
mullw r0,r7,r5
|
||||
addc r6,r6,r0
|
||||
|
||||
/* At this point, we have the scaled xsec value in r4 + XER:CA
|
||||
* we load & add the stamp since epoch
|
||||
*/
|
||||
lwz r5,CFG_STAMP_XSEC(r9)
|
||||
lwz r6,(CFG_STAMP_XSEC+4)(r9)
|
||||
adde r4,r4,r6
|
||||
addze r3,r5
|
||||
|
||||
/* We now have our result in r3,r4. We create a fake dependency
|
||||
* on that result and re-check the counter
|
||||
*/
|
||||
or r6,r4,r3
|
||||
xor r0,r6,r6
|
||||
add r9,r9,r0
|
||||
#ifdef CONFIG_PPC64
|
||||
lwz r0,(CFG_TB_UPDATE_COUNT+4)(r9)
|
||||
#else
|
||||
lwz r0,(CFG_TB_UPDATE_COUNT)(r9)
|
||||
#endif
|
||||
cmpl cr0,r8,r0 /* check if updated */
|
||||
bne- 1b
|
||||
|
||||
/* Warning ! The caller expects CR:EQ to be set to indicate a
|
||||
* successful calculation (so it won't fallback to the syscall
|
||||
* method). We have overriden that CR bit in the counter check,
|
||||
* but fortunately, the loop exit condition _is_ CR:EQ set, so
|
||||
* we can exit safely here. If you change this code, be careful
|
||||
* of that side effect.
|
||||
*/
|
||||
3: blr
|
||||
.cfi_endproc
|
|
@ -102,9 +102,12 @@ VERSION
|
|||
{
|
||||
VDSO_VERSION_STRING {
|
||||
global:
|
||||
__kernel_datapage_offset; /* Has to be there for the kernel to find it */
|
||||
__kernel_datapage_offset; /* Has to be there for the kernel to find */
|
||||
__kernel_get_syscall_map;
|
||||
__kernel_gettimeofday;
|
||||
__kernel_clock_gettime;
|
||||
__kernel_clock_getres;
|
||||
__kernel_get_tbfreq;
|
||||
__kernel_sync_dicache;
|
||||
__kernel_sync_dicache_p5;
|
||||
__kernel_sigtramp32;
|
|
@ -6,7 +6,7 @@
|
|||
.globl vdso32_start, vdso32_end
|
||||
.balign PAGE_SIZE
|
||||
vdso32_start:
|
||||
.incbin "arch/ppc64/kernel/vdso32/vdso32.so"
|
||||
.incbin "arch/powerpc/kernel/vdso32/vdso32.so"
|
||||
.balign PAGE_SIZE
|
||||
vdso32_end:
|
||||
|
|
@ -66,3 +66,19 @@ V_FUNCTION_BEGIN(__kernel_get_syscall_map)
|
|||
blr
|
||||
.cfi_endproc
|
||||
V_FUNCTION_END(__kernel_get_syscall_map)
|
||||
|
||||
|
||||
/*
|
||||
* void unsigned long __kernel_get_tbfreq(void);
|
||||
*
|
||||
* returns the timebase frequency in HZ
|
||||
*/
|
||||
V_FUNCTION_BEGIN(__kernel_get_tbfreq)
|
||||
.cfi_startproc
|
||||
mflr r12
|
||||
.cfi_register lr,r12
|
||||
bl V_LOCAL_FUNC(__get_datapage)
|
||||
ld r3,CFG_TB_TICKS_PER_SEC(r3)
|
||||
mtlr r12
|
||||
.cfi_endproc
|
||||
V_FUNCTION_END(__kernel_get_tbfreq)
|
|
@ -0,0 +1,242 @@
|
|||
/*
|
||||
* Userland implementation of gettimeofday() for 64 bits processes in a
|
||||
* ppc64 kernel for use in the vDSO
|
||||
*
|
||||
* Copyright (C) 2004 Benjamin Herrenschmuidt (benh@kernel.crashing.org),
|
||||
* IBM Corp.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#include <linux/config.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/ppc_asm.h>
|
||||
#include <asm/vdso.h>
|
||||
#include <asm/asm-offsets.h>
|
||||
#include <asm/unistd.h>
|
||||
|
||||
.text
|
||||
/*
|
||||
* Exact prototype of gettimeofday
|
||||
*
|
||||
* int __kernel_gettimeofday(struct timeval *tv, struct timezone *tz);
|
||||
*
|
||||
*/
|
||||
V_FUNCTION_BEGIN(__kernel_gettimeofday)
|
||||
.cfi_startproc
|
||||
mflr r12
|
||||
.cfi_register lr,r12
|
||||
|
||||
mr r11,r3 /* r11 holds tv */
|
||||
mr r10,r4 /* r10 holds tz */
|
||||
bl V_LOCAL_FUNC(__get_datapage) /* get data page */
|
||||
bl V_LOCAL_FUNC(__do_get_xsec) /* get xsec from tb & kernel */
|
||||
lis r7,15 /* r7 = 1000000 = USEC_PER_SEC */
|
||||
ori r7,r7,16960
|
||||
rldicl r5,r4,44,20 /* r5 = sec = xsec / XSEC_PER_SEC */
|
||||
rldicr r6,r5,20,43 /* r6 = sec * XSEC_PER_SEC */
|
||||
std r5,TVAL64_TV_SEC(r11) /* store sec in tv */
|
||||
subf r0,r6,r4 /* r0 = xsec = (xsec - r6) */
|
||||
mulld r0,r0,r7 /* usec = (xsec * USEC_PER_SEC) /
|
||||
* XSEC_PER_SEC
|
||||
*/
|
||||
rldicl r0,r0,44,20
|
||||
cmpldi cr0,r10,0 /* check if tz is NULL */
|
||||
std r0,TVAL64_TV_USEC(r11) /* store usec in tv */
|
||||
beq 1f
|
||||
lwz r4,CFG_TZ_MINUTEWEST(r3)/* fill tz */
|
||||
lwz r5,CFG_TZ_DSTTIME(r3)
|
||||
stw r4,TZONE_TZ_MINWEST(r10)
|
||||
stw r5,TZONE_TZ_DSTTIME(r10)
|
||||
1: mtlr r12
|
||||
li r3,0 /* always success */
|
||||
blr
|
||||
.cfi_endproc
|
||||
V_FUNCTION_END(__kernel_gettimeofday)
|
||||
|
||||
|
||||
/*
|
||||
* Exact prototype of clock_gettime()
|
||||
*
|
||||
* int __kernel_clock_gettime(clockid_t clock_id, struct timespec *tp);
|
||||
*
|
||||
*/
|
||||
V_FUNCTION_BEGIN(__kernel_clock_gettime)
|
||||
.cfi_startproc
|
||||
/* Check for supported clock IDs */
|
||||
cmpwi cr0,r3,CLOCK_REALTIME
|
||||
cmpwi cr1,r3,CLOCK_MONOTONIC
|
||||
cror cr0,cr0,cr1
|
||||
bne cr0,99f
|
||||
|
||||
mflr r12 /* r12 saves lr */
|
||||
.cfi_register lr,r12
|
||||
mr r10,r3 /* r10 saves id */
|
||||
mr r11,r4 /* r11 saves tp */
|
||||
bl V_LOCAL_FUNC(__get_datapage) /* get data page */
|
||||
beq cr1,50f /* if monotonic -> jump there */
|
||||
|
||||
/*
|
||||
* CLOCK_REALTIME
|
||||
*/
|
||||
|
||||
bl V_LOCAL_FUNC(__do_get_xsec) /* get xsec from tb & kernel */
|
||||
|
||||
lis r7,0x3b9a /* r7 = 1000000000 = NSEC_PER_SEC */
|
||||
ori r7,r7,0xca00
|
||||
rldicl r5,r4,44,20 /* r5 = sec = xsec / XSEC_PER_SEC */
|
||||
rldicr r6,r5,20,43 /* r6 = sec * XSEC_PER_SEC */
|
||||
std r5,TSPC64_TV_SEC(r11) /* store sec in tv */
|
||||
subf r0,r6,r4 /* r0 = xsec = (xsec - r6) */
|
||||
mulld r0,r0,r7 /* nsec = (xsec * NSEC_PER_SEC) /
|
||||
* XSEC_PER_SEC
|
||||
*/
|
||||
rldicl r0,r0,44,20
|
||||
std r0,TSPC64_TV_NSEC(r11) /* store nsec in tp */
|
||||
|
||||
mtlr r12
|
||||
li r3,0
|
||||
blr
|
||||
|
||||
/*
|
||||
* CLOCK_MONOTONIC
|
||||
*/
|
||||
|
||||
50: bl V_LOCAL_FUNC(__do_get_xsec) /* get xsec from tb & kernel */
|
||||
|
||||
lis r7,0x3b9a /* r7 = 1000000000 = NSEC_PER_SEC */
|
||||
ori r7,r7,0xca00
|
||||
rldicl r5,r4,44,20 /* r5 = sec = xsec / XSEC_PER_SEC */
|
||||
rldicr r6,r5,20,43 /* r6 = sec * XSEC_PER_SEC */
|
||||
subf r0,r6,r4 /* r0 = xsec = (xsec - r6) */
|
||||
mulld r0,r0,r7 /* nsec = (xsec * NSEC_PER_SEC) /
|
||||
* XSEC_PER_SEC
|
||||
*/
|
||||
rldicl r6,r0,44,20
|
||||
|
||||
/* now we must fixup using wall to monotonic. We need to snapshot
|
||||
* that value and do the counter trick again. Fortunately, we still
|
||||
* have the counter value in r8 that was returned by __do_get_xsec.
|
||||
* At this point, r5,r6 contain our sec/nsec values.
|
||||
* can be used
|
||||
*/
|
||||
|
||||
lwz r4,WTOM_CLOCK_SEC(r9)
|
||||
lwz r7,WTOM_CLOCK_NSEC(r9)
|
||||
|
||||
/* We now have our result in r4,r7. We create a fake dependency
|
||||
* on that result and re-check the counter
|
||||
*/
|
||||
or r9,r4,r7
|
||||
xor r0,r9,r9
|
||||
add r3,r3,r0
|
||||
ld r0,CFG_TB_UPDATE_COUNT(r3)
|
||||
cmpld cr0,r0,r8 /* check if updated */
|
||||
bne- 50b
|
||||
|
||||
/* Calculate and store result. Note that this mimmics the C code,
|
||||
* which may cause funny results if nsec goes negative... is that
|
||||
* possible at all ?
|
||||
*/
|
||||
add r4,r4,r5
|
||||
add r7,r7,r6
|
||||
lis r9,NSEC_PER_SEC@h
|
||||
ori r9,r9,NSEC_PER_SEC@l
|
||||
cmpli cr0,r7,r9
|
||||
blt 1f
|
||||
subf r7,r9,r7
|
||||
addi r4,r4,1
|
||||
1: std r4,TSPC64_TV_SEC(r11)
|
||||
std r7,TSPC64_TV_NSEC(r11)
|
||||
|
||||
mtlr r12
|
||||
li r3,0
|
||||
blr
|
||||
|
||||
/*
|
||||
* syscall fallback
|
||||
*/
|
||||
98:
|
||||
mtlr r12
|
||||
mr r3,r10
|
||||
mr r4,r11
|
||||
99:
|
||||
li r0,__NR_clock_gettime
|
||||
sc
|
||||
blr
|
||||
.cfi_endproc
|
||||
V_FUNCTION_END(__kernel_clock_gettime)
|
||||
|
||||
|
||||
/*
|
||||
* Exact prototype of clock_getres()
|
||||
*
|
||||
* int __kernel_clock_getres(clockid_t clock_id, struct timespec *res);
|
||||
*
|
||||
*/
|
||||
V_FUNCTION_BEGIN(__kernel_clock_getres)
|
||||
.cfi_startproc
|
||||
/* Check for supported clock IDs */
|
||||
cmpwi cr0,r3,CLOCK_REALTIME
|
||||
cmpwi cr1,r3,CLOCK_MONOTONIC
|
||||
cror cr0,cr0,cr1
|
||||
bne cr0,99f
|
||||
|
||||
li r3,0
|
||||
cmpli cr0,r4,0
|
||||
beqlr
|
||||
lis r5,CLOCK_REALTIME_RES@h
|
||||
ori r5,r5,CLOCK_REALTIME_RES@l
|
||||
std r3,TSPC64_TV_SEC(r4)
|
||||
std r5,TSPC64_TV_NSEC(r4)
|
||||
blr
|
||||
|
||||
/*
|
||||
* syscall fallback
|
||||
*/
|
||||
99:
|
||||
li r0,__NR_clock_getres
|
||||
sc
|
||||
blr
|
||||
.cfi_endproc
|
||||
V_FUNCTION_END(__kernel_clock_getres)
|
||||
|
||||
|
||||
/*
|
||||
* This is the core of gettimeofday(), it returns the xsec
|
||||
* value in r4 and expects the datapage ptr (non clobbered)
|
||||
* in r3. clobbers r0,r4,r5,r6,r7,r8
|
||||
* When returning, r8 contains the counter value that can be reused
|
||||
*/
|
||||
V_FUNCTION_BEGIN(__do_get_xsec)
|
||||
.cfi_startproc
|
||||
/* check for update count & load values */
|
||||
1: ld r8,CFG_TB_UPDATE_COUNT(r3)
|
||||
andi. r0,r4,1 /* pending update ? loop */
|
||||
bne- 1b
|
||||
xor r0,r4,r4 /* create dependency */
|
||||
add r3,r3,r0
|
||||
|
||||
/* Get TB & offset it */
|
||||
mftb r7
|
||||
ld r9,CFG_TB_ORIG_STAMP(r3)
|
||||
subf r7,r9,r7
|
||||
|
||||
/* Scale result */
|
||||
ld r5,CFG_TB_TO_XS(r3)
|
||||
mulhdu r7,r7,r5
|
||||
|
||||
/* Add stamp since epoch */
|
||||
ld r6,CFG_STAMP_XSEC(r3)
|
||||
add r4,r6,r7
|
||||
|
||||
xor r0,r4,r4
|
||||
add r3,r3,r0
|
||||
ld r0,CFG_TB_UPDATE_COUNT(r3)
|
||||
cmpld cr0,r0,r8 /* check if updated */
|
||||
bne- 1b
|
||||
blr
|
||||
.cfi_endproc
|
||||
V_FUNCTION_END(__do_get_xsec)
|
|
@ -102,9 +102,12 @@ VERSION
|
|||
{
|
||||
VDSO_VERSION_STRING {
|
||||
global:
|
||||
__kernel_datapage_offset; /* Has to be there for the kernel to find it */
|
||||
__kernel_datapage_offset; /* Has to be there for the kernel to find */
|
||||
__kernel_get_syscall_map;
|
||||
__kernel_gettimeofday;
|
||||
__kernel_clock_gettime;
|
||||
__kernel_clock_getres;
|
||||
__kernel_get_tbfreq;
|
||||
__kernel_sync_dicache;
|
||||
__kernel_sync_dicache_p5;
|
||||
__kernel_sigtramp_rt64;
|
|
@ -6,7 +6,7 @@
|
|||
.globl vdso64_start, vdso64_end
|
||||
.balign PAGE_SIZE
|
||||
vdso64_start:
|
||||
.incbin "arch/ppc64/kernel/vdso64/vdso64.so"
|
||||
.incbin "arch/powerpc/kernel/vdso64/vdso64.so"
|
||||
.balign PAGE_SIZE
|
||||
vdso64_end:
|
||||
|
|
@ -46,9 +46,7 @@
|
|||
#include <asm/prom.h>
|
||||
#include <asm/lmb.h>
|
||||
#include <asm/sections.h>
|
||||
#ifdef CONFIG_PPC64
|
||||
#include <asm/vdso.h>
|
||||
#endif
|
||||
|
||||
#include "mmu_decl.h"
|
||||
|
||||
|
@ -397,10 +395,8 @@ void __init mem_init(void)
|
|||
|
||||
mem_init_done = 1;
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
/* Initialize the vDSO */
|
||||
vdso_init();
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -17,9 +17,8 @@
|
|||
#include <linux/nodemask.h>
|
||||
#include <linux/cpu.h>
|
||||
#include <linux/notifier.h>
|
||||
#include <asm/sparsemem.h>
|
||||
#include <asm/lmb.h>
|
||||
#include <asm/machdep.h>
|
||||
#include <asm/abs_addr.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/smp.h>
|
||||
|
||||
|
@ -28,45 +27,113 @@ static int numa_enabled = 1;
|
|||
static int numa_debug;
|
||||
#define dbg(args...) if (numa_debug) { printk(KERN_INFO args); }
|
||||
|
||||
#ifdef DEBUG_NUMA
|
||||
#define ARRAY_INITIALISER -1
|
||||
#else
|
||||
#define ARRAY_INITIALISER 0
|
||||
#endif
|
||||
|
||||
int numa_cpu_lookup_table[NR_CPUS] = { [ 0 ... (NR_CPUS - 1)] =
|
||||
ARRAY_INITIALISER};
|
||||
char *numa_memory_lookup_table;
|
||||
int numa_cpu_lookup_table[NR_CPUS];
|
||||
cpumask_t numa_cpumask_lookup_table[MAX_NUMNODES];
|
||||
int nr_cpus_in_node[MAX_NUMNODES] = { [0 ... (MAX_NUMNODES -1)] = 0};
|
||||
|
||||
struct pglist_data *node_data[MAX_NUMNODES];
|
||||
bootmem_data_t __initdata plat_node_bdata[MAX_NUMNODES];
|
||||
|
||||
EXPORT_SYMBOL(numa_cpu_lookup_table);
|
||||
EXPORT_SYMBOL(numa_cpumask_lookup_table);
|
||||
EXPORT_SYMBOL(node_data);
|
||||
|
||||
static bootmem_data_t __initdata plat_node_bdata[MAX_NUMNODES];
|
||||
static int min_common_depth;
|
||||
|
||||
/*
|
||||
* We need somewhere to store start/span for each node until we have
|
||||
* We need somewhere to store start/end/node for each region until we have
|
||||
* allocated the real node_data structures.
|
||||
*/
|
||||
#define MAX_REGIONS (MAX_LMB_REGIONS*2)
|
||||
static struct {
|
||||
unsigned long node_start_pfn;
|
||||
unsigned long node_end_pfn;
|
||||
unsigned long node_present_pages;
|
||||
} init_node_data[MAX_NUMNODES] __initdata;
|
||||
unsigned long start_pfn;
|
||||
unsigned long end_pfn;
|
||||
int nid;
|
||||
} init_node_data[MAX_REGIONS] __initdata;
|
||||
|
||||
EXPORT_SYMBOL(node_data);
|
||||
EXPORT_SYMBOL(numa_cpu_lookup_table);
|
||||
EXPORT_SYMBOL(numa_memory_lookup_table);
|
||||
EXPORT_SYMBOL(numa_cpumask_lookup_table);
|
||||
EXPORT_SYMBOL(nr_cpus_in_node);
|
||||
int __init early_pfn_to_nid(unsigned long pfn)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; init_node_data[i].end_pfn; i++) {
|
||||
unsigned long start_pfn = init_node_data[i].start_pfn;
|
||||
unsigned long end_pfn = init_node_data[i].end_pfn;
|
||||
|
||||
if ((start_pfn <= pfn) && (pfn < end_pfn))
|
||||
return init_node_data[i].nid;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
void __init add_region(unsigned int nid, unsigned long start_pfn,
|
||||
unsigned long pages)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
dbg("add_region nid %d start_pfn 0x%lx pages 0x%lx\n",
|
||||
nid, start_pfn, pages);
|
||||
|
||||
for (i = 0; init_node_data[i].end_pfn; i++) {
|
||||
if (init_node_data[i].nid != nid)
|
||||
continue;
|
||||
if (init_node_data[i].end_pfn == start_pfn) {
|
||||
init_node_data[i].end_pfn += pages;
|
||||
return;
|
||||
}
|
||||
if (init_node_data[i].start_pfn == (start_pfn + pages)) {
|
||||
init_node_data[i].start_pfn -= pages;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Leave last entry NULL so we dont iterate off the end (we use
|
||||
* entry.end_pfn to terminate the walk).
|
||||
*/
|
||||
if (i >= (MAX_REGIONS - 1)) {
|
||||
printk(KERN_ERR "WARNING: too many memory regions in "
|
||||
"numa code, truncating\n");
|
||||
return;
|
||||
}
|
||||
|
||||
init_node_data[i].start_pfn = start_pfn;
|
||||
init_node_data[i].end_pfn = start_pfn + pages;
|
||||
init_node_data[i].nid = nid;
|
||||
}
|
||||
|
||||
/* We assume init_node_data has no overlapping regions */
|
||||
void __init get_region(unsigned int nid, unsigned long *start_pfn,
|
||||
unsigned long *end_pfn, unsigned long *pages_present)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
*start_pfn = -1UL;
|
||||
*end_pfn = *pages_present = 0;
|
||||
|
||||
for (i = 0; init_node_data[i].end_pfn; i++) {
|
||||
if (init_node_data[i].nid != nid)
|
||||
continue;
|
||||
|
||||
*pages_present += init_node_data[i].end_pfn -
|
||||
init_node_data[i].start_pfn;
|
||||
|
||||
if (init_node_data[i].start_pfn < *start_pfn)
|
||||
*start_pfn = init_node_data[i].start_pfn;
|
||||
|
||||
if (init_node_data[i].end_pfn > *end_pfn)
|
||||
*end_pfn = init_node_data[i].end_pfn;
|
||||
}
|
||||
|
||||
/* We didnt find a matching region, return start/end as 0 */
|
||||
if (*start_pfn == -1UL)
|
||||
start_pfn = 0;
|
||||
}
|
||||
|
||||
static inline void map_cpu_to_node(int cpu, int node)
|
||||
{
|
||||
numa_cpu_lookup_table[cpu] = node;
|
||||
if (!(cpu_isset(cpu, numa_cpumask_lookup_table[node]))) {
|
||||
|
||||
if (!(cpu_isset(cpu, numa_cpumask_lookup_table[node])))
|
||||
cpu_set(cpu, numa_cpumask_lookup_table[node]);
|
||||
nr_cpus_in_node[node]++;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
|
@ -78,7 +145,6 @@ static void unmap_cpu_from_node(unsigned long cpu)
|
|||
|
||||
if (cpu_isset(cpu, numa_cpumask_lookup_table[node])) {
|
||||
cpu_clear(cpu, numa_cpumask_lookup_table[node]);
|
||||
nr_cpus_in_node[node]--;
|
||||
} else {
|
||||
printk(KERN_ERR "WARNING: cpu %lu not found in node %d\n",
|
||||
cpu, node);
|
||||
|
@ -86,7 +152,7 @@ static void unmap_cpu_from_node(unsigned long cpu)
|
|||
}
|
||||
#endif /* CONFIG_HOTPLUG_CPU */
|
||||
|
||||
static struct device_node * __devinit find_cpu_node(unsigned int cpu)
|
||||
static struct device_node *find_cpu_node(unsigned int cpu)
|
||||
{
|
||||
unsigned int hw_cpuid = get_hard_smp_processor_id(cpu);
|
||||
struct device_node *cpu_node = NULL;
|
||||
|
@ -213,7 +279,7 @@ static int __init get_mem_size_cells(void)
|
|||
return rc;
|
||||
}
|
||||
|
||||
static unsigned long read_n_cells(int n, unsigned int **buf)
|
||||
static unsigned long __init read_n_cells(int n, unsigned int **buf)
|
||||
{
|
||||
unsigned long result = 0;
|
||||
|
||||
|
@ -295,7 +361,8 @@ static int cpu_numa_callback(struct notifier_block *nfb,
|
|||
* or zero. If the returned value of size is 0 the region should be
|
||||
* discarded as it lies wholy above the memory limit.
|
||||
*/
|
||||
static unsigned long __init numa_enforce_memory_limit(unsigned long start, unsigned long size)
|
||||
static unsigned long __init numa_enforce_memory_limit(unsigned long start,
|
||||
unsigned long size)
|
||||
{
|
||||
/*
|
||||
* We use lmb_end_of_DRAM() in here instead of memory_limit because
|
||||
|
@ -320,8 +387,7 @@ static int __init parse_numa_properties(void)
|
|||
struct device_node *cpu = NULL;
|
||||
struct device_node *memory = NULL;
|
||||
int addr_cells, size_cells;
|
||||
int max_domain = 0;
|
||||
long entries = lmb_end_of_DRAM() >> MEMORY_INCREMENT_SHIFT;
|
||||
int max_domain;
|
||||
unsigned long i;
|
||||
|
||||
if (numa_enabled == 0) {
|
||||
|
@ -329,13 +395,6 @@ static int __init parse_numa_properties(void)
|
|||
return -1;
|
||||
}
|
||||
|
||||
numa_memory_lookup_table =
|
||||
(char *)abs_to_virt(lmb_alloc(entries * sizeof(char), 1));
|
||||
memset(numa_memory_lookup_table, 0, entries * sizeof(char));
|
||||
|
||||
for (i = 0; i < entries ; i++)
|
||||
numa_memory_lookup_table[i] = ARRAY_INITIALISER;
|
||||
|
||||
min_common_depth = find_min_common_depth();
|
||||
|
||||
dbg("NUMA associativity depth for CPU/Memory: %d\n", min_common_depth);
|
||||
|
@ -387,9 +446,6 @@ new_range:
|
|||
start = read_n_cells(addr_cells, &memcell_buf);
|
||||
size = read_n_cells(size_cells, &memcell_buf);
|
||||
|
||||
start = _ALIGN_DOWN(start, MEMORY_INCREMENT);
|
||||
size = _ALIGN_UP(size, MEMORY_INCREMENT);
|
||||
|
||||
numa_domain = of_node_numa_domain(memory);
|
||||
|
||||
if (numa_domain >= MAX_NUMNODES) {
|
||||
|
@ -403,44 +459,15 @@ new_range:
|
|||
if (max_domain < numa_domain)
|
||||
max_domain = numa_domain;
|
||||
|
||||
if (! (size = numa_enforce_memory_limit(start, size))) {
|
||||
if (!(size = numa_enforce_memory_limit(start, size))) {
|
||||
if (--ranges)
|
||||
goto new_range;
|
||||
else
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize new node struct, or add to an existing one.
|
||||
*/
|
||||
if (init_node_data[numa_domain].node_end_pfn) {
|
||||
if ((start / PAGE_SIZE) <
|
||||
init_node_data[numa_domain].node_start_pfn)
|
||||
init_node_data[numa_domain].node_start_pfn =
|
||||
start / PAGE_SIZE;
|
||||
if (((start / PAGE_SIZE) + (size / PAGE_SIZE)) >
|
||||
init_node_data[numa_domain].node_end_pfn)
|
||||
init_node_data[numa_domain].node_end_pfn =
|
||||
(start / PAGE_SIZE) +
|
||||
(size / PAGE_SIZE);
|
||||
|
||||
init_node_data[numa_domain].node_present_pages +=
|
||||
size / PAGE_SIZE;
|
||||
} else {
|
||||
node_set_online(numa_domain);
|
||||
|
||||
init_node_data[numa_domain].node_start_pfn =
|
||||
start / PAGE_SIZE;
|
||||
init_node_data[numa_domain].node_end_pfn =
|
||||
init_node_data[numa_domain].node_start_pfn +
|
||||
size / PAGE_SIZE;
|
||||
init_node_data[numa_domain].node_present_pages =
|
||||
size / PAGE_SIZE;
|
||||
}
|
||||
|
||||
for (i = start ; i < (start+size); i += MEMORY_INCREMENT)
|
||||
numa_memory_lookup_table[i >> MEMORY_INCREMENT_SHIFT] =
|
||||
numa_domain;
|
||||
add_region(numa_domain, start >> PAGE_SHIFT,
|
||||
size >> PAGE_SHIFT);
|
||||
|
||||
if (--ranges)
|
||||
goto new_range;
|
||||
|
@ -456,32 +483,15 @@ static void __init setup_nonnuma(void)
|
|||
{
|
||||
unsigned long top_of_ram = lmb_end_of_DRAM();
|
||||
unsigned long total_ram = lmb_phys_mem_size();
|
||||
unsigned long i;
|
||||
|
||||
printk(KERN_INFO "Top of RAM: 0x%lx, Total RAM: 0x%lx\n",
|
||||
top_of_ram, total_ram);
|
||||
printk(KERN_INFO "Memory hole size: %ldMB\n",
|
||||
(top_of_ram - total_ram) >> 20);
|
||||
|
||||
if (!numa_memory_lookup_table) {
|
||||
long entries = top_of_ram >> MEMORY_INCREMENT_SHIFT;
|
||||
numa_memory_lookup_table =
|
||||
(char *)abs_to_virt(lmb_alloc(entries * sizeof(char), 1));
|
||||
memset(numa_memory_lookup_table, 0, entries * sizeof(char));
|
||||
for (i = 0; i < entries ; i++)
|
||||
numa_memory_lookup_table[i] = ARRAY_INITIALISER;
|
||||
}
|
||||
|
||||
map_cpu_to_node(boot_cpuid, 0);
|
||||
|
||||
add_region(0, 0, lmb_end_of_DRAM() >> PAGE_SHIFT);
|
||||
node_set_online(0);
|
||||
|
||||
init_node_data[0].node_start_pfn = 0;
|
||||
init_node_data[0].node_end_pfn = lmb_end_of_DRAM() / PAGE_SIZE;
|
||||
init_node_data[0].node_present_pages = total_ram / PAGE_SIZE;
|
||||
|
||||
for (i = 0 ; i < top_of_ram; i += MEMORY_INCREMENT)
|
||||
numa_memory_lookup_table[i >> MEMORY_INCREMENT_SHIFT] = 0;
|
||||
}
|
||||
|
||||
static void __init dump_numa_topology(void)
|
||||
|
@ -499,8 +509,9 @@ static void __init dump_numa_topology(void)
|
|||
|
||||
count = 0;
|
||||
|
||||
for (i = 0; i < lmb_end_of_DRAM(); i += MEMORY_INCREMENT) {
|
||||
if (numa_memory_lookup_table[i >> MEMORY_INCREMENT_SHIFT] == node) {
|
||||
for (i = 0; i < lmb_end_of_DRAM();
|
||||
i += (1 << SECTION_SIZE_BITS)) {
|
||||
if (early_pfn_to_nid(i >> PAGE_SHIFT) == node) {
|
||||
if (count == 0)
|
||||
printk(" 0x%lx", i);
|
||||
++count;
|
||||
|
@ -525,10 +536,12 @@ static void __init dump_numa_topology(void)
|
|||
*
|
||||
* Returns the physical address of the memory.
|
||||
*/
|
||||
static unsigned long careful_allocation(int nid, unsigned long size,
|
||||
unsigned long align, unsigned long end)
|
||||
static void __init *careful_allocation(int nid, unsigned long size,
|
||||
unsigned long align,
|
||||
unsigned long end_pfn)
|
||||
{
|
||||
unsigned long ret = lmb_alloc_base(size, align, end);
|
||||
int new_nid;
|
||||
unsigned long ret = lmb_alloc_base(size, align, end_pfn << PAGE_SHIFT);
|
||||
|
||||
/* retry over all memory */
|
||||
if (!ret)
|
||||
|
@ -542,28 +555,27 @@ static unsigned long careful_allocation(int nid, unsigned long size,
|
|||
* If the memory came from a previously allocated node, we must
|
||||
* retry with the bootmem allocator.
|
||||
*/
|
||||
if (pa_to_nid(ret) < nid) {
|
||||
nid = pa_to_nid(ret);
|
||||
ret = (unsigned long)__alloc_bootmem_node(NODE_DATA(nid),
|
||||
new_nid = early_pfn_to_nid(ret >> PAGE_SHIFT);
|
||||
if (new_nid < nid) {
|
||||
ret = (unsigned long)__alloc_bootmem_node(NODE_DATA(new_nid),
|
||||
size, align, 0);
|
||||
|
||||
if (!ret)
|
||||
panic("numa.c: cannot allocate %lu bytes on node %d",
|
||||
size, nid);
|
||||
size, new_nid);
|
||||
|
||||
ret = virt_to_abs(ret);
|
||||
ret = __pa(ret);
|
||||
|
||||
dbg("alloc_bootmem %lx %lx\n", ret, size);
|
||||
}
|
||||
|
||||
return ret;
|
||||
return (void *)ret;
|
||||
}
|
||||
|
||||
void __init do_init_bootmem(void)
|
||||
{
|
||||
int nid;
|
||||
int addr_cells, size_cells;
|
||||
struct device_node *memory = NULL;
|
||||
unsigned int i;
|
||||
static struct notifier_block ppc64_numa_nb = {
|
||||
.notifier_call = cpu_numa_callback,
|
||||
.priority = 1 /* Must run before sched domains notifier. */
|
||||
|
@ -581,99 +593,66 @@ void __init do_init_bootmem(void)
|
|||
register_cpu_notifier(&ppc64_numa_nb);
|
||||
|
||||
for_each_online_node(nid) {
|
||||
unsigned long start_paddr, end_paddr;
|
||||
int i;
|
||||
unsigned long start_pfn, end_pfn, pages_present;
|
||||
unsigned long bootmem_paddr;
|
||||
unsigned long bootmap_pages;
|
||||
|
||||
start_paddr = init_node_data[nid].node_start_pfn * PAGE_SIZE;
|
||||
end_paddr = init_node_data[nid].node_end_pfn * PAGE_SIZE;
|
||||
get_region(nid, &start_pfn, &end_pfn, &pages_present);
|
||||
|
||||
/* Allocate the node structure node local if possible */
|
||||
NODE_DATA(nid) = (struct pglist_data *)careful_allocation(nid,
|
||||
NODE_DATA(nid) = careful_allocation(nid,
|
||||
sizeof(struct pglist_data),
|
||||
SMP_CACHE_BYTES, end_paddr);
|
||||
NODE_DATA(nid) = abs_to_virt(NODE_DATA(nid));
|
||||
SMP_CACHE_BYTES, end_pfn);
|
||||
NODE_DATA(nid) = __va(NODE_DATA(nid));
|
||||
memset(NODE_DATA(nid), 0, sizeof(struct pglist_data));
|
||||
|
||||
dbg("node %d\n", nid);
|
||||
dbg("NODE_DATA() = %p\n", NODE_DATA(nid));
|
||||
|
||||
NODE_DATA(nid)->bdata = &plat_node_bdata[nid];
|
||||
NODE_DATA(nid)->node_start_pfn =
|
||||
init_node_data[nid].node_start_pfn;
|
||||
NODE_DATA(nid)->node_spanned_pages =
|
||||
end_paddr - start_paddr;
|
||||
NODE_DATA(nid)->node_start_pfn = start_pfn;
|
||||
NODE_DATA(nid)->node_spanned_pages = end_pfn - start_pfn;
|
||||
|
||||
if (NODE_DATA(nid)->node_spanned_pages == 0)
|
||||
continue;
|
||||
|
||||
dbg("start_paddr = %lx\n", start_paddr);
|
||||
dbg("end_paddr = %lx\n", end_paddr);
|
||||
dbg("start_paddr = %lx\n", start_pfn << PAGE_SHIFT);
|
||||
dbg("end_paddr = %lx\n", end_pfn << PAGE_SHIFT);
|
||||
|
||||
bootmap_pages = bootmem_bootmap_pages((end_paddr - start_paddr) >> PAGE_SHIFT);
|
||||
bootmap_pages = bootmem_bootmap_pages(end_pfn - start_pfn);
|
||||
bootmem_paddr = (unsigned long)careful_allocation(nid,
|
||||
bootmap_pages << PAGE_SHIFT,
|
||||
PAGE_SIZE, end_pfn);
|
||||
memset(__va(bootmem_paddr), 0, bootmap_pages << PAGE_SHIFT);
|
||||
|
||||
bootmem_paddr = careful_allocation(nid,
|
||||
bootmap_pages << PAGE_SHIFT,
|
||||
PAGE_SIZE, end_paddr);
|
||||
memset(abs_to_virt(bootmem_paddr), 0,
|
||||
bootmap_pages << PAGE_SHIFT);
|
||||
dbg("bootmap_paddr = %lx\n", bootmem_paddr);
|
||||
|
||||
init_bootmem_node(NODE_DATA(nid), bootmem_paddr >> PAGE_SHIFT,
|
||||
start_paddr >> PAGE_SHIFT,
|
||||
end_paddr >> PAGE_SHIFT);
|
||||
start_pfn, end_pfn);
|
||||
|
||||
/*
|
||||
* We need to do another scan of all memory sections to
|
||||
* associate memory with the correct node.
|
||||
*/
|
||||
addr_cells = get_mem_addr_cells();
|
||||
size_cells = get_mem_size_cells();
|
||||
memory = NULL;
|
||||
while ((memory = of_find_node_by_type(memory, "memory")) != NULL) {
|
||||
unsigned long mem_start, mem_size;
|
||||
int numa_domain, ranges;
|
||||
unsigned int *memcell_buf;
|
||||
unsigned int len;
|
||||
/* Add free regions on this node */
|
||||
for (i = 0; init_node_data[i].end_pfn; i++) {
|
||||
unsigned long start, end;
|
||||
|
||||
memcell_buf = (unsigned int *)get_property(memory, "reg", &len);
|
||||
if (!memcell_buf || len <= 0)
|
||||
if (init_node_data[i].nid != nid)
|
||||
continue;
|
||||
|
||||
ranges = memory->n_addrs; /* ranges in cell */
|
||||
new_range:
|
||||
mem_start = read_n_cells(addr_cells, &memcell_buf);
|
||||
mem_size = read_n_cells(size_cells, &memcell_buf);
|
||||
if (numa_enabled) {
|
||||
numa_domain = of_node_numa_domain(memory);
|
||||
if (numa_domain >= MAX_NUMNODES)
|
||||
numa_domain = 0;
|
||||
} else
|
||||
numa_domain = 0;
|
||||
start = init_node_data[i].start_pfn << PAGE_SHIFT;
|
||||
end = init_node_data[i].end_pfn << PAGE_SHIFT;
|
||||
|
||||
if (numa_domain != nid)
|
||||
continue;
|
||||
|
||||
mem_size = numa_enforce_memory_limit(mem_start, mem_size);
|
||||
if (mem_size) {
|
||||
dbg("free_bootmem %lx %lx\n", mem_start, mem_size);
|
||||
free_bootmem_node(NODE_DATA(nid), mem_start, mem_size);
|
||||
}
|
||||
|
||||
if (--ranges) /* process all ranges in cell */
|
||||
goto new_range;
|
||||
dbg("free_bootmem %lx %lx\n", start, end - start);
|
||||
free_bootmem_node(NODE_DATA(nid), start, end - start);
|
||||
}
|
||||
|
||||
/*
|
||||
* Mark reserved regions on this node
|
||||
*/
|
||||
/* Mark reserved regions on this node */
|
||||
for (i = 0; i < lmb.reserved.cnt; i++) {
|
||||
unsigned long physbase = lmb.reserved.region[i].base;
|
||||
unsigned long size = lmb.reserved.region[i].size;
|
||||
unsigned long start_paddr = start_pfn << PAGE_SHIFT;
|
||||
unsigned long end_paddr = end_pfn << PAGE_SHIFT;
|
||||
|
||||
if (pa_to_nid(physbase) != nid &&
|
||||
pa_to_nid(physbase+size-1) != nid)
|
||||
if (early_pfn_to_nid(physbase >> PAGE_SHIFT) != nid &&
|
||||
early_pfn_to_nid((physbase+size-1) >> PAGE_SHIFT) != nid)
|
||||
continue;
|
||||
|
||||
if (physbase < end_paddr &&
|
||||
|
@ -693,46 +672,19 @@ new_range:
|
|||
size);
|
||||
}
|
||||
}
|
||||
/*
|
||||
* This loop may look famaliar, but we have to do it again
|
||||
* after marking our reserved memory to mark memory present
|
||||
* for sparsemem.
|
||||
*/
|
||||
addr_cells = get_mem_addr_cells();
|
||||
size_cells = get_mem_size_cells();
|
||||
memory = NULL;
|
||||
while ((memory = of_find_node_by_type(memory, "memory")) != NULL) {
|
||||
unsigned long mem_start, mem_size;
|
||||
int numa_domain, ranges;
|
||||
unsigned int *memcell_buf;
|
||||
unsigned int len;
|
||||
|
||||
memcell_buf = (unsigned int *)get_property(memory, "reg", &len);
|
||||
if (!memcell_buf || len <= 0)
|
||||
/* Add regions into sparsemem */
|
||||
for (i = 0; init_node_data[i].end_pfn; i++) {
|
||||
unsigned long start, end;
|
||||
|
||||
if (init_node_data[i].nid != nid)
|
||||
continue;
|
||||
|
||||
ranges = memory->n_addrs; /* ranges in cell */
|
||||
new_range2:
|
||||
mem_start = read_n_cells(addr_cells, &memcell_buf);
|
||||
mem_size = read_n_cells(size_cells, &memcell_buf);
|
||||
if (numa_enabled) {
|
||||
numa_domain = of_node_numa_domain(memory);
|
||||
if (numa_domain >= MAX_NUMNODES)
|
||||
numa_domain = 0;
|
||||
} else
|
||||
numa_domain = 0;
|
||||
start = init_node_data[i].start_pfn;
|
||||
end = init_node_data[i].end_pfn;
|
||||
|
||||
if (numa_domain != nid)
|
||||
continue;
|
||||
|
||||
mem_size = numa_enforce_memory_limit(mem_start, mem_size);
|
||||
memory_present(numa_domain, mem_start >> PAGE_SHIFT,
|
||||
(mem_start + mem_size) >> PAGE_SHIFT);
|
||||
|
||||
if (--ranges) /* process all ranges in cell */
|
||||
goto new_range2;
|
||||
memory_present(nid, start, end);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -746,21 +698,18 @@ void __init paging_init(void)
|
|||
memset(zholes_size, 0, sizeof(zholes_size));
|
||||
|
||||
for_each_online_node(nid) {
|
||||
unsigned long start_pfn;
|
||||
unsigned long end_pfn;
|
||||
unsigned long start_pfn, end_pfn, pages_present;
|
||||
|
||||
start_pfn = init_node_data[nid].node_start_pfn;
|
||||
end_pfn = init_node_data[nid].node_end_pfn;
|
||||
get_region(nid, &start_pfn, &end_pfn, &pages_present);
|
||||
|
||||
zones_size[ZONE_DMA] = end_pfn - start_pfn;
|
||||
zholes_size[ZONE_DMA] = zones_size[ZONE_DMA] -
|
||||
init_node_data[nid].node_present_pages;
|
||||
zholes_size[ZONE_DMA] = zones_size[ZONE_DMA] - pages_present;
|
||||
|
||||
dbg("free_area_init node %d %lx %lx (hole: %lx)\n", nid,
|
||||
zones_size[ZONE_DMA], start_pfn, zholes_size[ZONE_DMA]);
|
||||
|
||||
free_area_init_node(nid, NODE_DATA(nid), zones_size,
|
||||
start_pfn, zholes_size);
|
||||
free_area_init_node(nid, NODE_DATA(nid), zones_size, start_pfn,
|
||||
zholes_size);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -14,7 +14,6 @@
|
|||
#include <asm/system.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/cputable.h>
|
||||
#include <asm/systemcfg.h>
|
||||
#include <asm/rtas.h>
|
||||
#include <asm/oprofile_impl.h>
|
||||
#include <asm/reg.h>
|
||||
|
|
|
@ -27,7 +27,6 @@
|
|||
#include <asm/prom.h>
|
||||
#include <asm/nvram.h>
|
||||
#include <asm/atomic.h>
|
||||
#include <asm/systemcfg.h>
|
||||
|
||||
#if 0
|
||||
#define DEBUG(A...) printk(KERN_ERR A)
|
||||
|
|
|
@ -306,9 +306,7 @@ static void __init fw_feature_init(void)
|
|||
}
|
||||
|
||||
of_node_put(dn);
|
||||
no_rtas:
|
||||
printk(KERN_INFO "firmware_features = 0x%lx\n",
|
||||
ppc64_firmware_features);
|
||||
no_rtas:
|
||||
|
||||
DBG(" <- fw_feature_init()\n");
|
||||
}
|
||||
|
|
|
@ -46,7 +46,7 @@
|
|||
#include <asm/rtas.h>
|
||||
#include <asm/pSeries_reconfig.h>
|
||||
#include <asm/mpic.h>
|
||||
#include <asm/systemcfg.h>
|
||||
#include <asm/vdso_datapage.h>
|
||||
|
||||
#include "plpar_wrappers.h"
|
||||
|
||||
|
@ -97,7 +97,7 @@ int pSeries_cpu_disable(void)
|
|||
int cpu = smp_processor_id();
|
||||
|
||||
cpu_clear(cpu, cpu_online_map);
|
||||
_systemcfg->processorCount--;
|
||||
vdso_data->processorCount--;
|
||||
|
||||
/*fix boot_cpuid here*/
|
||||
if (cpu == boot_cpuid)
|
||||
|
|
|
@ -1467,17 +1467,23 @@ read_spr(int n)
|
|||
{
|
||||
unsigned int instrs[2];
|
||||
unsigned long (*code)(void);
|
||||
unsigned long opd[3];
|
||||
unsigned long ret = -1UL;
|
||||
#ifdef CONFIG_PPC64
|
||||
unsigned long opd[3];
|
||||
|
||||
instrs[0] = 0x7c6002a6 + ((n & 0x1F) << 16) + ((n & 0x3e0) << 6);
|
||||
instrs[1] = 0x4e800020;
|
||||
opd[0] = (unsigned long)instrs;
|
||||
opd[1] = 0;
|
||||
opd[2] = 0;
|
||||
code = (unsigned long (*)(void)) opd;
|
||||
#else
|
||||
code = (unsigned long (*)(void)) instrs;
|
||||
#endif
|
||||
|
||||
/* mfspr r3,n; blr */
|
||||
instrs[0] = 0x7c6002a6 + ((n & 0x1F) << 16) + ((n & 0x3e0) << 6);
|
||||
instrs[1] = 0x4e800020;
|
||||
store_inst(instrs);
|
||||
store_inst(instrs+1);
|
||||
code = (unsigned long (*)(void)) opd;
|
||||
|
||||
if (setjmp(bus_error_jmp) == 0) {
|
||||
catch_memory_errors = 1;
|
||||
|
@ -1499,16 +1505,21 @@ write_spr(int n, unsigned long val)
|
|||
{
|
||||
unsigned int instrs[2];
|
||||
unsigned long (*code)(unsigned long);
|
||||
#ifdef CONFIG_PPC64
|
||||
unsigned long opd[3];
|
||||
|
||||
instrs[0] = 0x7c6003a6 + ((n & 0x1F) << 16) + ((n & 0x3e0) << 6);
|
||||
instrs[1] = 0x4e800020;
|
||||
opd[0] = (unsigned long)instrs;
|
||||
opd[1] = 0;
|
||||
opd[2] = 0;
|
||||
code = (unsigned long (*)(unsigned long)) opd;
|
||||
#else
|
||||
code = (unsigned long (*)(unsigned long)) instrs;
|
||||
#endif
|
||||
|
||||
instrs[0] = 0x7c6003a6 + ((n & 0x1F) << 16) + ((n & 0x3e0) << 6);
|
||||
instrs[1] = 0x4e800020;
|
||||
store_inst(instrs);
|
||||
store_inst(instrs+1);
|
||||
code = (unsigned long (*)(unsigned long)) opd;
|
||||
|
||||
if (setjmp(bus_error_jmp) == 0) {
|
||||
catch_memory_errors = 1;
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
#include <asm/processor.h>
|
||||
#include <asm/cputable.h>
|
||||
#include <asm/thread_info.h>
|
||||
#include <asm/vdso_datapage.h>
|
||||
|
||||
#define DEFINE(sym, val) \
|
||||
asm volatile("\n->" #sym " %0 " #val : : "i" (val))
|
||||
|
@ -143,5 +144,32 @@ main(void)
|
|||
|
||||
DEFINE(TASK_SIZE, TASK_SIZE);
|
||||
DEFINE(NUM_USER_SEGMENTS, TASK_SIZE>>28);
|
||||
|
||||
/* datapage offsets for use by vdso */
|
||||
DEFINE(CFG_TB_ORIG_STAMP, offsetof(struct vdso_data, tb_orig_stamp));
|
||||
DEFINE(CFG_TB_TICKS_PER_SEC, offsetof(struct vdso_data, tb_ticks_per_sec));
|
||||
DEFINE(CFG_TB_TO_XS, offsetof(struct vdso_data, tb_to_xs));
|
||||
DEFINE(CFG_STAMP_XSEC, offsetof(struct vdso_data, stamp_xsec));
|
||||
DEFINE(CFG_TB_UPDATE_COUNT, offsetof(struct vdso_data, tb_update_count));
|
||||
DEFINE(CFG_TZ_MINUTEWEST, offsetof(struct vdso_data, tz_minuteswest));
|
||||
DEFINE(CFG_TZ_DSTTIME, offsetof(struct vdso_data, tz_dsttime));
|
||||
DEFINE(CFG_SYSCALL_MAP32, offsetof(struct vdso_data, syscall_map_32));
|
||||
DEFINE(WTOM_CLOCK_SEC, offsetof(struct vdso_data, wtom_clock_sec));
|
||||
DEFINE(WTOM_CLOCK_NSEC, offsetof(struct vdso_data, wtom_clock_nsec));
|
||||
DEFINE(TVAL32_TV_SEC, offsetof(struct timeval, tv_sec));
|
||||
DEFINE(TVAL32_TV_USEC, offsetof(struct timeval, tv_usec));
|
||||
DEFINE(TSPEC32_TV_SEC, offsetof(struct timespec, tv_sec));
|
||||
DEFINE(TSPEC32_TV_NSEC, offsetof(struct timespec, tv_nsec));
|
||||
|
||||
/* timeval/timezone offsets for use by vdso */
|
||||
DEFINE(TZONE_TZ_MINWEST, offsetof(struct timezone, tz_minuteswest));
|
||||
DEFINE(TZONE_TZ_DSTTIME, offsetof(struct timezone, tz_dsttime));
|
||||
|
||||
/* Other bits used by the vdso */
|
||||
DEFINE(CLOCK_REALTIME, CLOCK_REALTIME);
|
||||
DEFINE(CLOCK_MONOTONIC, CLOCK_MONOTONIC);
|
||||
DEFINE(NSEC_PER_SEC, NSEC_PER_SEC);
|
||||
DEFINE(CLOCK_REALTIME_RES, TICK_NSEC);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -37,7 +37,7 @@ static u_char irq_to_siureg[] = {
|
|||
static u_char irq_to_siubit[] = {
|
||||
0, 15, 14, 13, 12, 11, 10, 9,
|
||||
8, 7, 6, 5, 4, 3, 2, 1,
|
||||
2, 1, 15, 14, 13, 12, 11, 10,
|
||||
2, 1, 0, 14, 13, 12, 11, 10,
|
||||
9, 8, 7, 6, 5, 4, 3, 0,
|
||||
31, 30, 29, 28, 27, 26, 25, 24,
|
||||
23, 22, 21, 20, 19, 18, 17, 16,
|
||||
|
|
|
@ -279,17 +279,12 @@ config ARCH_FLATMEM_ENABLE
|
|||
def_bool y
|
||||
depends on !NUMA
|
||||
|
||||
config ARCH_DISCONTIGMEM_ENABLE
|
||||
def_bool y
|
||||
depends on SMP && PPC_PSERIES
|
||||
|
||||
config ARCH_DISCONTIGMEM_DEFAULT
|
||||
def_bool y
|
||||
depends on ARCH_DISCONTIGMEM_ENABLE
|
||||
|
||||
config ARCH_SPARSEMEM_ENABLE
|
||||
def_bool y
|
||||
depends on ARCH_DISCONTIGMEM_ENABLE
|
||||
|
||||
config ARCH_SPARSEMEM_DEFAULT
|
||||
def_bool y
|
||||
depends on NUMA
|
||||
|
||||
source "mm/Kconfig"
|
||||
|
||||
|
|
|
@ -13,10 +13,8 @@ endif
|
|||
|
||||
obj-y += idle.o dma.o \
|
||||
align.o \
|
||||
udbg.o \
|
||||
rtc.o \
|
||||
iommu.o vdso.o
|
||||
obj-y += vdso32/ vdso64/
|
||||
iommu.o
|
||||
|
||||
pci-obj-$(CONFIG_PPC_MULTIPLATFORM) += pci_dn.o pci_direct_iommu.o
|
||||
|
||||
|
@ -27,8 +25,6 @@ ifneq ($(CONFIG_PPC_MERGE),y)
|
|||
obj-$(CONFIG_PPC_MULTIPLATFORM) += prom_init.o
|
||||
endif
|
||||
|
||||
obj-$(CONFIG_PPC_PSERIES) += udbg_16550.o
|
||||
|
||||
obj-$(CONFIG_KEXEC) += machine_kexec.o
|
||||
obj-$(CONFIG_MODULES) += module.o
|
||||
ifneq ($(CONFIG_PPC_MERGE),y)
|
||||
|
@ -40,10 +36,6 @@ obj-$(CONFIG_BOOTX_TEXT) += btext.o
|
|||
endif
|
||||
obj-$(CONFIG_HVCS) += hvcserver.o
|
||||
|
||||
obj-$(CONFIG_PPC_PMAC) += udbg_scc.o
|
||||
|
||||
obj-$(CONFIG_PPC_MAPLE) += udbg_16550.o
|
||||
|
||||
obj-$(CONFIG_KPROBES) += kprobes.o
|
||||
|
||||
ifneq ($(CONFIG_PPC_MERGE),y)
|
||||
|
|
|
@ -186,7 +186,8 @@ _KPROBE(__flush_icache_range)
|
|||
bdnz 2b
|
||||
isync
|
||||
blr
|
||||
.previous .text
|
||||
|
||||
.text
|
||||
/*
|
||||
* Like above, but only do the D-cache.
|
||||
*
|
||||
|
|
|
@ -1,140 +0,0 @@
|
|||
/*
|
||||
* Userland implementation of gettimeofday() for 32 bits processes in a
|
||||
* ppc64 kernel for use in the vDSO
|
||||
*
|
||||
* Copyright (C) 2004 Benjamin Herrenschmuidt (benh@kernel.crashing.org), IBM Corp.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#include <linux/config.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/ppc_asm.h>
|
||||
#include <asm/vdso.h>
|
||||
#include <asm/asm-offsets.h>
|
||||
#include <asm/unistd.h>
|
||||
|
||||
.text
|
||||
/*
|
||||
* Exact prototype of gettimeofday
|
||||
*
|
||||
* int __kernel_gettimeofday(struct timeval *tv, struct timezone *tz);
|
||||
*
|
||||
*/
|
||||
V_FUNCTION_BEGIN(__kernel_gettimeofday)
|
||||
.cfi_startproc
|
||||
mflr r12
|
||||
.cfi_register lr,r12
|
||||
|
||||
mr r10,r3 /* r10 saves tv */
|
||||
mr r11,r4 /* r11 saves tz */
|
||||
bl __get_datapage@local /* get data page */
|
||||
mr r9, r3 /* datapage ptr in r9 */
|
||||
bl __do_get_xsec@local /* get xsec from tb & kernel */
|
||||
bne- 2f /* out of line -> do syscall */
|
||||
|
||||
/* seconds are xsec >> 20 */
|
||||
rlwinm r5,r4,12,20,31
|
||||
rlwimi r5,r3,12,0,19
|
||||
stw r5,TVAL32_TV_SEC(r10)
|
||||
|
||||
/* get remaining xsec and convert to usec. we scale
|
||||
* up remaining xsec by 12 bits and get the top 32 bits
|
||||
* of the multiplication
|
||||
*/
|
||||
rlwinm r5,r4,12,0,19
|
||||
lis r6,1000000@h
|
||||
ori r6,r6,1000000@l
|
||||
mulhwu r5,r5,r6
|
||||
stw r5,TVAL32_TV_USEC(r10)
|
||||
|
||||
cmpli cr0,r11,0 /* check if tz is NULL */
|
||||
beq 1f
|
||||
lwz r4,CFG_TZ_MINUTEWEST(r9)/* fill tz */
|
||||
lwz r5,CFG_TZ_DSTTIME(r9)
|
||||
stw r4,TZONE_TZ_MINWEST(r11)
|
||||
stw r5,TZONE_TZ_DSTTIME(r11)
|
||||
|
||||
1: mtlr r12
|
||||
li r3,0
|
||||
blr
|
||||
|
||||
2: mr r3,r10
|
||||
mr r4,r11
|
||||
li r0,__NR_gettimeofday
|
||||
sc
|
||||
b 1b
|
||||
.cfi_endproc
|
||||
V_FUNCTION_END(__kernel_gettimeofday)
|
||||
|
||||
/*
|
||||
* This is the core of gettimeofday(), it returns the xsec
|
||||
* value in r3 & r4 and expects the datapage ptr (non clobbered)
|
||||
* in r9. clobbers r0,r4,r5,r6,r7,r8
|
||||
*/
|
||||
__do_get_xsec:
|
||||
.cfi_startproc
|
||||
/* Check for update count & load values. We use the low
|
||||
* order 32 bits of the update count
|
||||
*/
|
||||
1: lwz r8,(CFG_TB_UPDATE_COUNT+4)(r9)
|
||||
andi. r0,r8,1 /* pending update ? loop */
|
||||
bne- 1b
|
||||
xor r0,r8,r8 /* create dependency */
|
||||
add r9,r9,r0
|
||||
|
||||
/* Load orig stamp (offset to TB) */
|
||||
lwz r5,CFG_TB_ORIG_STAMP(r9)
|
||||
lwz r6,(CFG_TB_ORIG_STAMP+4)(r9)
|
||||
|
||||
/* Get a stable TB value */
|
||||
2: mftbu r3
|
||||
mftbl r4
|
||||
mftbu r0
|
||||
cmpl cr0,r3,r0
|
||||
bne- 2b
|
||||
|
||||
/* Substract tb orig stamp. If the high part is non-zero, we jump to the
|
||||
* slow path which call the syscall. If it's ok, then we have our 32 bits
|
||||
* tb_ticks value in r7
|
||||
*/
|
||||
subfc r7,r6,r4
|
||||
subfe. r0,r5,r3
|
||||
bne- 3f
|
||||
|
||||
/* Load scale factor & do multiplication */
|
||||
lwz r5,CFG_TB_TO_XS(r9) /* load values */
|
||||
lwz r6,(CFG_TB_TO_XS+4)(r9)
|
||||
mulhwu r4,r7,r5
|
||||
mulhwu r6,r7,r6
|
||||
mullw r0,r7,r5
|
||||
addc r6,r6,r0
|
||||
|
||||
/* At this point, we have the scaled xsec value in r4 + XER:CA
|
||||
* we load & add the stamp since epoch
|
||||
*/
|
||||
lwz r5,CFG_STAMP_XSEC(r9)
|
||||
lwz r6,(CFG_STAMP_XSEC+4)(r9)
|
||||
adde r4,r4,r6
|
||||
addze r3,r5
|
||||
|
||||
/* We now have our result in r3,r4. We create a fake dependency
|
||||
* on that result and re-check the counter
|
||||
*/
|
||||
xor r0,r4,r4
|
||||
add r9,r9,r0
|
||||
lwz r0,(CFG_TB_UPDATE_COUNT+4)(r9)
|
||||
cmpl cr0,r8,r0 /* check if updated */
|
||||
bne- 1b
|
||||
|
||||
/* Warning ! The caller expects CR:EQ to be set to indicate a
|
||||
* successful calculation (so it won't fallback to the syscall
|
||||
* method). We have overriden that CR bit in the counter check,
|
||||
* but fortunately, the loop exit condition _is_ CR:EQ set, so
|
||||
* we can exit safely here. If you change this code, be careful
|
||||
* of that side effect.
|
||||
*/
|
||||
3: blr
|
||||
.cfi_endproc
|
|
@ -1,91 +0,0 @@
|
|||
/*
|
||||
* Userland implementation of gettimeofday() for 64 bits processes in a
|
||||
* ppc64 kernel for use in the vDSO
|
||||
*
|
||||
* Copyright (C) 2004 Benjamin Herrenschmuidt (benh@kernel.crashing.org),
|
||||
* IBM Corp.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#include <linux/config.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/ppc_asm.h>
|
||||
#include <asm/vdso.h>
|
||||
#include <asm/asm-offsets.h>
|
||||
|
||||
.text
|
||||
/*
|
||||
* Exact prototype of gettimeofday
|
||||
*
|
||||
* int __kernel_gettimeofday(struct timeval *tv, struct timezone *tz);
|
||||
*
|
||||
*/
|
||||
V_FUNCTION_BEGIN(__kernel_gettimeofday)
|
||||
.cfi_startproc
|
||||
mflr r12
|
||||
.cfi_register lr,r12
|
||||
|
||||
mr r11,r3 /* r11 holds tv */
|
||||
mr r10,r4 /* r10 holds tz */
|
||||
bl V_LOCAL_FUNC(__get_datapage) /* get data page */
|
||||
bl V_LOCAL_FUNC(__do_get_xsec) /* get xsec from tb & kernel */
|
||||
lis r7,15 /* r7 = 1000000 = USEC_PER_SEC */
|
||||
ori r7,r7,16960
|
||||
rldicl r5,r4,44,20 /* r5 = sec = xsec / XSEC_PER_SEC */
|
||||
rldicr r6,r5,20,43 /* r6 = sec * XSEC_PER_SEC */
|
||||
std r5,TVAL64_TV_SEC(r11) /* store sec in tv */
|
||||
subf r0,r6,r4 /* r0 = xsec = (xsec - r6) */
|
||||
mulld r0,r0,r7 /* usec = (xsec * USEC_PER_SEC) / XSEC_PER_SEC */
|
||||
rldicl r0,r0,44,20
|
||||
cmpldi cr0,r10,0 /* check if tz is NULL */
|
||||
std r0,TVAL64_TV_USEC(r11) /* store usec in tv */
|
||||
beq 1f
|
||||
lwz r4,CFG_TZ_MINUTEWEST(r3)/* fill tz */
|
||||
lwz r5,CFG_TZ_DSTTIME(r3)
|
||||
stw r4,TZONE_TZ_MINWEST(r10)
|
||||
stw r5,TZONE_TZ_DSTTIME(r10)
|
||||
1: mtlr r12
|
||||
li r3,0 /* always success */
|
||||
blr
|
||||
.cfi_endproc
|
||||
V_FUNCTION_END(__kernel_gettimeofday)
|
||||
|
||||
|
||||
/*
|
||||
* This is the core of gettimeofday(), it returns the xsec
|
||||
* value in r4 and expects the datapage ptr (non clobbered)
|
||||
* in r3. clobbers r0,r4,r5,r6,r7,r8
|
||||
*/
|
||||
V_FUNCTION_BEGIN(__do_get_xsec)
|
||||
.cfi_startproc
|
||||
/* check for update count & load values */
|
||||
1: ld r7,CFG_TB_UPDATE_COUNT(r3)
|
||||
andi. r0,r4,1 /* pending update ? loop */
|
||||
bne- 1b
|
||||
xor r0,r4,r4 /* create dependency */
|
||||
add r3,r3,r0
|
||||
|
||||
/* Get TB & offset it */
|
||||
mftb r8
|
||||
ld r9,CFG_TB_ORIG_STAMP(r3)
|
||||
subf r8,r9,r8
|
||||
|
||||
/* Scale result */
|
||||
ld r5,CFG_TB_TO_XS(r3)
|
||||
mulhdu r8,r8,r5
|
||||
|
||||
/* Add stamp since epoch */
|
||||
ld r6,CFG_STAMP_XSEC(r3)
|
||||
add r4,r6,r8
|
||||
|
||||
xor r0,r4,r4
|
||||
add r3,r3,r0
|
||||
ld r0,CFG_TB_UPDATE_COUNT(r3)
|
||||
cmpld cr0,r0,r7 /* check if updated */
|
||||
bne- 1b
|
||||
blr
|
||||
.cfi_endproc
|
||||
V_FUNCTION_END(__do_get_xsec)
|
|
@ -12,86 +12,10 @@
|
|||
#define INCLUDES
|
||||
#include "compat_ioctl.c"
|
||||
#include <linux/syscalls.h>
|
||||
#include <asm/fbio.h>
|
||||
|
||||
/* Use this to get at 32-bit user passed pointers.
|
||||
* See sys_sparc32.c for description about it.
|
||||
*/
|
||||
#define A(__x) compat_ptr(__x)
|
||||
|
||||
#define CODE
|
||||
#include "compat_ioctl.c"
|
||||
|
||||
struct fbcmap32 {
|
||||
int index; /* first element (0 origin) */
|
||||
int count;
|
||||
u32 red;
|
||||
u32 green;
|
||||
u32 blue;
|
||||
};
|
||||
|
||||
#define FBIOPUTCMAP32 _IOW('F', 3, struct fbcmap32)
|
||||
#define FBIOGETCMAP32 _IOW('F', 4, struct fbcmap32)
|
||||
|
||||
static int fbiogetputcmap(unsigned int fd, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
struct fbcmap32 __user *argp = (void __user *)arg;
|
||||
struct fbcmap __user *p = compat_alloc_user_space(sizeof(*p));
|
||||
u32 addr;
|
||||
int ret;
|
||||
|
||||
ret = copy_in_user(p, argp, 2 * sizeof(int));
|
||||
ret |= get_user(addr, &argp->red);
|
||||
ret |= put_user(compat_ptr(addr), &p->red);
|
||||
ret |= get_user(addr, &argp->green);
|
||||
ret |= put_user(compat_ptr(addr), &p->green);
|
||||
ret |= get_user(addr, &argp->blue);
|
||||
ret |= put_user(compat_ptr(addr), &p->blue);
|
||||
if (ret)
|
||||
return -EFAULT;
|
||||
return sys_ioctl(fd, (cmd == FBIOPUTCMAP32) ? FBIOPUTCMAP_SPARC : FBIOGETCMAP_SPARC, (unsigned long)p);
|
||||
}
|
||||
|
||||
struct fbcursor32 {
|
||||
short set; /* what to set, choose from the list above */
|
||||
short enable; /* cursor on/off */
|
||||
struct fbcurpos pos; /* cursor position */
|
||||
struct fbcurpos hot; /* cursor hot spot */
|
||||
struct fbcmap32 cmap; /* color map info */
|
||||
struct fbcurpos size; /* cursor bit map size */
|
||||
u32 image; /* cursor image bits */
|
||||
u32 mask; /* cursor mask bits */
|
||||
};
|
||||
|
||||
#define FBIOSCURSOR32 _IOW('F', 24, struct fbcursor32)
|
||||
#define FBIOGCURSOR32 _IOW('F', 25, struct fbcursor32)
|
||||
|
||||
static int fbiogscursor(unsigned int fd, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
struct fbcursor __user *p = compat_alloc_user_space(sizeof(*p));
|
||||
struct fbcursor32 __user *argp = (void __user *)arg;
|
||||
compat_uptr_t addr;
|
||||
int ret;
|
||||
|
||||
ret = copy_in_user(p, argp,
|
||||
2 * sizeof (short) + 2 * sizeof(struct fbcurpos));
|
||||
ret |= copy_in_user(&p->size, &argp->size, sizeof(struct fbcurpos));
|
||||
ret |= copy_in_user(&p->cmap, &argp->cmap, 2 * sizeof(int));
|
||||
ret |= get_user(addr, &argp->cmap.red);
|
||||
ret |= put_user(compat_ptr(addr), &p->cmap.red);
|
||||
ret |= get_user(addr, &argp->cmap.green);
|
||||
ret |= put_user(compat_ptr(addr), &p->cmap.green);
|
||||
ret |= get_user(addr, &argp->cmap.blue);
|
||||
ret |= put_user(compat_ptr(addr), &p->cmap.blue);
|
||||
ret |= get_user(addr, &argp->mask);
|
||||
ret |= put_user(compat_ptr(addr), &p->mask);
|
||||
ret |= get_user(addr, &argp->image);
|
||||
ret |= put_user(compat_ptr(addr), &p->image);
|
||||
if (ret)
|
||||
return -EFAULT;
|
||||
return sys_ioctl (fd, FBIOSCURSOR, (unsigned long)p);
|
||||
}
|
||||
|
||||
#define COMPATIBLE_IOCTL(cmd) HANDLE_IOCTL((cmd),sys_ioctl)
|
||||
#define HANDLE_IOCTL(cmd,handler) { (cmd), (ioctl_trans_handler_t)(handler), NULL },
|
||||
#define IOCTL_TABLE_START \
|
||||
|
@ -103,22 +27,6 @@ IOCTL_TABLE_START
|
|||
#include <linux/compat_ioctl.h>
|
||||
#define DECLARES
|
||||
#include "compat_ioctl.c"
|
||||
COMPATIBLE_IOCTL(FBIOGTYPE)
|
||||
COMPATIBLE_IOCTL(FBIOSATTR)
|
||||
COMPATIBLE_IOCTL(FBIOGATTR)
|
||||
COMPATIBLE_IOCTL(FBIOSVIDEO)
|
||||
COMPATIBLE_IOCTL(FBIOGVIDEO)
|
||||
COMPATIBLE_IOCTL(FBIOGCURSOR32) /* This is not implemented yet. Later it should be converted... */
|
||||
COMPATIBLE_IOCTL(FBIOSCURPOS)
|
||||
COMPATIBLE_IOCTL(FBIOGCURPOS)
|
||||
COMPATIBLE_IOCTL(FBIOGCURMAX)
|
||||
/* Little k */
|
||||
/* Little v, the video4linux ioctls */
|
||||
/* And these ioctls need translation */
|
||||
/* Note SIOCRTMSG is no longer, so this is safe and * the user would have seen just an -EINVAL anyways. */
|
||||
HANDLE_IOCTL(FBIOPUTCMAP32, fbiogetputcmap)
|
||||
HANDLE_IOCTL(FBIOGETCMAP32, fbiogetputcmap)
|
||||
HANDLE_IOCTL(FBIOSCURSOR32, fbiogscursor)
|
||||
#if 0
|
||||
HANDLE_IOCTL(RTC32_IRQP_READ, do_rtc_ioctl)
|
||||
HANDLE_IOCTL(RTC32_IRQP_SET, do_rtc_ioctl)
|
||||
|
|
|
@ -587,6 +587,8 @@ extern void mmu_info(struct seq_file *);
|
|||
unsigned int dcache_parity_tl1_occurred;
|
||||
unsigned int icache_parity_tl1_occurred;
|
||||
|
||||
static int ncpus_probed;
|
||||
|
||||
static int show_cpuinfo(struct seq_file *m, void *__unused)
|
||||
{
|
||||
seq_printf(m,
|
||||
|
@ -595,8 +597,8 @@ static int show_cpuinfo(struct seq_file *m, void *__unused)
|
|||
"promlib\t\t: Version 3 Revision %d\n"
|
||||
"prom\t\t: %d.%d.%d\n"
|
||||
"type\t\t: sun4u\n"
|
||||
"ncpus probed\t: %ld\n"
|
||||
"ncpus active\t: %ld\n"
|
||||
"ncpus probed\t: %d\n"
|
||||
"ncpus active\t: %d\n"
|
||||
"D$ parity tl1\t: %u\n"
|
||||
"I$ parity tl1\t: %u\n"
|
||||
#ifndef CONFIG_SMP
|
||||
|
@ -610,8 +612,8 @@ static int show_cpuinfo(struct seq_file *m, void *__unused)
|
|||
prom_prev >> 16,
|
||||
(prom_prev >> 8) & 0xff,
|
||||
prom_prev & 0xff,
|
||||
(long)num_possible_cpus(),
|
||||
(long)num_online_cpus(),
|
||||
ncpus_probed,
|
||||
num_online_cpus(),
|
||||
dcache_parity_tl1_occurred,
|
||||
icache_parity_tl1_occurred
|
||||
#ifndef CONFIG_SMP
|
||||
|
@ -677,6 +679,15 @@ static int __init topology_init(void)
|
|||
int i, err;
|
||||
|
||||
err = -ENOMEM;
|
||||
|
||||
/* Count the number of physically present processors in
|
||||
* the machine, even on uniprocessor, so that /proc/cpuinfo
|
||||
* output is consistent with 2.4.x
|
||||
*/
|
||||
ncpus_probed = 0;
|
||||
while (!cpu_find_by_instance(ncpus_probed, NULL, NULL))
|
||||
ncpus_probed++;
|
||||
|
||||
for (i = 0; i < NR_CPUS; i++) {
|
||||
if (cpu_possible(i)) {
|
||||
struct cpu *p = kmalloc(sizeof(*p), GFP_KERNEL);
|
||||
|
|
|
@ -39,7 +39,6 @@
|
|||
#include <asm/starfire.h>
|
||||
#include <asm/tlb.h>
|
||||
|
||||
extern int linux_num_cpus;
|
||||
extern void calibrate_delay(void);
|
||||
|
||||
/* Please don't make this stuff initdata!!! --DaveM */
|
||||
|
|
|
@ -268,9 +268,10 @@ void uml_net_user_timer_expire(unsigned long _conn)
|
|||
static DEFINE_SPINLOCK(devices_lock);
|
||||
static struct list_head devices = LIST_HEAD_INIT(devices);
|
||||
|
||||
static struct device_driver uml_net_driver = {
|
||||
.name = DRIVER_NAME,
|
||||
.bus = &platform_bus_type,
|
||||
static struct platform_driver uml_net_driver = {
|
||||
.driver = {
|
||||
.name = DRIVER_NAME,
|
||||
},
|
||||
};
|
||||
static int driver_registered;
|
||||
|
||||
|
@ -317,7 +318,7 @@ static int eth_configure(int n, void *init, char *mac,
|
|||
|
||||
/* sysfs register */
|
||||
if (!driver_registered) {
|
||||
driver_register(¨_net_driver);
|
||||
platform_driver_register(¨_net_driver);
|
||||
driver_registered = 1;
|
||||
}
|
||||
device->pdev.id = n;
|
||||
|
|
|
@ -823,9 +823,10 @@ static int ubd_mc_init(void)
|
|||
|
||||
__initcall(ubd_mc_init);
|
||||
|
||||
static struct device_driver ubd_driver = {
|
||||
.name = DRIVER_NAME,
|
||||
.bus = &platform_bus_type,
|
||||
static struct platform_driver ubd_driver = {
|
||||
.driver = {
|
||||
.name = DRIVER_NAME,
|
||||
},
|
||||
};
|
||||
|
||||
int ubd_init(void)
|
||||
|
@ -850,7 +851,7 @@ int ubd_init(void)
|
|||
if (register_blkdev(fake_major, "ubd"))
|
||||
return -1;
|
||||
}
|
||||
driver_register(&ubd_driver);
|
||||
platform_driver_register(&ubd_driver);
|
||||
for (i = 0; i < MAX_DEV; i++)
|
||||
ubd_add(i);
|
||||
return 0;
|
||||
|
|
|
@ -616,9 +616,10 @@ void iss_net_user_timer_expire(unsigned long _conn)
|
|||
}
|
||||
|
||||
|
||||
static struct device_driver iss_net_driver = {
|
||||
.name = DRIVER_NAME,
|
||||
.bus = &platform_bus_type,
|
||||
static struct platform_driver iss_net_driver = {
|
||||
.driver = {
|
||||
.name = DRIVER_NAME,
|
||||
},
|
||||
};
|
||||
|
||||
static int driver_registered;
|
||||
|
@ -669,7 +670,7 @@ static int iss_net_configure(int index, char *init)
|
|||
/* sysfs register */
|
||||
|
||||
if (!driver_registered) {
|
||||
driver_register(&iss_net_driver);
|
||||
platform_driver_register(&iss_net_driver);
|
||||
driver_registered = 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -861,8 +861,8 @@ __cfq_slice_expired(struct cfq_data *cfqd, struct cfq_queue *cfqq,
|
|||
* store what was left of this slice, if the queue idled out
|
||||
* or was preempted
|
||||
*/
|
||||
if (time_after(now, cfqq->slice_end))
|
||||
cfqq->slice_left = now - cfqq->slice_end;
|
||||
if (time_after(cfqq->slice_end, now))
|
||||
cfqq->slice_left = cfqq->slice_end - now;
|
||||
else
|
||||
cfqq->slice_left = 0;
|
||||
|
||||
|
@ -999,7 +999,7 @@ cfq_prio_to_maxrq(struct cfq_data *cfqd, struct cfq_queue *cfqq)
|
|||
/*
|
||||
* get next queue for service
|
||||
*/
|
||||
static struct cfq_queue *cfq_select_queue(struct cfq_data *cfqd, int force)
|
||||
static struct cfq_queue *cfq_select_queue(struct cfq_data *cfqd)
|
||||
{
|
||||
unsigned long now = jiffies;
|
||||
struct cfq_queue *cfqq;
|
||||
|
@ -1023,7 +1023,7 @@ static struct cfq_queue *cfq_select_queue(struct cfq_data *cfqd, int force)
|
|||
*/
|
||||
if (!RB_EMPTY(&cfqq->sort_list))
|
||||
goto keep_queue;
|
||||
else if (!force && cfq_cfqq_class_sync(cfqq) &&
|
||||
else if (cfq_cfqq_class_sync(cfqq) &&
|
||||
time_before(now, cfqq->slice_end)) {
|
||||
if (cfq_arm_slice_timer(cfqd, cfqq))
|
||||
return NULL;
|
||||
|
@ -1091,6 +1091,42 @@ __cfq_dispatch_requests(struct cfq_data *cfqd, struct cfq_queue *cfqq,
|
|||
return dispatched;
|
||||
}
|
||||
|
||||
static int
|
||||
cfq_forced_dispatch_cfqqs(struct list_head *list)
|
||||
{
|
||||
int dispatched = 0;
|
||||
struct cfq_queue *cfqq, *next;
|
||||
struct cfq_rq *crq;
|
||||
|
||||
list_for_each_entry_safe(cfqq, next, list, cfq_list) {
|
||||
while ((crq = cfqq->next_crq)) {
|
||||
cfq_dispatch_insert(cfqq->cfqd->queue, crq);
|
||||
dispatched++;
|
||||
}
|
||||
BUG_ON(!list_empty(&cfqq->fifo));
|
||||
}
|
||||
return dispatched;
|
||||
}
|
||||
|
||||
static int
|
||||
cfq_forced_dispatch(struct cfq_data *cfqd)
|
||||
{
|
||||
int i, dispatched = 0;
|
||||
|
||||
for (i = 0; i < CFQ_PRIO_LISTS; i++)
|
||||
dispatched += cfq_forced_dispatch_cfqqs(&cfqd->rr_list[i]);
|
||||
|
||||
dispatched += cfq_forced_dispatch_cfqqs(&cfqd->busy_rr);
|
||||
dispatched += cfq_forced_dispatch_cfqqs(&cfqd->cur_rr);
|
||||
dispatched += cfq_forced_dispatch_cfqqs(&cfqd->idle_rr);
|
||||
|
||||
cfq_slice_expired(cfqd, 0);
|
||||
|
||||
BUG_ON(cfqd->busy_queues);
|
||||
|
||||
return dispatched;
|
||||
}
|
||||
|
||||
static int
|
||||
cfq_dispatch_requests(request_queue_t *q, int force)
|
||||
{
|
||||
|
@ -1100,7 +1136,10 @@ cfq_dispatch_requests(request_queue_t *q, int force)
|
|||
if (!cfqd->busy_queues)
|
||||
return 0;
|
||||
|
||||
cfqq = cfq_select_queue(cfqd, force);
|
||||
if (unlikely(force))
|
||||
return cfq_forced_dispatch(cfqd);
|
||||
|
||||
cfqq = cfq_select_queue(cfqd);
|
||||
if (cfqq) {
|
||||
int max_dispatch;
|
||||
|
||||
|
@ -1115,12 +1154,9 @@ cfq_dispatch_requests(request_queue_t *q, int force)
|
|||
cfq_clear_cfqq_wait_request(cfqq);
|
||||
del_timer(&cfqd->idle_slice_timer);
|
||||
|
||||
if (!force) {
|
||||
max_dispatch = cfqd->cfq_quantum;
|
||||
if (cfq_class_idle(cfqq))
|
||||
max_dispatch = 1;
|
||||
} else
|
||||
max_dispatch = INT_MAX;
|
||||
max_dispatch = cfqd->cfq_quantum;
|
||||
if (cfq_class_idle(cfqq))
|
||||
max_dispatch = 1;
|
||||
|
||||
return __cfq_dispatch_requests(cfqd, cfqq, max_dispatch);
|
||||
}
|
||||
|
|
|
@ -155,9 +155,10 @@ static void elevator_setup_default(void)
|
|||
/*
|
||||
* If the given scheduler is not available, fall back to no-op.
|
||||
*/
|
||||
if (!(e = elevator_find(chosen_elevator)))
|
||||
if ((e = elevator_find(chosen_elevator)))
|
||||
elevator_put(e);
|
||||
else
|
||||
strcpy(chosen_elevator, "noop");
|
||||
elevator_put(e);
|
||||
}
|
||||
|
||||
static int __init elevator_setup(char *str)
|
||||
|
@ -190,14 +191,14 @@ int elevator_init(request_queue_t *q, char *name)
|
|||
|
||||
eq = kmalloc(sizeof(struct elevator_queue), GFP_KERNEL);
|
||||
if (!eq) {
|
||||
elevator_put(e->elevator_type);
|
||||
elevator_put(e);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
ret = elevator_attach(q, e, eq);
|
||||
if (ret) {
|
||||
kfree(eq);
|
||||
elevator_put(e->elevator_type);
|
||||
elevator_put(e);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
@ -225,6 +226,7 @@ void elv_dispatch_sort(request_queue_t *q, struct request *rq)
|
|||
|
||||
if (q->last_merge == rq)
|
||||
q->last_merge = NULL;
|
||||
q->nr_sorted--;
|
||||
|
||||
boundary = q->end_sector;
|
||||
|
||||
|
@ -283,6 +285,7 @@ void elv_merge_requests(request_queue_t *q, struct request *rq,
|
|||
|
||||
if (e->ops->elevator_merge_req_fn)
|
||||
e->ops->elevator_merge_req_fn(q, rq, next);
|
||||
q->nr_sorted--;
|
||||
|
||||
q->last_merge = rq;
|
||||
}
|
||||
|
@ -314,6 +317,20 @@ void elv_requeue_request(request_queue_t *q, struct request *rq)
|
|||
__elv_add_request(q, rq, ELEVATOR_INSERT_FRONT, 0);
|
||||
}
|
||||
|
||||
static void elv_drain_elevator(request_queue_t *q)
|
||||
{
|
||||
static int printed;
|
||||
while (q->elevator->ops->elevator_dispatch_fn(q, 1))
|
||||
;
|
||||
if (q->nr_sorted == 0)
|
||||
return;
|
||||
if (printed++ < 10) {
|
||||
printk(KERN_ERR "%s: forced dispatching is broken "
|
||||
"(nr_sorted=%u), please report this\n",
|
||||
q->elevator->elevator_type->elevator_name, q->nr_sorted);
|
||||
}
|
||||
}
|
||||
|
||||
void __elv_add_request(request_queue_t *q, struct request *rq, int where,
|
||||
int plug)
|
||||
{
|
||||
|
@ -348,9 +365,7 @@ void __elv_add_request(request_queue_t *q, struct request *rq, int where,
|
|||
|
||||
case ELEVATOR_INSERT_BACK:
|
||||
rq->flags |= REQ_SOFTBARRIER;
|
||||
|
||||
while (q->elevator->ops->elevator_dispatch_fn(q, 1))
|
||||
;
|
||||
elv_drain_elevator(q);
|
||||
list_add_tail(&rq->queuelist, &q->queue_head);
|
||||
/*
|
||||
* We kick the queue here for the following reasons.
|
||||
|
@ -369,6 +384,7 @@ void __elv_add_request(request_queue_t *q, struct request *rq, int where,
|
|||
case ELEVATOR_INSERT_SORT:
|
||||
BUG_ON(!blk_fs_request(rq));
|
||||
rq->flags |= REQ_SORTED;
|
||||
q->nr_sorted++;
|
||||
if (q->last_merge == NULL && rq_mergeable(rq))
|
||||
q->last_merge = rq;
|
||||
/*
|
||||
|
@ -525,33 +541,19 @@ int elv_queue_empty(request_queue_t *q)
|
|||
|
||||
struct request *elv_latter_request(request_queue_t *q, struct request *rq)
|
||||
{
|
||||
struct list_head *next;
|
||||
|
||||
elevator_t *e = q->elevator;
|
||||
|
||||
if (e->ops->elevator_latter_req_fn)
|
||||
return e->ops->elevator_latter_req_fn(q, rq);
|
||||
|
||||
next = rq->queuelist.next;
|
||||
if (next != &q->queue_head && next != &rq->queuelist)
|
||||
return list_entry_rq(next);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct request *elv_former_request(request_queue_t *q, struct request *rq)
|
||||
{
|
||||
struct list_head *prev;
|
||||
|
||||
elevator_t *e = q->elevator;
|
||||
|
||||
if (e->ops->elevator_former_req_fn)
|
||||
return e->ops->elevator_former_req_fn(q, rq);
|
||||
|
||||
prev = rq->queuelist.prev;
|
||||
if (prev != &q->queue_head && prev != &rq->queuelist)
|
||||
return list_entry_rq(prev);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -691,13 +693,15 @@ static void elevator_switch(request_queue_t *q, struct elevator_type *new_e)
|
|||
|
||||
set_bit(QUEUE_FLAG_ELVSWITCH, &q->queue_flags);
|
||||
|
||||
while (q->elevator->ops->elevator_dispatch_fn(q, 1))
|
||||
;
|
||||
elv_drain_elevator(q);
|
||||
|
||||
while (q->rq.elvpriv) {
|
||||
blk_remove_plug(q);
|
||||
q->request_fn(q);
|
||||
spin_unlock_irq(q->queue_lock);
|
||||
msleep(10);
|
||||
spin_lock_irq(q->queue_lock);
|
||||
elv_drain_elevator(q);
|
||||
}
|
||||
|
||||
spin_unlock_irq(q->queue_lock);
|
||||
|
@ -744,13 +748,15 @@ error:
|
|||
ssize_t elv_iosched_store(request_queue_t *q, const char *name, size_t count)
|
||||
{
|
||||
char elevator_name[ELV_NAME_MAX];
|
||||
size_t len;
|
||||
struct elevator_type *e;
|
||||
|
||||
memset(elevator_name, 0, sizeof(elevator_name));
|
||||
strncpy(elevator_name, name, sizeof(elevator_name));
|
||||
elevator_name[sizeof(elevator_name) - 1] = '\0';
|
||||
strncpy(elevator_name, name, sizeof(elevator_name) - 1);
|
||||
len = strlen(elevator_name);
|
||||
|
||||
if (elevator_name[strlen(elevator_name) - 1] == '\n')
|
||||
elevator_name[strlen(elevator_name) - 1] = '\0';
|
||||
if (len && elevator_name[len - 1] == '\n')
|
||||
elevator_name[len - 1] = '\0';
|
||||
|
||||
e = elevator_get(elevator_name);
|
||||
if (!e) {
|
||||
|
|
|
@ -391,12 +391,14 @@ static ssize_t disk_stats_read(struct gendisk * disk, char *page)
|
|||
"%8u %8u %8llu %8u "
|
||||
"%8u %8u %8u"
|
||||
"\n",
|
||||
disk_stat_read(disk, ios[0]), disk_stat_read(disk, merges[0]),
|
||||
(unsigned long long)disk_stat_read(disk, sectors[0]),
|
||||
jiffies_to_msecs(disk_stat_read(disk, ticks[0])),
|
||||
disk_stat_read(disk, ios[1]), disk_stat_read(disk, merges[1]),
|
||||
(unsigned long long)disk_stat_read(disk, sectors[1]),
|
||||
jiffies_to_msecs(disk_stat_read(disk, ticks[1])),
|
||||
disk_stat_read(disk, ios[READ]),
|
||||
disk_stat_read(disk, merges[READ]),
|
||||
(unsigned long long)disk_stat_read(disk, sectors[READ]),
|
||||
jiffies_to_msecs(disk_stat_read(disk, ticks[READ])),
|
||||
disk_stat_read(disk, ios[WRITE]),
|
||||
disk_stat_read(disk, merges[WRITE]),
|
||||
(unsigned long long)disk_stat_read(disk, sectors[WRITE]),
|
||||
jiffies_to_msecs(disk_stat_read(disk, ticks[WRITE])),
|
||||
disk->in_flight,
|
||||
jiffies_to_msecs(disk_stat_read(disk, io_ticks)),
|
||||
jiffies_to_msecs(disk_stat_read(disk, time_in_queue)));
|
||||
|
|
|
@ -7,21 +7,94 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
static void elevator_noop_add_request(request_queue_t *q, struct request *rq)
|
||||
struct noop_data {
|
||||
struct list_head queue;
|
||||
};
|
||||
|
||||
static void noop_merged_requests(request_queue_t *q, struct request *rq,
|
||||
struct request *next)
|
||||
{
|
||||
rq->flags |= REQ_NOMERGE;
|
||||
elv_dispatch_add_tail(q, rq);
|
||||
list_del_init(&next->queuelist);
|
||||
}
|
||||
|
||||
static int elevator_noop_dispatch(request_queue_t *q, int force)
|
||||
static int noop_dispatch(request_queue_t *q, int force)
|
||||
{
|
||||
struct noop_data *nd = q->elevator->elevator_data;
|
||||
|
||||
if (!list_empty(&nd->queue)) {
|
||||
struct request *rq;
|
||||
rq = list_entry(nd->queue.next, struct request, queuelist);
|
||||
list_del_init(&rq->queuelist);
|
||||
elv_dispatch_sort(q, rq);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void noop_add_request(request_queue_t *q, struct request *rq)
|
||||
{
|
||||
struct noop_data *nd = q->elevator->elevator_data;
|
||||
|
||||
list_add_tail(&rq->queuelist, &nd->queue);
|
||||
}
|
||||
|
||||
static int noop_queue_empty(request_queue_t *q)
|
||||
{
|
||||
struct noop_data *nd = q->elevator->elevator_data;
|
||||
|
||||
return list_empty(&nd->queue);
|
||||
}
|
||||
|
||||
static struct request *
|
||||
noop_former_request(request_queue_t *q, struct request *rq)
|
||||
{
|
||||
struct noop_data *nd = q->elevator->elevator_data;
|
||||
|
||||
if (rq->queuelist.prev == &nd->queue)
|
||||
return NULL;
|
||||
return list_entry(rq->queuelist.prev, struct request, queuelist);
|
||||
}
|
||||
|
||||
static struct request *
|
||||
noop_latter_request(request_queue_t *q, struct request *rq)
|
||||
{
|
||||
struct noop_data *nd = q->elevator->elevator_data;
|
||||
|
||||
if (rq->queuelist.next == &nd->queue)
|
||||
return NULL;
|
||||
return list_entry(rq->queuelist.next, struct request, queuelist);
|
||||
}
|
||||
|
||||
static int noop_init_queue(request_queue_t *q, elevator_t *e)
|
||||
{
|
||||
struct noop_data *nd;
|
||||
|
||||
nd = kmalloc(sizeof(*nd), GFP_KERNEL);
|
||||
if (!nd)
|
||||
return -ENOMEM;
|
||||
INIT_LIST_HEAD(&nd->queue);
|
||||
e->elevator_data = nd;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void noop_exit_queue(elevator_t *e)
|
||||
{
|
||||
struct noop_data *nd = e->elevator_data;
|
||||
|
||||
BUG_ON(!list_empty(&nd->queue));
|
||||
kfree(nd);
|
||||
}
|
||||
|
||||
static struct elevator_type elevator_noop = {
|
||||
.ops = {
|
||||
.elevator_dispatch_fn = elevator_noop_dispatch,
|
||||
.elevator_add_req_fn = elevator_noop_add_request,
|
||||
.elevator_merge_req_fn = noop_merged_requests,
|
||||
.elevator_dispatch_fn = noop_dispatch,
|
||||
.elevator_add_req_fn = noop_add_request,
|
||||
.elevator_queue_empty_fn = noop_queue_empty,
|
||||
.elevator_former_req_fn = noop_former_request,
|
||||
.elevator_latter_req_fn = noop_latter_request,
|
||||
.elevator_init_fn = noop_init_queue,
|
||||
.elevator_exit_fn = noop_exit_queue,
|
||||
},
|
||||
.elevator_name = "noop",
|
||||
.elevator_owner = THIS_MODULE,
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
|
||||
#include "base.h"
|
||||
|
||||
#define to_platform_driver(drv) (container_of((drv), struct platform_driver, driver))
|
||||
|
||||
struct device platform_bus = {
|
||||
.bus_id = "platform",
|
||||
};
|
||||
|
@ -354,6 +356,77 @@ error:
|
|||
return ERR_PTR(retval);
|
||||
}
|
||||
|
||||
static int platform_drv_probe(struct device *_dev)
|
||||
{
|
||||
struct platform_driver *drv = to_platform_driver(_dev->driver);
|
||||
struct platform_device *dev = to_platform_device(_dev);
|
||||
|
||||
return drv->probe(dev);
|
||||
}
|
||||
|
||||
static int platform_drv_remove(struct device *_dev)
|
||||
{
|
||||
struct platform_driver *drv = to_platform_driver(_dev->driver);
|
||||
struct platform_device *dev = to_platform_device(_dev);
|
||||
|
||||
return drv->remove(dev);
|
||||
}
|
||||
|
||||
static void platform_drv_shutdown(struct device *_dev)
|
||||
{
|
||||
struct platform_driver *drv = to_platform_driver(_dev->driver);
|
||||
struct platform_device *dev = to_platform_device(_dev);
|
||||
|
||||
drv->shutdown(dev);
|
||||
}
|
||||
|
||||
static int platform_drv_suspend(struct device *_dev, pm_message_t state)
|
||||
{
|
||||
struct platform_driver *drv = to_platform_driver(_dev->driver);
|
||||
struct platform_device *dev = to_platform_device(_dev);
|
||||
|
||||
return drv->suspend(dev, state);
|
||||
}
|
||||
|
||||
static int platform_drv_resume(struct device *_dev)
|
||||
{
|
||||
struct platform_driver *drv = to_platform_driver(_dev->driver);
|
||||
struct platform_device *dev = to_platform_device(_dev);
|
||||
|
||||
return drv->resume(dev);
|
||||
}
|
||||
|
||||
/**
|
||||
* platform_driver_register
|
||||
* @drv: platform driver structure
|
||||
*/
|
||||
int platform_driver_register(struct platform_driver *drv)
|
||||
{
|
||||
drv->driver.bus = &platform_bus_type;
|
||||
if (drv->probe)
|
||||
drv->driver.probe = platform_drv_probe;
|
||||
if (drv->remove)
|
||||
drv->driver.remove = platform_drv_remove;
|
||||
if (drv->shutdown)
|
||||
drv->driver.shutdown = platform_drv_shutdown;
|
||||
if (drv->suspend)
|
||||
drv->driver.suspend = platform_drv_suspend;
|
||||
if (drv->resume)
|
||||
drv->driver.resume = platform_drv_resume;
|
||||
return driver_register(&drv->driver);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(platform_driver_register);
|
||||
|
||||
/**
|
||||
* platform_driver_unregister
|
||||
* @drv: platform driver structure
|
||||
*/
|
||||
void platform_driver_unregister(struct platform_driver *drv)
|
||||
{
|
||||
driver_unregister(&drv->driver);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(platform_driver_unregister);
|
||||
|
||||
|
||||
/**
|
||||
* platform_match - bind platform device to platform driver.
|
||||
|
|
|
@ -58,7 +58,6 @@
|
|||
#include <linux/slab.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <scsi/scsi.h> /* for SCSI_IOCTL_GET_IDLUN */
|
||||
typedef void Scsi_Device; /* hack to avoid including scsi.h */
|
||||
#include <scsi/scsi_ioctl.h>
|
||||
#include <linux/hdreg.h> /* for HDIO_GETGEO */
|
||||
#include <linux/blkpg.h>
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue