Commit 57b1dfbd authored by Matthew Wilcox's avatar Matthew Wilcox Committed by Linus Torvalds

[PATCH] PA-RISC updates

Some misc updates:
 - adapt our config.in changes to arch/parisc/Kconfig
 - general Makefile updaes for the new build system
 - remove asm-parisc/gsc.h in favour of asm-parisc/io.h
 - Alan-approved fix for the loff_t problem
 - Define POLLREMOVE like other architectures.
 - irq handling updates from Grant Grundler
parent 9dbad95a
This diff is collapsed.
...@@ -80,7 +80,6 @@ core-y += arch/parisc/kernel/pdc_cons.o \ ...@@ -80,7 +80,6 @@ core-y += arch/parisc/kernel/pdc_cons.o \
arch/parisc/kernel/init_task.o arch/parisc/kernel/init_task.o
libs-y += arch/parisc/lib/ \ libs-y += arch/parisc/lib/ \
`$(CC) -print-libgcc-file-name` `$(CC) -print-libgcc-file-name`
drivers-$(CONFIG_MATH_EMULATION) += arch/parisc/math-emu/
palo: vmlinux palo: vmlinux
@if [ $$(palo -f /dev/null >/dev/null 2>&1 ; echo $$?) != 2 ]; then \ @if [ $$(palo -f /dev/null >/dev/null 2>&1 ; echo $$?) != 2 ]; then \
......
# #
# Makefile for the linux kernel. # Makefile for arch/parisc/kernel
# #
ifdef CONFIG_PARISC64 ifdef CONFIG_PARISC64
...@@ -27,5 +27,3 @@ obj-$(CONFIG_PARISC64) += binfmt_elf32.o sys_parisc32.o \ ...@@ -27,5 +27,3 @@ obj-$(CONFIG_PARISC64) += binfmt_elf32.o sys_parisc32.o \
ioctl32.o signal32.o ioctl32.o signal32.o
# only supported for PCX-W/U in 64-bit mode at the moment # only supported for PCX-W/U in 64-bit mode at the moment
obj-$(CONFIG_PARISC64) += perf.o perf_asm.o obj-$(CONFIG_PARISC64) += perf.o perf_asm.o
include $(TOPDIR)/Rules.make
...@@ -35,6 +35,7 @@ int main(void) ...@@ -35,6 +35,7 @@ int main(void)
DEFINE(TASK_PTRACE, offsetof(struct task_struct, ptrace)); DEFINE(TASK_PTRACE, offsetof(struct task_struct, ptrace));
DEFINE(TASK_MM, offsetof(struct task_struct, mm)); DEFINE(TASK_MM, offsetof(struct task_struct, mm));
DEFINE(TASK_PERSONALITY, offsetof(struct task_struct, personality)); DEFINE(TASK_PERSONALITY, offsetof(struct task_struct, personality));
DEFINE(TASK_PID, offsetof(struct task_struct, pid));
BLANK(); BLANK();
DEFINE(TASK_REGS, offsetof(struct task_struct, thread.regs)); DEFINE(TASK_REGS, offsetof(struct task_struct, thread.regs));
DEFINE(TASK_PT_PSW, offsetof(struct task_struct, thread.regs.gr[ 0])); DEFINE(TASK_PT_PSW, offsetof(struct task_struct, thread.regs.gr[ 0]));
......
...@@ -23,7 +23,6 @@ ...@@ -23,7 +23,6 @@
#include <asm/hardware.h> #include <asm/hardware.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/pdc.h> #include <asm/pdc.h>
#include <asm/gsc.h>
/* See comments in include/asm-parisc/pci.h */ /* See comments in include/asm-parisc/pci.h */
struct pci_dma_ops *hppa_dma_ops; struct pci_dma_ops *hppa_dma_ops;
......
...@@ -502,7 +502,6 @@ fault_vector_11: ...@@ -502,7 +502,6 @@ fault_vector_11:
.import handle_real_interruption,code .import handle_real_interruption,code
.import do_cpu_irq_mask,code .import do_cpu_irq_mask,code
.import parisc_stopkernel,code .import parisc_stopkernel,code
.import cpu_irq_region,data
/* /*
* r26 = function to be called * r26 = function to be called
...@@ -528,23 +527,28 @@ __kernel_thread: ...@@ -528,23 +527,28 @@ __kernel_thread:
ldd 24(%r26), %r2 ldd 24(%r26), %r2
STREG %r2, PT_GR27(%r1) /* Store childs %dp */ STREG %r2, PT_GR27(%r1) /* Store childs %dp */
ldd 16(%r26), %r26 ldd 16(%r26), %r26
STREG %r22, PT_GR22(%r1) /* Store childs %dp */
copy %r0, %r22 /* user_tid */
#endif #endif
STREG %r26, PT_GR26(%r1) /* Store function & argument for child */ STREG %r26, PT_GR26(%r1) /* Store function & argument for child */
STREG %r25, PT_GR25(%r1) STREG %r25, PT_GR25(%r1)
ldo CLONE_VM(%r0), %r26 /* Force CLONE_VM since only init_mm */ ldo CLONE_VM(%r0), %r26 /* Force CLONE_VM since only init_mm */
or %r26, %r24, %r26 /* will have kernel mappings. */ or %r26, %r24, %r26 /* will have kernel mappings. */
copy %r0, %r25 copy %r0, %r25 /* stack_start */
stw %r0, -52(%r30) /* user_tid */
#ifdef __LP64__ #ifdef __LP64__
ldo -16(%r30),%r29 /* Reference param save area */ ldo -16(%r30),%r29 /* Reference param save area */
#endif #endif
bl do_fork, %r2 bl do_fork, %r2
copy %r1, %r24 copy %r1, %r24 /* pt_regs */
/* Parent Returns here */ /* Parent Returns here */
LDREG -PT_SZ_ALGN-RP_OFFSET(%r30), %r2 LDREG -PT_SZ_ALGN-RP_OFFSET(%r30), %r2
bv %r0(%r2)
ldo -PT_SZ_ALGN(%r30), %r30 ldo -PT_SZ_ALGN(%r30), %r30
bv %r0(%r2)
ldw TASK_PID(%r28), %r28
/* /*
* Child Returns here * Child Returns here
...@@ -566,6 +570,7 @@ ret_from_kernel_thread: ...@@ -566,6 +570,7 @@ ret_from_kernel_thread:
LDREG TASK_PT_GR25(%r1), %r26 LDREG TASK_PT_GR25(%r1), %r26
#ifdef __LP64__ #ifdef __LP64__
LDREG TASK_PT_GR27(%r1), %r27 LDREG TASK_PT_GR27(%r1), %r27
LDREG TASK_PT_GR22(%r1), %r22
#endif #endif
LDREG TASK_PT_GR26(%r1), %r1 LDREG TASK_PT_GR26(%r1), %r1
ble 0(%sr7, %r1) ble 0(%sr7, %r1)
...@@ -785,10 +790,10 @@ intr_do_softirq: ...@@ -785,10 +790,10 @@ intr_do_softirq:
.import schedule,code .import schedule,code
intr_do_resched: intr_do_resched:
/* Only do reschedule if we are returning to user space */ /* Only do reschedule if we are returning to user space */
LDREG PT_IASQ0(%r16), %r20 LDREG PT_IASQ0(%r16), %r20
CMPIB= 0,%r20,intr_restore /* backward */ CMPIB= 0,%r20,intr_restore /* backward */
nop nop
LDREG PT_IASQ1(%r16), %r20 LDREG PT_IASQ1(%r16), %r20
CMPIB= 0,%r20,intr_restore /* backward */ CMPIB= 0,%r20,intr_restore /* backward */
nop nop
...@@ -796,28 +801,29 @@ intr_do_resched: ...@@ -796,28 +801,29 @@ intr_do_resched:
ldo -16(%r30),%r29 /* Reference param save area */ ldo -16(%r30),%r29 /* Reference param save area */
#endif #endif
ldil L%intr_return, %r2 ldil L%intr_check_sig, %r2
b schedule b schedule
ldo R%intr_return(%r2), %r2 /* return to intr_return, not here */ ldo R%intr_check_sig(%r2), %r2
.import do_signal,code .import do_signal,code
intr_do_signal: intr_do_signal:
/* Only do signals if we are returning to user space */ /* Only do signals if we are returning to user space */
LDREG PT_IASQ0(%r16), %r20 LDREG PT_IASQ0(%r16), %r20
CMPIB= 0,%r20,intr_restore /* backward */ CMPIB= 0,%r20,intr_restore /* backward */
nop nop
LDREG PT_IASQ1(%r16), %r20 LDREG PT_IASQ1(%r16), %r20
CMPIB= 0,%r20,intr_restore /* backward */ CMPIB= 0,%r20,intr_restore /* backward */
nop nop
copy %r0, %r24 /* unsigned long in_syscall */ copy %r0, %r24 /* unsigned long in_syscall */
copy %r16, %r25 /* struct pt_regs *regs */ copy %r16, %r25 /* struct pt_regs *regs */
ssm PSW_SM_I, %r0
#ifdef __LP64__ #ifdef __LP64__
ldo -16(%r30),%r29 /* Reference param save area */ ldo -16(%r30),%r29 /* Reference param save area */
#endif #endif
#warning TAUSQ FIXME, this is wrong
#warning TAUSQ FIXME - review 2.5 signal return path changes
bl do_signal,%r2 bl do_signal,%r2
copy %r0, %r26 /* sigset_t *oldset = NULL */ copy %r0, %r26 /* sigset_t *oldset = NULL */
...@@ -860,26 +866,19 @@ intr_extint: ...@@ -860,26 +866,19 @@ intr_extint:
loadgp loadgp
copy %r29, %r25 /* arg1 is pt_regs */ copy %r29, %r26 /* arg0 is pt_regs */
copy %r29, %r16 /* save pt_regs */ copy %r29, %r16 /* save pt_regs */
ldil L%intr_return, %r2
#ifdef __LP64__ #ifdef __LP64__
ldo -16(%r30),%r29 /* Reference param save area */ ldo -16(%r30),%r29 /* Reference param save area */
#else
nop
#endif #endif
/*
* We need to either load the CPU's ID or IRQ region.
* Until we have "per CPU" IRQ regions, this is easy.
*/
ldil L%cpu_irq_region, %r26
ldil L%intr_return, %r2
ldo R%cpu_irq_region(%r26), %r26
b do_cpu_irq_mask b do_cpu_irq_mask
ldo R%intr_return(%r2), %r2 /* return to intr_return, not here */ ldo R%intr_return(%r2), %r2 /* return to intr_return, not here */
/* Generic interruptions (illegal insn, unaligned, page fault, etc) */ /* Generic interruptions (illegal insn, unaligned, page fault, etc) */
.export intr_save, code /* for os_hpmc */ .export intr_save, code /* for os_hpmc */
...@@ -953,11 +952,11 @@ skip_save_ior: ...@@ -953,11 +952,11 @@ skip_save_ior:
ldo -16(%r30),%r29 /* Reference param save area */ ldo -16(%r30),%r29 /* Reference param save area */
#endif #endif
ldil L%intr_return, %r2 ldil L%intr_restore, %r2
copy %r25, %r16 /* save pt_regs */ copy %r25, %r16 /* save pt_regs */
b handle_interruption b handle_interruption
ldo R%intr_return(%r2), %r2 /* return to intr_return */ ldo R%intr_restore(%r2), %r2
/* /*
......
...@@ -403,7 +403,7 @@ static struct hp_hardware hp_hardware_list[] __initdata = { ...@@ -403,7 +403,7 @@ static struct hp_hardware hp_hardware_list[] __initdata = {
{HPHW_BA, 0x01B, 0x00078, 0x0, "Anole 100 VME BA"}, {HPHW_BA, 0x01B, 0x00078, 0x0, "Anole 100 VME BA"},
{HPHW_BA, 0x024, 0x00078, 0x0, "Fast Pace VME BA"}, {HPHW_BA, 0x024, 0x00078, 0x0, "Fast Pace VME BA"},
{HPHW_BA, 0x034, 0x00078, 0x0, "Anole T VME BA"}, {HPHW_BA, 0x034, 0x00078, 0x0, "Anole T VME BA"},
{HPHW_BA, 0x04A, 0x00078, 0x0, "Anole L2 132 BME BA"}, {HPHW_BA, 0x04A, 0x00078, 0x0, "Anole L2 132 VME BA"},
{HPHW_BA, 0x04C, 0x00078, 0x0, "Anole L2 165 VME BA"}, {HPHW_BA, 0x04C, 0x00078, 0x0, "Anole L2 165 VME BA"},
{HPHW_BA, 0x011, 0x00081, 0x0, "WB-96 Core BA"}, {HPHW_BA, 0x011, 0x00081, 0x0, "WB-96 Core BA"},
{HPHW_BA, 0x012, 0x00081, 0x0, "Orville UX Core BA"}, {HPHW_BA, 0x012, 0x00081, 0x0, "Orville UX Core BA"},
...@@ -805,8 +805,8 @@ static struct hp_hardware hp_hardware_list[] __initdata = { ...@@ -805,8 +805,8 @@ static struct hp_hardware hp_hardware_list[] __initdata = {
{HPHW_FIO, 0x04E, 0x0007B, 0x0, "Kiji L2 132 Core Audio"}, {HPHW_FIO, 0x04E, 0x0007B, 0x0, "Kiji L2 132 Core Audio"},
{HPHW_FIO, 0x050, 0x0007B, 0x0, "Merlin Jr 132 Core Audio"}, {HPHW_FIO, 0x050, 0x0007B, 0x0, "Merlin Jr 132 Core Audio"},
{HPHW_FIO, 0x051, 0x0007B, 0x0, "Firehawk Audio"}, {HPHW_FIO, 0x051, 0x0007B, 0x0, "Firehawk Audio"},
{HPHW_FIO, 0x056, 0x0007B, 0x0, "Raven+ w SE FWSCSU Core Audio"}, {HPHW_FIO, 0x056, 0x0007B, 0x0, "Raven+ w SE FWSCSI Core Audio"},
{HPHW_FIO, 0x057, 0x0007B, 0x0, "Raven+ w Diff FWSCSU Core Audio"}, {HPHW_FIO, 0x057, 0x0007B, 0x0, "Raven+ w Diff FWSCSI Core Audio"},
{HPHW_FIO, 0x058, 0x0007B, 0x0, "FireHawk 200 Audio"}, {HPHW_FIO, 0x058, 0x0007B, 0x0, "FireHawk 200 Audio"},
{HPHW_FIO, 0x05C, 0x0007B, 0x0, "SummitHawk 230 Core Audio"}, {HPHW_FIO, 0x05C, 0x0007B, 0x0, "SummitHawk 230 Core Audio"},
{HPHW_FIO, 0x800, 0x0007B, 0x0, "Hitachi Tiny 64 Audio"}, {HPHW_FIO, 0x800, 0x0007B, 0x0, "Hitachi Tiny 64 Audio"},
......
...@@ -57,7 +57,7 @@ extern void ipi_interrupt(int, void *, struct pt_regs *); ...@@ -57,7 +57,7 @@ extern void ipi_interrupt(int, void *, struct pt_regs *);
/* Bits in EIEM correlate with cpu_irq_action[]. /* Bits in EIEM correlate with cpu_irq_action[].
** Numbered *Big Endian*! (ie bit 0 is MSB) ** Numbered *Big Endian*! (ie bit 0 is MSB)
*/ */
static unsigned long cpu_eiem = 0; static volatile unsigned long cpu_eiem = 0;
static spinlock_t irq_lock = SPIN_LOCK_UNLOCKED; /* protect IRQ regions */ static spinlock_t irq_lock = SPIN_LOCK_UNLOCKED; /* protect IRQ regions */
...@@ -104,24 +104,35 @@ static inline void unmask_cpu_irq(void *unused, int irq) ...@@ -104,24 +104,35 @@ static inline void unmask_cpu_irq(void *unused, int irq)
set_eiem(cpu_eiem); set_eiem(cpu_eiem);
} }
static struct irqaction cpu_irq_actions[IRQ_PER_REGION] = { /*
* XXX cpu_irq_actions[] will become 2 dimensional for per CPU EIR support.
* correspond changes needed in:
* processor_probe() initialize additional action arrays
* request_irq() handle CPU IRQ region specially
* do_cpu_irq_mask() index into the matching irq_action array.
*/
struct irqaction cpu_irq_actions[IRQ_PER_REGION] = {
[IRQ_OFFSET(TIMER_IRQ)] { handler: timer_interrupt, name: "timer", }, [IRQ_OFFSET(TIMER_IRQ)] { handler: timer_interrupt, name: "timer", },
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
[IRQ_OFFSET(IPI_IRQ)] { handler: ipi_interrupt, name: "IPI", }, [IRQ_OFFSET(IPI_IRQ)] { handler: ipi_interrupt, name: "IPI", },
#endif #endif
}; };
struct irq_region cpu_irq_region = { struct irq_region_ops cpu_irq_ops = {
disable_cpu_irq, enable_cpu_irq, unmask_cpu_irq, unmask_cpu_irq
};
struct irq_region cpu0_irq_region = {
ops: { disable_cpu_irq, enable_cpu_irq, unmask_cpu_irq, unmask_cpu_irq }, ops: { disable_cpu_irq, enable_cpu_irq, unmask_cpu_irq, unmask_cpu_irq },
data: { dev: &cpu_data[0], data: { dev: &cpu_data[0],
name: "PA-CPU-00", name: "PARISC-CPU",
irqbase: IRQ_FROM_REGION(CPU_IRQ_REGION), }, irqbase: IRQ_FROM_REGION(CPU_IRQ_REGION), },
action: cpu_irq_actions, action: cpu_irq_actions,
}; };
struct irq_region *irq_region[NR_IRQ_REGS] = { struct irq_region *irq_region[NR_IRQ_REGS] = {
[ 0 ] NULL, /* reserved for EISA, else causes data page fault (aka code 15) */ [ 0 ] NULL, /* reserved for EISA, else causes data page fault (aka code 15) */
[ CPU_IRQ_REGION ] &cpu_irq_region, [ CPU_IRQ_REGION ] &cpu0_irq_region,
}; };
...@@ -192,10 +203,10 @@ int show_interrupts(struct seq_file *p, void *v) ...@@ -192,10 +203,10 @@ int show_interrupts(struct seq_file *p, void *v)
unsigned int regnr = 0; unsigned int regnr = 0;
seq_puts(p, " "); seq_puts(p, " ");
#if 0 /* def CONFIG_SMP */ #ifdef CONFIG_SMP
for (; regnr < smp_num_cpus; regnr++) for (regnr = 0; regnr < NR_CPUS; regnr++)
#endif #endif
seq_printf(p, " CPU%d ", regnr); seq_printf(p, " CPU%02d ", regnr);
#ifdef PARISC_IRQ_CR16_COUNTS #ifdef PARISC_IRQ_CR16_COUNTS
seq_printf(p, "[min/avg/max] (CPU cycle counts)"); seq_printf(p, "[min/avg/max] (CPU cycle counts)");
...@@ -216,24 +227,16 @@ int show_interrupts(struct seq_file *p, void *v) ...@@ -216,24 +227,16 @@ int show_interrupts(struct seq_file *p, void *v)
for (i = 0; i <= MAX_CPU_IRQ; i++) { for (i = 0; i <= MAX_CPU_IRQ; i++) {
struct irqaction *action = &region->action[i]; struct irqaction *action = &region->action[i];
unsigned int irq_no = IRQ_FROM_REGION(regnr) + i; unsigned int irq_no = IRQ_FROM_REGION(regnr) + i;
#if 0 /* def CONFIG_SMP */ int j=0;
/* We currently direct all Interrupts at the Monarch.
* The right way to handle SMP IRQ stats is to have one IRQ region/CPU.
*/
unsigned int j;
#endif
if (!action->handler) if (!action->handler)
continue; continue;
seq_printf(p, "%3d: ", irq_no); seq_printf(p, "%3d: ", irq_no);
#if 1 /* ndef CONFIG_SMP */ #ifdef CONFIG_SMP
seq_printf(p, "%10u ", kstat_irqs(irq_no)); for (; j < NR_CPUS; j++)
#else
for (j = 0; j < smp_num_cpus; j++)
seq_printf(p, "%10u ",
kstat.irqs[cpu_logical_map(j)][irq_no]);
#endif #endif
seq_printf(p, "%10u ", kstat.irqs[j][regnr][irq_no]);
seq_printf(p, " %14s", seq_printf(p, " %14s",
region->data.name ? region->data.name : "N/A"); region->data.name ? region->data.name : "N/A");
#ifndef PARISC_IRQ_CR16_COUNTS #ifndef PARISC_IRQ_CR16_COUNTS
...@@ -243,12 +246,12 @@ int show_interrupts(struct seq_file *p, void *v) ...@@ -243,12 +246,12 @@ int show_interrupts(struct seq_file *p, void *v)
seq_printf(p, ", %s", action->name); seq_printf(p, ", %s", action->name);
#else #else
for ( ;action; action = action->next) { for ( ;action; action = action->next) {
unsigned int i, avg, min, max; unsigned int k, avg, min, max;
min = max = action->cr16_hist[0]; min = max = action->cr16_hist[0];
for (avg = i = 0; i < PARISC_CR16_HIST_SIZE; i++) { for (avg = k = 0; k < PARISC_CR16_HIST_SIZE; k++) {
int hist = action->cr16_hist[i]; int hist = action->cr16_hist[k];
if (hist) { if (hist) {
avg += hist; avg += hist;
...@@ -259,7 +262,7 @@ int show_interrupts(struct seq_file *p, void *v) ...@@ -259,7 +262,7 @@ int show_interrupts(struct seq_file *p, void *v)
if (hist < min) min = hist; if (hist < min) min = hist;
} }
avg /= i; avg /= k;
seq_printf(p, " %s[%d/%d/%d]", action->name, seq_printf(p, " %s[%d/%d/%d]", action->name,
min,avg,max); min,avg,max);
} }
...@@ -292,7 +295,7 @@ txn_alloc_irq(void) ...@@ -292,7 +295,7 @@ txn_alloc_irq(void)
/* never return irq 0 cause that's the interval timer */ /* never return irq 0 cause that's the interval timer */
for (irq = 1; irq <= MAX_CPU_IRQ; irq++) { for (irq = 1; irq <= MAX_CPU_IRQ; irq++) {
if (cpu_irq_region.action[irq].handler == NULL) { if (cpu_irq_actions[irq].handler == NULL) {
return (IRQ_FROM_REGION(CPU_IRQ_REGION) + irq); return (IRQ_FROM_REGION(CPU_IRQ_REGION) + irq);
} }
} }
...@@ -314,14 +317,18 @@ txn_claim_irq(int irq) ...@@ -314,14 +317,18 @@ txn_claim_irq(int irq)
unsigned long unsigned long
txn_alloc_addr(int virt_irq) txn_alloc_addr(int virt_irq)
{ {
struct cpuinfo_parisc *dev = (struct cpuinfo_parisc *) (irq_region[IRQ_REGION(virt_irq)]->data.dev); static int next_cpu = -1;
if (!dev) { next_cpu++; /* assign to "next" CPU we want this bugger on */
printk(KERN_ERR "txn_alloc_addr(0x%x): CPU IRQ region? dev %p\n",
virt_irq,dev); /* validate entry */
return 0; while ((next_cpu < NR_CPUS) && !cpu_data[next_cpu].txn_addr)
} next_cpu++;
return (dev->txn_addr);
if (next_cpu >= NR_CPUS)
next_cpu = 0; /* nothing else, assign monarch */
return cpu_data[next_cpu].txn_addr;
} }
...@@ -365,7 +372,7 @@ void do_irq(struct irqaction *action, int irq, struct pt_regs * regs) ...@@ -365,7 +372,7 @@ void do_irq(struct irqaction *action, int irq, struct pt_regs * regs)
int cpu = smp_processor_id(); int cpu = smp_processor_id();
irq_enter(); irq_enter();
++kstat.irqs[IRQ_REGION(irq)][IRQ_OFFSET(irq)]; ++kstat.irqs[cpu][IRQ_REGION(irq)][IRQ_OFFSET(irq)];
DBG_IRQ(irq, ("do_irq(%d) %d+%d\n", irq, IRQ_REGION(irq), IRQ_OFFSET(irq))); DBG_IRQ(irq, ("do_irq(%d) %d+%d\n", irq, IRQ_REGION(irq), IRQ_OFFSET(irq)));
...@@ -407,7 +414,7 @@ void do_irq(struct irqaction *action, int irq, struct pt_regs * regs) ...@@ -407,7 +414,7 @@ void do_irq(struct irqaction *action, int irq, struct pt_regs * regs)
/* ONLY called from entry.S:intr_extint() */ /* ONLY called from entry.S:intr_extint() */
void do_cpu_irq_mask(struct irq_region *region, struct pt_regs *regs) void do_cpu_irq_mask(struct pt_regs *regs)
{ {
unsigned long eirr_val; unsigned long eirr_val;
unsigned int i=3; /* limit time in interrupt context */ unsigned int i=3; /* limit time in interrupt context */
...@@ -431,7 +438,7 @@ void do_cpu_irq_mask(struct irq_region *region, struct pt_regs *regs) ...@@ -431,7 +438,7 @@ void do_cpu_irq_mask(struct irq_region *region, struct pt_regs *regs)
*/ */
while ((eirr_val = (mfctl(23) & cpu_eiem)) && --i) { while ((eirr_val = (mfctl(23) & cpu_eiem)) && --i) {
unsigned long bit = (1UL<<MAX_CPU_IRQ); unsigned long bit = (1UL<<MAX_CPU_IRQ);
unsigned int irq = 0; unsigned int irq;
mtctl(eirr_val, 23); /* reset bits we are going to process */ mtctl(eirr_val, 23); /* reset bits we are going to process */
...@@ -440,17 +447,16 @@ void do_cpu_irq_mask(struct irq_region *region, struct pt_regs *regs) ...@@ -440,17 +447,16 @@ void do_cpu_irq_mask(struct irq_region *region, struct pt_regs *regs)
printk(KERN_DEBUG "do_cpu_irq_mask %x\n", eirr_val); printk(KERN_DEBUG "do_cpu_irq_mask %x\n", eirr_val);
#endif #endif
for (; eirr_val && bit; bit>>=1, irq++) /* Work our way from MSb to LSb...same order we alloc EIRs */
for (irq = 0; eirr_val && bit; bit>>=1, irq++)
{ {
unsigned int irq_num; if (!(bit & eirr_val & cpu_eiem))
if (!(bit&eirr_val))
continue; continue;
/* clear bit in mask - can exit loop sooner */ /* clear bit in mask - can exit loop sooner */
eirr_val &= ~bit; eirr_val &= ~bit;
irq_num = region->data.irqbase + irq; do_irq(&cpu_irq_actions[irq], TIMER_IRQ+irq, regs);
do_irq(&region->action[irq], irq_num, regs);
} }
} }
set_eiem(cpu_eiem); set_eiem(cpu_eiem);
...@@ -675,6 +681,14 @@ void free_irq(unsigned int irq, void *dev_id) ...@@ -675,6 +681,14 @@ void free_irq(unsigned int irq, void *dev_id)
} }
#ifdef CONFIG_SMP
void synchronize_irq(unsigned int irqnum)
{
while (in_irq()) ;
}
#endif
/* /*
* IRQ autodetection code.. * IRQ autodetection code..
* *
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/smp.h> #include <linux/smp.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <asm/gsc.h> #include <asm/io.h>
#include <asm/ptrace.h> #include <asm/ptrace.h>
#include <asm/machdep.h> #include <asm/machdep.h>
......
...@@ -79,13 +79,9 @@ extern int $global$; ...@@ -79,13 +79,9 @@ extern int $global$;
EXPORT_SYMBOL_NOVERS($global$); EXPORT_SYMBOL_NOVERS($global$);
#endif #endif
#include <asm/gsc.h>
EXPORT_SYMBOL(register_parisc_driver); EXPORT_SYMBOL(register_parisc_driver);
EXPORT_SYMBOL(unregister_parisc_driver); EXPORT_SYMBOL(unregister_parisc_driver);
EXPORT_SYMBOL(pdc_iodc_read); EXPORT_SYMBOL(pdc_iodc_read);
#ifdef CONFIG_GSC
EXPORT_SYMBOL(gsc_alloc_irq);
#endif
#include <asm/io.h> #include <asm/io.h>
EXPORT_SYMBOL(__ioremap); EXPORT_SYMBOL(__ioremap);
......
...@@ -49,11 +49,11 @@ ...@@ -49,11 +49,11 @@
#include <linux/miscdevice.h> #include <linux/miscdevice.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <asm/gsc.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/perf.h> #include <asm/perf.h>
#include <asm/processor.h> #include <asm/processor.h>
#include <asm/runway.h> #include <asm/runway.h>
#include <asm/io.h> /* for __raw_read() */
#include "perf_images.h" #include "perf_images.h"
......
...@@ -35,7 +35,6 @@ ...@@ -35,7 +35,6 @@
#include <asm/pgalloc.h> #include <asm/pgalloc.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/gsc.h>
#include <asm/processor.h> #include <asm/processor.h>
#include <asm/pdc_chassis.h> #include <asm/pdc_chassis.h>
......
...@@ -167,12 +167,24 @@ static int __init processor_probe(struct parisc_device *dev) ...@@ -167,12 +167,24 @@ static int __init processor_probe(struct parisc_device *dev)
** p->state = STATE_RENDEZVOUS; ** p->state = STATE_RENDEZVOUS;
*/ */
/* #if 0
** itimer and ipi IRQ handlers are statically initialized in /* CPU 0 IRQ table is statically allocated/initialized */
** arch/parisc/kernel/irq.c. ie Don't need to register them. if (cpuid) {
*/ struct irqaction actions[];
p->region = irq_region[IRQ_FROM_REGION(CPU_IRQ_REGION)];
/*
** itimer and ipi IRQ handlers are statically initialized in
** arch/parisc/kernel/irq.c. ie Don't need to register them.
*/
actions = kmalloc(sizeof(struct irqaction)*MAX_CPU_IRQ, GFP_ATOMIC);
if (!actions) {
/* not getting it's own table, share with monarch */
actions = cpu_irq_actions[0];
}
cpu_irq_actions[cpuid] = actions;
}
#endif
return 0; return 0;
} }
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include <linux/ptrace.h> #include <linux/ptrace.h>
#include <linux/user.h> #include <linux/user.h>
#include <linux/personality.h> #include <linux/personality.h>
#include <linux/security.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/pgtable.h> #include <asm/pgtable.h>
...@@ -101,6 +102,11 @@ long sys_ptrace(long request, pid_t pid, long addr, long data) ...@@ -101,6 +102,11 @@ long sys_ptrace(long request, pid_t pid, long addr, long data)
/* are we already being traced? */ /* are we already being traced? */
if (current->ptrace & PT_PTRACED) if (current->ptrace & PT_PTRACED)
goto out; goto out;
ret = security_ops->ptrace(current->parent, current);
if (ret)
goto out;
/* set the ptrace bit in the process flags. */ /* set the ptrace bit in the process flags. */
current->ptrace |= PT_PTRACED; current->ptrace |= PT_PTRACED;
ret = 0; ret = 0;
......
...@@ -143,10 +143,8 @@ void __init setup_arch(char **cmdline_p) ...@@ -143,10 +143,8 @@ void __init setup_arch(char **cmdline_p)
dma_ops_init(); dma_ops_init();
#endif #endif
#ifdef CONFIG_VT #ifdef CONFIG_DUMMY_CONSOLE
# if defined(CONFIG_STI_CONSOLE) || defined(CONFIG_DUMMY_CONSOLE)
conswitchp = &dummy_con; /* we use take_over_console() later ! */ conswitchp = &dummy_con; /* we use take_over_console() later ! */
# endif
#endif #endif
} }
......
...@@ -147,6 +147,40 @@ long sys_shmat_wrapper(int shmid, char *shmaddr, int shmflag) ...@@ -147,6 +147,40 @@ long sys_shmat_wrapper(int shmid, char *shmaddr, int shmflag)
} }
/* Fucking broken ABI */
extern asmlinkage long sys_truncate64(const char *, loff_t);
extern asmlinkage long sys_ftruncate64(unsigned int, loff_t);
extern asmlinkage ssize_t sys_pread64(unsigned int fd, char *buf,
size_t count, loff_t pos);
extern asmlinkage ssize_t sys_pwrite64(unsigned int fd, const char *buf,
size_t count, loff_t pos);
asmlinkage long parisc_truncate64(const char * path,
unsigned int high, unsigned int low)
{
return sys_truncate(path, (loff_t)high << 32 | low);
}
asmlinkage long parisc_ftruncate64(unsigned int fd,
unsigned int high, unsigned int low)
{
return sys_ftruncate(fd, (loff_t)high << 32 | low);
}
asmlinkage ssize_t parisc_pread64(unsigned int fd, char *buf, size_t count,
unsigned int high, unsigned int low)
{
return sys_pread64(fd, buf, count, (loff_t)high << 32 | low);
}
asmlinkage ssize_t parisc_pwrite64(unsigned int fd, const char *buf,
size_t count, unsigned int high, unsigned int low)
{
return sys_pwrite64(fd, buf, count, (loff_t)high << 32 | low);
}
/* /*
* FIXME, please remove this crap as soon as possible * FIXME, please remove this crap as soon as possible
* *
......
...@@ -2743,20 +2743,8 @@ asmlinkage long sys32_msgrcv(int msqid, ...@@ -2743,20 +2743,8 @@ asmlinkage long sys32_msgrcv(int msqid,
/* LFS */ /* LFS */
extern asmlinkage long sys_truncate(const char *, loff_t);
extern asmlinkage long sys_ftruncate(unsigned int, loff_t);
extern asmlinkage long sys_fcntl(unsigned int, unsigned int, unsigned long); extern asmlinkage long sys_fcntl(unsigned int, unsigned int, unsigned long);
asmlinkage long sys32_truncate64(const char * path, unsigned int high, unsigned int low)
{
return sys_truncate(path, (loff_t)high << 32 | low);
}
asmlinkage long sys32_ftruncate64(unsigned int fd, unsigned int high, unsigned int low)
{
return sys_ftruncate(fd, (loff_t)high << 32 | low);
}
asmlinkage long sys32_fcntl64(unsigned int fd, unsigned int cmd, unsigned long arg) asmlinkage long sys32_fcntl64(unsigned int fd, unsigned int cmd, unsigned long arg)
{ {
switch (cmd) { switch (cmd) {
......
...@@ -331,10 +331,12 @@ tracesys_sigexit: ...@@ -331,10 +331,12 @@ tracesys_sigexit:
#define ENTRY_SAME(_name_) .dword sys_##_name_ #define ENTRY_SAME(_name_) .dword sys_##_name_
#define ENTRY_DIFF(_name_) .dword sys32_##_name_ #define ENTRY_DIFF(_name_) .dword sys32_##_name_
#define ENTRY_UHOH(_name_) .dword sys32_##unimplemented #define ENTRY_UHOH(_name_) .dword sys32_##unimplemented
#define ENTRY_OURS(_name_) .dword parisc_##_name_
#else #else
#define ENTRY_SAME(_name_) .word sys_##_name_ #define ENTRY_SAME(_name_) .word sys_##_name_
#define ENTRY_DIFF(_name_) .word sys_##_name_ #define ENTRY_DIFF(_name_) .word sys_##_name_
#define ENTRY_UHOH(_name_) .word sys_##_name_ #define ENTRY_UHOH(_name_) .word sys_##_name_
#define ENTRY_OURS(_name_) .word parisc_##_name_
#endif #endif
.align 8 .align 8
...@@ -398,7 +400,7 @@ sys_call_table: ...@@ -398,7 +400,7 @@ sys_call_table:
/* struct sockaddr... */ /* struct sockaddr... */
ENTRY_SAME(getsockname) ENTRY_SAME(getsockname)
/* it seems possible brk() could return a >4G pointer... */ /* it seems possible brk() could return a >4G pointer... */
ENTRY_SAME(brk) /* 45 */ ENTRY_SAME(brk) /* 45 */
ENTRY_SAME(setgid) ENTRY_SAME(setgid)
ENTRY_SAME(getgid) ENTRY_SAME(getgid)
ENTRY_SAME(signal) ENTRY_SAME(signal)
...@@ -476,8 +478,8 @@ sys_call_table: ...@@ -476,8 +478,8 @@ sys_call_table:
ENTRY_DIFF(getitimer) /* 105 */ ENTRY_DIFF(getitimer) /* 105 */
ENTRY_SAME(capget) ENTRY_SAME(capget)
ENTRY_SAME(capset) ENTRY_SAME(capset)
ENTRY_SAME(pread64) ENTRY_OURS(pread64)
ENTRY_SAME(pwrite64) ENTRY_OURS(pwrite64)
ENTRY_SAME(getcwd) /* 110 */ ENTRY_SAME(getcwd) /* 110 */
ENTRY_SAME(vhangup) ENTRY_SAME(vhangup)
ENTRY_SAME(fstat64) ENTRY_SAME(fstat64)
...@@ -592,18 +594,18 @@ sys_call_table: ...@@ -592,18 +594,18 @@ sys_call_table:
ENTRY_SAME(shmat_wrapper) ENTRY_SAME(shmat_wrapper)
ENTRY_SAME(shmdt) ENTRY_SAME(shmdt)
ENTRY_SAME(shmget) ENTRY_SAME(shmget)
ENTRY_SAME(shmctl_broken) /* 195 */ ENTRY_SAME(shmctl_broken) /* 195 */
ENTRY_SAME(ni_syscall) /* streams1 */ ENTRY_SAME(ni_syscall) /* streams1 */
ENTRY_SAME(ni_syscall) /* streams2 */ ENTRY_SAME(ni_syscall) /* streams2 */
ENTRY_SAME(lstat64) ENTRY_SAME(lstat64)
ENTRY_DIFF(truncate64) ENTRY_OURS(truncate64)
ENTRY_DIFF(ftruncate64) /* 200 */ ENTRY_OURS(ftruncate64) /* 200 */
ENTRY_SAME(getdents64) ENTRY_SAME(getdents64)
ENTRY_DIFF(fcntl64) ENTRY_DIFF(fcntl64)
#ifdef CONFIG_XFS_FS #ifdef CONFIG_XFS_FS
ENTRY_SAME(attrctl) ENTRY_SAME(attrctl)
ENTRY_SAME(acl_get) ENTRY_SAME(acl_get)
ENTRY_SAME(acl_set) /* 205 */ ENTRY_SAME(acl_set) /* 205 */
#else #else
ENTRY_SAME(ni_syscall) ENTRY_SAME(ni_syscall)
ENTRY_SAME(ni_syscall) ENTRY_SAME(ni_syscall)
......
# #
# Makefile for parisc-specific library files.. # Makefile for parisc-specific library files
# #
L_TARGET = lib.a
obj-y := lusercopy.o bitops.o checksum.o io.o memset.o obj-y := lusercopy.o bitops.o checksum.o io.o memset.o
include $(TOPDIR)/Rules.make
# #
# Makefile for the linux/parisc floating point code # Makefile for the linux/parisc floating point code
# #
# Note! Dependencies are done automagically by 'make dep', which also
# removes any old dependencies. DON'T put your own dependencies here
# unless it's something special (ie not a .c file).
#
# Note 2! The CFLAGS definition is now in the main makefile...
obj-y := frnd.o driver.o decode_exc.o fpudispatch.o denormal.o \ obj-y := frnd.o driver.o decode_exc.o fpudispatch.o denormal.o \
dfmpy.o sfmpy.o sfsqrt.o dfsqrt.o dfadd.o fmpyfadd.o \ dfmpy.o sfmpy.o sfsqrt.o dfsqrt.o dfadd.o fmpyfadd.o \
...@@ -16,6 +11,4 @@ obj-y := frnd.o driver.o decode_exc.o fpudispatch.o denormal.o \ ...@@ -16,6 +11,4 @@ obj-y := frnd.o driver.o decode_exc.o fpudispatch.o denormal.o \
# Math emulation code beyond the FRND is required for 712/80i and # Math emulation code beyond the FRND is required for 712/80i and
# other very old or stripped-down PA-RISC CPUs -- not currently supported # other very old or stripped-down PA-RISC CPUs -- not currently supported
obj-$CONFIG_MATH_EMULATION += unimplemented-math-emulation.o obj-$(CONFIG_MATH_EMULATION) += unimplemented-math-emulation.o
include $(TOPDIR)/Rules.make
# #
# Makefile for the linux parisc-specific parts of the memory manager. # Makefile for arch/parisc/mm
# #
obj-y := init.o fault.o extable.o ioremap.o obj-y := init.o fault.o extable.o ioremap.o
include $(TOPDIR)/Rules.make
...@@ -93,7 +93,6 @@ ...@@ -93,7 +93,6 @@
#include <asm/irq.h> #include <asm/irq.h>
#include <asm/pdc.h> #include <asm/pdc.h>
#include <asm/gsc.h>
#include <asm/cache.h> #include <asm/cache.h>
static char version[] __devinitdata = static char version[] __devinitdata =
......
/* $Id: dma.h,v 1.1 2002/07/20 15:52:25 rhirst Exp $ /* $Id: dma.h,v 1.2 1999/04/27 00:46:18 deller Exp $
* linux/include/asm/dma.h: Defines for using and allocating dma channels. * linux/include/asm/dma.h: Defines for using and allocating dma channels.
* Written by Hennus Bergman, 1992. * Written by Hennus Bergman, 1992.
* High DMA channel support & info by Hannu Savolainen * High DMA channel support & info by Hannu Savolainen
...@@ -177,11 +177,7 @@ static __inline__ void set_dma_count(unsigned int dmanr, unsigned int count) ...@@ -177,11 +177,7 @@ static __inline__ void set_dma_count(unsigned int dmanr, unsigned int count)
} }
#define free_dma(dmanr)
/* These are in kernel/dma.c: */
extern int request_dma(unsigned int dmanr, const char * device_id); /* reserve a DMA channel */
extern void free_dma(unsigned int dmanr); /* release it again */
extern int get_dma_list(char *buf); /* proc/dma support */
#ifdef CONFIG_PCI #ifdef CONFIG_PCI
extern int isa_dma_bridge_buggy; extern int isa_dma_bridge_buggy;
......
#ifndef ASM_PARISC_GSC_H
#define ASM_PARISC_GSC_H
#ifdef __KERNEL__
#include <linux/types.h>
#include <asm/io.h> /* temporary for __raw_{read,write} */
/* Please, call ioremap and use {read,write}[bwl] instead. These functions
* are not very fast.
*/
#define gsc_readb(x) __raw_readb((unsigned long)x)
#define gsc_readw(x) __raw_readw((unsigned long)x)
#define gsc_readl(x) __raw_readl((unsigned long)x)
#define gsc_writeb(x, y) __raw_writeb(x, (unsigned long)y)
#define gsc_writew(x, y) __raw_writew(x, (unsigned long)y)
#define gsc_writel(x, y) __raw_writel(x, (unsigned long)y)
struct gsc_irq {
unsigned long txn_addr; /* IRQ "target" */
int txn_data; /* HW "IRQ" */
int irq; /* virtual IRQ */
};
/* PA I/O Architected devices support at least 5 bits in the EIM register. */
#define GSC_EIM_WIDTH 5
extern int gsc_alloc_irq(struct gsc_irq *dev); /* dev needs an irq */
extern int gsc_claim_irq(struct gsc_irq *dev, int irq); /* dev needs this irq */
#endif /* __KERNEL__ */
#endif /* LINUX_GSC_H */
...@@ -182,6 +182,18 @@ extern void memset_io(unsigned long dest, char fill, int count); ...@@ -182,6 +182,18 @@ extern void memset_io(unsigned long dest, char fill, int count);
#define isa_memcpy_fromio(a,b,c) memcpy_fromio((a), EISA_BASE | (b), (c)) #define isa_memcpy_fromio(a,b,c) memcpy_fromio((a), EISA_BASE | (b), (c))
#define isa_memcpy_toio(a,b,c) memcpy_toio(EISA_BASE | (a), (b), (c)) #define isa_memcpy_toio(a,b,c) memcpy_toio(EISA_BASE | (a), (b), (c))
/*
* These functions support PA-RISC drivers which don't yet call ioremap().
* They will disappear once the last of these drivers is gone.
*/
#define gsc_readb(x) __raw_readb((unsigned long)x)
#define gsc_readw(x) __raw_readw((unsigned long)x)
#define gsc_readl(x) __raw_readl((unsigned long)x)
#define gsc_writeb(x, y) __raw_writeb(x, (unsigned long)y)
#define gsc_writew(x, y) __raw_writew(x, (unsigned long)y)
#define gsc_writel(x, y) __raw_writel(x, (unsigned long)y)
/* /*
* XXX - We don't have csum_partial_copy_fromio() yet, so we cheat here and * XXX - We don't have csum_partial_copy_fromio() yet, so we cheat here and
* just copy it. The net code will then do the checksum later. Presently * just copy it. The net code will then do the checksum later. Presently
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#define POLLWRNORM 0x0100 #define POLLWRNORM 0x0100
#define POLLWRBAND 0x0200 #define POLLWRBAND 0x0200
#define POLLMSG 0x0400 #define POLLMSG 0x0400
#define POLLREMOVE 0x1000
struct pollfd { struct pollfd {
int fd; int fd;
......
...@@ -73,10 +73,8 @@ struct system_cpuinfo_parisc { ...@@ -73,10 +73,8 @@ struct system_cpuinfo_parisc {
** Per CPU data structure - ie varies per CPU. ** Per CPU data structure - ie varies per CPU.
*/ */
struct cpuinfo_parisc { struct cpuinfo_parisc {
unsigned long it_value; /* Interval Timer at last timer Intr */
struct irq_region *region; unsigned long it_delta; /* Interval delta (tic_10ms / HZ * 100) */
unsigned long it_value; /* Interval Timer value at last timer Intr */
unsigned long it_delta; /* Interval Timer delta (tic_10ms / HZ * 100) */
unsigned long irq_count; /* number of IRQ's since boot */ unsigned long irq_count; /* number of IRQ's since boot */
unsigned long irq_max_cr16; /* longest time to handle a single IRQ */ unsigned long irq_max_cr16; /* longest time to handle a single IRQ */
unsigned long cpuid; /* aka slot_number or set to NO_PROC_ID */ unsigned long cpuid; /* aka slot_number or set to NO_PROC_ID */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment