You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'master' of /pub/scm/linux/kernel/git/torvalds/linux-2.6
This commit is contained in:
@@ -25,6 +25,7 @@
|
||||
|
||||
#include <linux/genetlink.h>
|
||||
#include <linux/taskstats.h>
|
||||
#include <linux/cgroupstats.h>
|
||||
|
||||
/*
|
||||
* Generic macros for dealing with netlink sockets. Might be duplicated
|
||||
@@ -78,6 +79,7 @@ static void usage(void)
|
||||
fprintf(stderr, " -i: print IO accounting (works only with -p)\n");
|
||||
fprintf(stderr, " -l: listen forever\n");
|
||||
fprintf(stderr, " -v: debug on\n");
|
||||
fprintf(stderr, " -C: container path\n");
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -212,6 +214,14 @@ void task_context_switch_counts(struct taskstats *t)
|
||||
t->nvcsw, t->nivcsw);
|
||||
}
|
||||
|
||||
void print_cgroupstats(struct cgroupstats *c)
|
||||
{
|
||||
printf("sleeping %llu, blocked %llu, running %llu, stopped %llu, "
|
||||
"uninterruptible %llu\n", c->nr_sleeping, c->nr_io_wait,
|
||||
c->nr_running, c->nr_stopped, c->nr_uninterruptible);
|
||||
}
|
||||
|
||||
|
||||
void print_ioacct(struct taskstats *t)
|
||||
{
|
||||
printf("%s: read=%llu, write=%llu, cancelled_write=%llu\n",
|
||||
@@ -239,11 +249,14 @@ int main(int argc, char *argv[])
|
||||
int maskset = 0;
|
||||
char *logfile = NULL;
|
||||
int loop = 0;
|
||||
int containerset = 0;
|
||||
char containerpath[1024];
|
||||
int cfd = 0;
|
||||
|
||||
struct msgtemplate msg;
|
||||
|
||||
while (1) {
|
||||
c = getopt(argc, argv, "qdiw:r:m:t:p:vl");
|
||||
c = getopt(argc, argv, "qdiw:r:m:t:p:vlC:");
|
||||
if (c < 0)
|
||||
break;
|
||||
|
||||
@@ -260,6 +273,10 @@ int main(int argc, char *argv[])
|
||||
printf("printing task/process context switch rates\n");
|
||||
print_task_context_switch_counts = 1;
|
||||
break;
|
||||
case 'C':
|
||||
containerset = 1;
|
||||
strncpy(containerpath, optarg, strlen(optarg) + 1);
|
||||
break;
|
||||
case 'w':
|
||||
logfile = strdup(optarg);
|
||||
printf("write to file %s\n", logfile);
|
||||
@@ -334,6 +351,11 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
}
|
||||
|
||||
if (tid && containerset) {
|
||||
fprintf(stderr, "Select either -t or -C, not both\n");
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (tid) {
|
||||
rc = send_cmd(nl_sd, id, mypid, TASKSTATS_CMD_GET,
|
||||
cmd_type, &tid, sizeof(__u32));
|
||||
@@ -344,6 +366,20 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
}
|
||||
|
||||
if (containerset) {
|
||||
cfd = open(containerpath, O_RDONLY);
|
||||
if (cfd < 0) {
|
||||
perror("error opening container file");
|
||||
goto err;
|
||||
}
|
||||
rc = send_cmd(nl_sd, id, mypid, CGROUPSTATS_CMD_GET,
|
||||
CGROUPSTATS_CMD_ATTR_FD, &cfd, sizeof(__u32));
|
||||
if (rc < 0) {
|
||||
perror("error sending cgroupstats command");
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
||||
do {
|
||||
int i;
|
||||
|
||||
@@ -422,6 +458,9 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
break;
|
||||
|
||||
case CGROUPSTATS_TYPE_CGROUP_STATS:
|
||||
print_cgroupstats(NLA_DATA(na));
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, "Unknown nla_type %d\n",
|
||||
na->nla_type);
|
||||
@@ -443,5 +482,7 @@ err:
|
||||
close(nl_sd);
|
||||
if (fd)
|
||||
close(fd);
|
||||
if (cfd)
|
||||
close(cfd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -181,15 +181,6 @@ Who: Nick Piggin <npiggin@suse.de>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: Interrupt only SA_* flags
|
||||
When: September 2007
|
||||
Why: The interrupt related SA_* flags are replaced by IRQF_* to move them
|
||||
out of the signal namespace.
|
||||
|
||||
Who: Thomas Gleixner <tglx@linutronix.de>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: PHYSDEVPATH, PHYSDEVBUS, PHYSDEVDRIVER in the uevent environment
|
||||
When: October 2008
|
||||
Why: The stacking of class devices makes these values misleading and
|
||||
|
||||
@@ -35,12 +35,14 @@ In order to use the macro trace_mark, you should include linux/marker.h.
|
||||
|
||||
And,
|
||||
|
||||
trace_mark(subsystem_event, "%d %s", someint, somestring);
|
||||
trace_mark(subsystem_event, "myint %d mystring %s", someint, somestring);
|
||||
Where :
|
||||
- subsystem_event is an identifier unique to your event
|
||||
- subsystem is the name of your subsystem.
|
||||
- event is the name of the event to mark.
|
||||
- "%d %s" is the formatted string for the serializer.
|
||||
- "myint %d mystring %s" is the formatted string for the serializer. "myint" and
|
||||
"mystring" are repectively the field names associated with the first and
|
||||
second parameter.
|
||||
- someint is an integer.
|
||||
- somestring is a char pointer.
|
||||
|
||||
|
||||
@@ -180,9 +180,10 @@ driver returns ENOIOCTLCMD. Some common examples:
|
||||
* RTC_IRQP_SET, RTC_IRQP_READ: the irq_set_freq function will be called
|
||||
to set the frequency while the framework will handle the read for you
|
||||
since the frequency is stored in the irq_freq member of the rtc_device
|
||||
structure. Also make sure you set the max_user_freq member in your
|
||||
initialization routines so the framework can sanity check the user
|
||||
input for you.
|
||||
structure. Your driver needs to initialize the irq_freq member during
|
||||
init. Make sure you check the requested frequency is in range of your
|
||||
hardware in the irq_set_freq function. If you cannot actually change
|
||||
the frequency, just return -ENOTTY.
|
||||
|
||||
If all else fails, check out the rtc-test.c driver!
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 24
|
||||
EXTRAVERSION = -rc2
|
||||
EXTRAVERSION = -rc3
|
||||
NAME = Arr Matey! A Hairy Bilge Rat!
|
||||
|
||||
# *DOCUMENTATION*
|
||||
@@ -197,8 +197,13 @@ CROSS_COMPILE ?=
|
||||
UTS_MACHINE := $(ARCH)
|
||||
SRCARCH := $(ARCH)
|
||||
|
||||
# for i386 and x86_64 we use SRCARCH equal to x86
|
||||
SRCARCH := $(if $(filter x86_64 i386,$(SRCARCH)),x86,$(SRCARCH))
|
||||
# Additional ARCH settings for x86
|
||||
ifeq ($(ARCH),i386)
|
||||
SRCARCH := x86
|
||||
endif
|
||||
ifeq ($(ARCH),x86_64)
|
||||
SRCARCH := x86
|
||||
endif
|
||||
|
||||
KCONFIG_CONFIG ?= .config
|
||||
|
||||
@@ -1327,12 +1332,7 @@ else
|
||||
ALLINCLUDE_ARCHS := $(ALLSOURCE_ARCHS)
|
||||
endif
|
||||
|
||||
# Take care of arch/x86
|
||||
ifeq ($(ARCH), $(SRCARCH))
|
||||
ALLSOURCE_ARCHS := $(ARCH)
|
||||
else
|
||||
ALLSOURCE_ARCHS := $(ARCH) $(SRCARCH)
|
||||
endif
|
||||
ALLSOURCE_ARCHS := $(SRCARCH)
|
||||
|
||||
define find-sources
|
||||
( for arch in $(ALLSOURCE_ARCHS) ; do \
|
||||
|
||||
@@ -150,22 +150,45 @@ static void clk_pxa3xx_cken_disable(struct clk *clk)
|
||||
local_irq_enable();
|
||||
}
|
||||
|
||||
static const struct clkops clk_pxa3xx_cken_ops = {
|
||||
.enable = clk_pxa3xx_cken_enable,
|
||||
.disable = clk_pxa3xx_cken_disable,
|
||||
};
|
||||
|
||||
static const struct clkops clk_pxa3xx_hsio_ops = {
|
||||
.enable = clk_pxa3xx_cken_enable,
|
||||
.disable = clk_pxa3xx_cken_disable,
|
||||
.getrate = clk_pxa3xx_hsio_getrate,
|
||||
};
|
||||
|
||||
#define PXA3xx_CKEN(_name, _cken, _rate, _delay, _dev) \
|
||||
{ \
|
||||
.name = _name, \
|
||||
.dev = _dev, \
|
||||
.ops = &clk_pxa3xx_cken_ops, \
|
||||
.rate = _rate, \
|
||||
.cken = CKEN_##_cken, \
|
||||
.delay = _delay, \
|
||||
}
|
||||
|
||||
#define PXA3xx_CK(_name, _cken, _ops, _dev) \
|
||||
{ \
|
||||
.name = _name, \
|
||||
.dev = _dev, \
|
||||
.ops = _ops, \
|
||||
.cken = CKEN_##_cken, \
|
||||
}
|
||||
|
||||
static struct clk pxa3xx_clks[] = {
|
||||
INIT_CK("LCDCLK", LCD, &clk_pxa3xx_hsio_ops, &pxa_device_fb.dev),
|
||||
INIT_CK("CAMCLK", CAMERA, &clk_pxa3xx_hsio_ops, NULL),
|
||||
PXA3xx_CK("LCDCLK", LCD, &clk_pxa3xx_hsio_ops, &pxa_device_fb.dev),
|
||||
PXA3xx_CK("CAMCLK", CAMERA, &clk_pxa3xx_hsio_ops, NULL),
|
||||
|
||||
INIT_CKEN("UARTCLK", FFUART, 14857000, 1, &pxa_device_ffuart.dev),
|
||||
INIT_CKEN("UARTCLK", BTUART, 14857000, 1, &pxa_device_btuart.dev),
|
||||
INIT_CKEN("UARTCLK", STUART, 14857000, 1, NULL),
|
||||
PXA3xx_CKEN("UARTCLK", FFUART, 14857000, 1, &pxa_device_ffuart.dev),
|
||||
PXA3xx_CKEN("UARTCLK", BTUART, 14857000, 1, &pxa_device_btuart.dev),
|
||||
PXA3xx_CKEN("UARTCLK", STUART, 14857000, 1, NULL),
|
||||
|
||||
INIT_CKEN("I2CCLK", I2C, 32842000, 0, &pxa_device_i2c.dev),
|
||||
INIT_CKEN("UDCCLK", UDC, 48000000, 5, &pxa_device_udc.dev),
|
||||
PXA3xx_CKEN("I2CCLK", I2C, 32842000, 0, &pxa_device_i2c.dev),
|
||||
PXA3xx_CKEN("UDCCLK", UDC, 48000000, 5, &pxa_device_udc.dev),
|
||||
};
|
||||
|
||||
void __init pxa3xx_init_irq(void)
|
||||
|
||||
@@ -322,7 +322,6 @@ static int dma_mmap(struct device *dev, struct vm_area_struct *vma,
|
||||
|
||||
if (off < kern_size &&
|
||||
user_size <= (kern_size - off)) {
|
||||
vma->vm_flags |= VM_RESERVED;
|
||||
ret = remap_pfn_range(vma, vma->vm_start,
|
||||
page_to_pfn(c->vm_pages) + off,
|
||||
user_size << PAGE_SHIFT,
|
||||
|
||||
@@ -19,9 +19,6 @@ config AVR32
|
||||
There is an AVR32 Linux project with a web page at
|
||||
http://avr32linux.org/.
|
||||
|
||||
config UID16
|
||||
bool
|
||||
|
||||
config GENERIC_GPIO
|
||||
bool
|
||||
default y
|
||||
|
||||
@@ -474,7 +474,7 @@ static struct resource at32ap700x_rtc0_resource[] = {
|
||||
static struct resource at32_wdt0_resource[] = {
|
||||
{
|
||||
.start = 0xfff000b0,
|
||||
.end = 0xfff000bf,
|
||||
.end = 0xfff000cf,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
@@ -690,7 +690,7 @@ static struct resource atmel_usart0_resource[] = {
|
||||
IRQ(6),
|
||||
};
|
||||
DEFINE_DEV_DATA(atmel_usart, 0);
|
||||
DEV_CLK(usart, atmel_usart0, pba, 4);
|
||||
DEV_CLK(usart, atmel_usart0, pba, 3);
|
||||
|
||||
static struct atmel_uart_data atmel_usart1_data = {
|
||||
.use_dma_tx = 1,
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#define DEBUG
|
||||
#include <linux/clk.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
#include <linux/irq.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <asm/intc.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
#include "intc.h"
|
||||
@@ -136,7 +137,8 @@ fail:
|
||||
panic("Interrupt controller initialization failed!\n");
|
||||
}
|
||||
|
||||
unsigned long intc_get_pending(int group)
|
||||
unsigned long intc_get_pending(unsigned int group)
|
||||
{
|
||||
return intc_readl(&intc0, INTREQ0 + 4 * group);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(intc_get_pending);
|
||||
|
||||
+18
-1
@@ -13,6 +13,10 @@ config ZONE_DMA
|
||||
bool
|
||||
default y
|
||||
|
||||
config NO_DMA
|
||||
bool
|
||||
default y
|
||||
|
||||
config RWSEM_GENERIC_SPINLOCK
|
||||
bool
|
||||
default y
|
||||
@@ -57,6 +61,10 @@ menu "General setup"
|
||||
|
||||
source "fs/Kconfig.binfmt"
|
||||
|
||||
config GENERIC_HARDIRQS
|
||||
bool
|
||||
default y
|
||||
|
||||
config ETRAX_CMDLINE
|
||||
string "Kernel command line"
|
||||
default "root=/dev/mtdblock3"
|
||||
@@ -149,7 +157,8 @@ source "net/Kconfig"
|
||||
|
||||
# bring in ETRAX built-in drivers
|
||||
menu "Drivers for built-in interfaces"
|
||||
source arch/cris/arch-v10/drivers/Kconfig
|
||||
# arch/cris/arch is a symlink to correct arch (arch-v10 or arch-v32)
|
||||
source arch/cris/arch/drivers/Kconfig
|
||||
|
||||
endmenu
|
||||
|
||||
@@ -180,6 +189,10 @@ source "drivers/isdn/Kconfig"
|
||||
|
||||
source "drivers/telephony/Kconfig"
|
||||
|
||||
source "drivers/i2c/Kconfig"
|
||||
|
||||
source "drivers/rtc/Kconfig"
|
||||
|
||||
#
|
||||
# input before char - char/joystick depends on it. As does USB.
|
||||
#
|
||||
@@ -194,6 +207,10 @@ source "fs/Kconfig"
|
||||
|
||||
source "sound/Kconfig"
|
||||
|
||||
source "drivers/pcmcia/Kconfig"
|
||||
|
||||
source "drivers/pci/Kconfig"
|
||||
|
||||
source "drivers/usb/Kconfig"
|
||||
|
||||
source "kernel/Kconfig.instrumentation"
|
||||
|
||||
@@ -99,7 +99,6 @@ CONFIG_MTD=y
|
||||
CONFIG_MTD_CFI=y
|
||||
# CONFIG_MTD_CFI_INTELEXT is not set
|
||||
CONFIG_MTD_CFI_AMDSTD=y
|
||||
CONFIG_MTD_AMDSTD=y
|
||||
CONFIG_MTD_CHAR=y
|
||||
CONFIG_MTD_BLOCK=y
|
||||
CONFIG_ETRAX_I2C=y
|
||||
@@ -145,7 +144,6 @@ CONFIG_MTD_CFI=y
|
||||
# CONFIG_MTD_CFI_GEOMETRY is not set
|
||||
# CONFIG_MTD_CFI_INTELEXT is not set
|
||||
CONFIG_MTD_CFI_AMDSTD=y
|
||||
CONFIG_MTD_AMDSTD=y
|
||||
# CONFIG_MTD_SHARP is not set
|
||||
# CONFIG_MTD_PHYSMAP is not set
|
||||
# CONFIG_MTD_NORA is not set
|
||||
|
||||
@@ -2,6 +2,7 @@ config ETRAX_ETHERNET
|
||||
bool "Ethernet support"
|
||||
depends on ETRAX_ARCH_V10
|
||||
select NET_ETHERNET
|
||||
select MII
|
||||
help
|
||||
This option enables the ETRAX 100LX built-in 10/100Mbit Ethernet
|
||||
controller.
|
||||
@@ -605,8 +606,6 @@ config ETRAX_AXISFLASHMAP
|
||||
select MTD
|
||||
select MTD_CFI
|
||||
select MTD_CFI_AMDSTD
|
||||
select MTD_OBSOLETE_CHIPS
|
||||
select MTD_AMDSTD
|
||||
select MTD_CHAR
|
||||
select MTD_BLOCK
|
||||
select MTD_PARTITIONS
|
||||
|
||||
@@ -312,12 +312,12 @@ static struct mtd_info *probe_cs(struct map_info *map_cs)
|
||||
"%s: Probing a 0x%08lx bytes large window at 0x%08lx.\n",
|
||||
map_cs->name, map_cs->size, map_cs->map_priv_1);
|
||||
|
||||
#ifdef CONFIG_MTD_AMDSTD
|
||||
mtd_cs = do_map_probe("amd_flash", map_cs);
|
||||
#endif
|
||||
#ifdef CONFIG_MTD_CFI
|
||||
mtd_cs = do_map_probe("cfi_probe", map_cs);
|
||||
#endif
|
||||
#ifdef CONFIG_MTD_JEDECPROBE
|
||||
if (!mtd_cs) {
|
||||
mtd_cs = do_map_probe("cfi_probe", map_cs);
|
||||
mtd_cs = do_map_probe("jedec_probe", map_cs);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -297,8 +297,10 @@ gpio_poll(struct file *file,
|
||||
data = *R_PORT_PB_DATA;
|
||||
else if (priv->minor == GPIO_MINOR_G)
|
||||
data = *R_PORT_G_DATA;
|
||||
else
|
||||
else {
|
||||
spin_unlock(&gpio_lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ((data & priv->highalarm) ||
|
||||
(~data & priv->lowalarm)) {
|
||||
@@ -381,18 +383,21 @@ static ssize_t gpio_write(struct file * file, const char * buf, size_t count,
|
||||
|
||||
ssize_t retval = count;
|
||||
if (priv->minor !=GPIO_MINOR_A && priv->minor != GPIO_MINOR_B) {
|
||||
return -EFAULT;
|
||||
retval = -EFAULT;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!access_ok(VERIFY_READ, buf, count)) {
|
||||
return -EFAULT;
|
||||
retval = -EFAULT;
|
||||
goto out;
|
||||
}
|
||||
clk_mask = priv->clk_mask;
|
||||
data_mask = priv->data_mask;
|
||||
/* It must have been configured using the IO_CFG_WRITE_MODE */
|
||||
/* Perhaps a better error code? */
|
||||
if (clk_mask == 0 || data_mask == 0) {
|
||||
return -EPERM;
|
||||
retval = -EPERM;
|
||||
goto out;
|
||||
}
|
||||
write_msb = priv->write_msb;
|
||||
D(printk("gpio_write: %lu to data 0x%02X clk 0x%02X msb: %i\n",count, data_mask, clk_mask, write_msb));
|
||||
@@ -425,6 +430,7 @@ static ssize_t gpio_write(struct file * file, const char * buf, size_t count,
|
||||
}
|
||||
}
|
||||
}
|
||||
out:
|
||||
spin_unlock(&gpio_lock);
|
||||
return retval;
|
||||
}
|
||||
@@ -506,6 +512,7 @@ gpio_release(struct inode *inode, struct file *filp)
|
||||
while (p) {
|
||||
if (p->highalarm | p->lowalarm) {
|
||||
gpio_some_alarms = 1;
|
||||
spin_unlock(&gpio_lock);
|
||||
return 0;
|
||||
}
|
||||
p = p->next;
|
||||
|
||||
@@ -500,9 +500,8 @@ _work_notifysig:
|
||||
;; deal with pending signals and notify-resume requests
|
||||
|
||||
move.d $r9, $r10 ; do_notify_resume syscall/irq param
|
||||
moveq 0, $r11 ; oldset param - 0 in this case
|
||||
move.d $sp, $r12 ; the regs param
|
||||
move.d $r1, $r13 ; the thread_info_flags parameter
|
||||
move.d $sp, $r11 ; the regs param
|
||||
move.d $r1, $r12 ; the thread_info_flags parameter
|
||||
jsr do_notify_resume
|
||||
|
||||
ba _Rexit
|
||||
@@ -678,13 +677,19 @@ IRQ1_interrupt:
|
||||
push $r10 ; push orig_r10
|
||||
clear.d [$sp=$sp-4] ; frametype == 0, normal frame
|
||||
|
||||
;; If there is a glitch on the NMI pin shorter than ~100ns
|
||||
;; (i.e. non-active by the time we get here) then the nmi_pin bit
|
||||
;; in R_IRQ_MASK0_RD will already be cleared. The watchdog_nmi bit
|
||||
;; is cleared by us however (when feeding the watchdog), which is why
|
||||
;; we use that bit to determine what brought us here.
|
||||
|
||||
move.d [R_IRQ_MASK0_RD], $r1 ; External NMI or watchdog?
|
||||
and.d 0x80000000, $r1
|
||||
beq wdog
|
||||
and.d (1<<30), $r1
|
||||
bne wdog
|
||||
move.d $sp, $r10
|
||||
jsr handle_nmi
|
||||
setf m ; Enable NMI again
|
||||
retb ; Return from NMI
|
||||
ba _Rexit ; Return the standard way
|
||||
nop
|
||||
wdog:
|
||||
#if defined(CONFIG_ETRAX_WATCHDOG) && !defined(CONFIG_SVINTO_SIM)
|
||||
@@ -775,22 +780,9 @@ multiple_interrupt:
|
||||
push $r10 ; push orig_r10
|
||||
clear.d [$sp=$sp-4] ; frametype == 0, normal frame
|
||||
|
||||
moveq 2, $r2 ; first bit we care about is the timer0 irq
|
||||
move.d [R_VECT_MASK_RD], $r0; read the irq bits that triggered the multiple irq
|
||||
move.d $r0, [R_VECT_MASK_CLR] ; Block all active IRQs
|
||||
1:
|
||||
btst $r2, $r0 ; check for the irq given by bit r2
|
||||
bpl 2f
|
||||
move.d $r2, $r10 ; First argument to do_IRQ
|
||||
move.d $sp, $r11 ; second argument to do_IRQ
|
||||
jsr do_IRQ
|
||||
2:
|
||||
addq 1, $r2 ; next vector bit
|
||||
cmp.b 32, $r2
|
||||
bne 1b ; process all irq's up to and including number 31
|
||||
moveq 0, $r9 ; make ret_from_intr realise we came from an ir
|
||||
move.d $sp, $r10
|
||||
jsr do_multiple_IRQ
|
||||
|
||||
move.d $r0, [R_VECT_MASK_SET] ; Unblock all the IRQs
|
||||
jump ret_from_intr
|
||||
|
||||
do_sigtrap:
|
||||
@@ -837,6 +829,13 @@ _ugdb_handle_breakpoint:
|
||||
ba do_sigtrap ; SIGTRAP the offending process.
|
||||
pop $dccr ; Restore dccr in delay slot.
|
||||
|
||||
.global kernel_execve
|
||||
kernel_execve:
|
||||
move.d __NR_execve, $r9
|
||||
break 13
|
||||
ret
|
||||
nop
|
||||
|
||||
.data
|
||||
|
||||
hw_bp_trigs:
|
||||
@@ -1135,6 +1134,42 @@ sys_call_table:
|
||||
.long sys_add_key
|
||||
.long sys_request_key
|
||||
.long sys_keyctl
|
||||
.long sys_ioprio_set
|
||||
.long sys_ioprio_get /* 290 */
|
||||
.long sys_inotify_init
|
||||
.long sys_inotify_add_watch
|
||||
.long sys_inotify_rm_watch
|
||||
.long sys_migrate_pages
|
||||
.long sys_openat /* 295 */
|
||||
.long sys_mkdirat
|
||||
.long sys_mknodat
|
||||
.long sys_fchownat
|
||||
.long sys_futimesat
|
||||
.long sys_fstatat64 /* 300 */
|
||||
.long sys_unlinkat
|
||||
.long sys_renameat
|
||||
.long sys_linkat
|
||||
.long sys_symlinkat
|
||||
.long sys_readlinkat /* 305 */
|
||||
.long sys_fchmodat
|
||||
.long sys_faccessat
|
||||
.long sys_pselect6
|
||||
.long sys_ppoll
|
||||
.long sys_unshare /* 310 */
|
||||
.long sys_set_robust_list
|
||||
.long sys_get_robust_list
|
||||
.long sys_splice
|
||||
.long sys_sync_file_range
|
||||
.long sys_tee /* 315 */
|
||||
.long sys_vmsplice
|
||||
.long sys_move_pages
|
||||
.long sys_getcpu
|
||||
.long sys_epoll_pwait
|
||||
.long sys_utimensat /* 320 */
|
||||
.long sys_signalfd
|
||||
.long sys_timerfd
|
||||
.long sys_eventfd
|
||||
.long sys_fallocate
|
||||
|
||||
/*
|
||||
* NOTE!! This doesn't have to be exact - we just have
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -304,7 +304,7 @@ static unsigned char clear_group_from_set(const unsigned char groups, struct if_
|
||||
static struct if_group *get_group(const unsigned char groups)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < sizeof(if_groups)/sizeof(struct if_group); i++) {
|
||||
for (i = 0; i < ARRAY_SIZE(if_groups); i++) {
|
||||
if (groups & if_groups[i].group) {
|
||||
return &if_groups[i];
|
||||
}
|
||||
|
||||
@@ -12,10 +12,16 @@
|
||||
*/
|
||||
|
||||
#include <asm/irq.h>
|
||||
#include <asm/current.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
/* From kgdb.c. */
|
||||
extern void kgdb_init(void);
|
||||
extern void breakpoint(void);
|
||||
|
||||
#define mask_irq(irq_nr) (*R_VECT_MASK_CLR = 1 << (irq_nr));
|
||||
#define unmask_irq(irq_nr) (*R_VECT_MASK_SET = 1 << (irq_nr));
|
||||
|
||||
@@ -75,8 +81,8 @@ BUILD_IRQ(12, 0x1000)
|
||||
BUILD_IRQ(13, 0x2000)
|
||||
void mmu_bus_fault(void); /* IRQ 14 is the bus fault interrupt */
|
||||
void multiple_interrupt(void); /* IRQ 15 is the multiple IRQ interrupt */
|
||||
BUILD_IRQ(16, 0x10000)
|
||||
BUILD_IRQ(17, 0x20000)
|
||||
BUILD_IRQ(16, 0x10000 | 0x20000) /* ethernet tx interrupt needs to block rx */
|
||||
BUILD_IRQ(17, 0x20000 | 0x10000) /* ...and vice versa */
|
||||
BUILD_IRQ(18, 0x40000)
|
||||
BUILD_IRQ(19, 0x80000)
|
||||
BUILD_IRQ(20, 0x100000)
|
||||
@@ -147,6 +153,55 @@ void system_call(void); /* from entry.S */
|
||||
void do_sigtrap(void); /* from entry.S */
|
||||
void gdb_handle_breakpoint(void); /* from entry.S */
|
||||
|
||||
extern void do_IRQ(int irq, struct pt_regs * regs);
|
||||
|
||||
/* Handle multiple IRQs */
|
||||
void do_multiple_IRQ(struct pt_regs* regs)
|
||||
{
|
||||
int bit;
|
||||
unsigned masked;
|
||||
unsigned mask;
|
||||
unsigned ethmask = 0;
|
||||
|
||||
/* Get interrupts to mask and handle */
|
||||
mask = masked = *R_VECT_MASK_RD;
|
||||
|
||||
/* Never mask timer IRQ */
|
||||
mask &= ~(IO_MASK(R_VECT_MASK_RD, timer0));
|
||||
|
||||
/*
|
||||
* If either ethernet interrupt (rx or tx) is active then block
|
||||
* the other one too. Unblock afterwards also.
|
||||
*/
|
||||
if (mask &
|
||||
(IO_STATE(R_VECT_MASK_RD, dma0, active) |
|
||||
IO_STATE(R_VECT_MASK_RD, dma1, active))) {
|
||||
ethmask = (IO_MASK(R_VECT_MASK_RD, dma0) |
|
||||
IO_MASK(R_VECT_MASK_RD, dma1));
|
||||
}
|
||||
|
||||
/* Block them */
|
||||
*R_VECT_MASK_CLR = (mask | ethmask);
|
||||
|
||||
/* An extra irq_enter here to prevent softIRQs to run after
|
||||
* each do_IRQ. This will decrease the interrupt latency.
|
||||
*/
|
||||
irq_enter();
|
||||
|
||||
/* Handle all IRQs */
|
||||
for (bit = 2; bit < 32; bit++) {
|
||||
if (masked & (1 << bit)) {
|
||||
do_IRQ(bit, regs);
|
||||
}
|
||||
}
|
||||
|
||||
/* This irq_exit() will trigger the soft IRQs. */
|
||||
irq_exit();
|
||||
|
||||
/* Unblock the IRQs again */
|
||||
*R_VECT_MASK_SET = (masked | ethmask);
|
||||
}
|
||||
|
||||
/* init_IRQ() is called by start_kernel and is responsible for fixing IRQ masks and
|
||||
setting the irq vector table.
|
||||
*/
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user