Commit 423f8711 authored by Linus Torvalds's avatar Linus Torvalds

Merge bk://kernel.bkbits.net/davem/net-2.6

into ppc970.osdl.org:/home/torvalds/v2.6/linux
parents 02bc27cb 84e47b6a
...@@ -1945,8 +1945,8 @@ L: ultralinux@vger.kernel.org ...@@ -1945,8 +1945,8 @@ L: ultralinux@vger.kernel.org
S: Maintained S: Maintained
SPARC (sparc32): SPARC (sparc32):
P: Keith M. Wesolowski P: William L. Irwin
M: wesolows@foobazco.org M: wli@holomorphy.com
L: sparclinux@vger.kernel.org L: sparclinux@vger.kernel.org
S: Maintained S: Maintained
......
...@@ -64,52 +64,52 @@ ...@@ -64,52 +64,52 @@
/* Both these macros have to start with exactly the same insn */ /* Both these macros have to start with exactly the same insn */
#define MOVE_BIGCHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, t7) \ #define MOVE_BIGCHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, t7) \
ldd [%src + offset + 0x00], %t0; \ ldd [%src + (offset) + 0x00], %t0; \
ldd [%src + offset + 0x08], %t2; \ ldd [%src + (offset) + 0x08], %t2; \
ldd [%src + offset + 0x10], %t4; \ ldd [%src + (offset) + 0x10], %t4; \
ldd [%src + offset + 0x18], %t6; \ ldd [%src + (offset) + 0x18], %t6; \
st %t0, [%dst + offset + 0x00]; \ st %t0, [%dst + (offset) + 0x00]; \
st %t1, [%dst + offset + 0x04]; \ st %t1, [%dst + (offset) + 0x04]; \
st %t2, [%dst + offset + 0x08]; \ st %t2, [%dst + (offset) + 0x08]; \
st %t3, [%dst + offset + 0x0c]; \ st %t3, [%dst + (offset) + 0x0c]; \
st %t4, [%dst + offset + 0x10]; \ st %t4, [%dst + (offset) + 0x10]; \
st %t5, [%dst + offset + 0x14]; \ st %t5, [%dst + (offset) + 0x14]; \
st %t6, [%dst + offset + 0x18]; \ st %t6, [%dst + (offset) + 0x18]; \
st %t7, [%dst + offset + 0x1c]; st %t7, [%dst + (offset) + 0x1c];
#define MOVE_BIGALIGNCHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, t7) \ #define MOVE_BIGALIGNCHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, t7) \
ldd [%src + offset + 0x00], %t0; \ ldd [%src + (offset) + 0x00], %t0; \
ldd [%src + offset + 0x08], %t2; \ ldd [%src + (offset) + 0x08], %t2; \
ldd [%src + offset + 0x10], %t4; \ ldd [%src + (offset) + 0x10], %t4; \
ldd [%src + offset + 0x18], %t6; \ ldd [%src + (offset) + 0x18], %t6; \
std %t0, [%dst + offset + 0x00]; \ std %t0, [%dst + (offset) + 0x00]; \
std %t2, [%dst + offset + 0x08]; \ std %t2, [%dst + (offset) + 0x08]; \
std %t4, [%dst + offset + 0x10]; \ std %t4, [%dst + (offset) + 0x10]; \
std %t6, [%dst + offset + 0x18]; std %t6, [%dst + (offset) + 0x18];
#define MOVE_LASTCHUNK(src, dst, offset, t0, t1, t2, t3) \ #define MOVE_LASTCHUNK(src, dst, offset, t0, t1, t2, t3) \
ldd [%src - offset - 0x10], %t0; \ ldd [%src - (offset) - 0x10], %t0; \
ldd [%src - offset - 0x08], %t2; \ ldd [%src - (offset) - 0x08], %t2; \
st %t0, [%dst - offset - 0x10]; \ st %t0, [%dst - (offset) - 0x10]; \
st %t1, [%dst - offset - 0x0c]; \ st %t1, [%dst - (offset) - 0x0c]; \
st %t2, [%dst - offset - 0x08]; \ st %t2, [%dst - (offset) - 0x08]; \
st %t3, [%dst - offset - 0x04]; st %t3, [%dst - (offset) - 0x04];
#define MOVE_HALFCHUNK(src, dst, offset, t0, t1, t2, t3) \ #define MOVE_HALFCHUNK(src, dst, offset, t0, t1, t2, t3) \
lduh [%src + offset + 0x00], %t0; \ lduh [%src + (offset) + 0x00], %t0; \
lduh [%src + offset + 0x02], %t1; \ lduh [%src + (offset) + 0x02], %t1; \
lduh [%src + offset + 0x04], %t2; \ lduh [%src + (offset) + 0x04], %t2; \
lduh [%src + offset + 0x06], %t3; \ lduh [%src + (offset) + 0x06], %t3; \
sth %t0, [%dst + offset + 0x00]; \ sth %t0, [%dst + (offset) + 0x00]; \
sth %t1, [%dst + offset + 0x02]; \ sth %t1, [%dst + (offset) + 0x02]; \
sth %t2, [%dst + offset + 0x04]; \ sth %t2, [%dst + (offset) + 0x04]; \
sth %t3, [%dst + offset + 0x06]; sth %t3, [%dst + (offset) + 0x06];
#define MOVE_SHORTCHUNK(src, dst, offset, t0, t1) \ #define MOVE_SHORTCHUNK(src, dst, offset, t0, t1) \
ldub [%src - offset - 0x02], %t0; \ ldub [%src - (offset) - 0x02], %t0; \
ldub [%src - offset - 0x01], %t1; \ ldub [%src - (offset) - 0x01], %t1; \
stb %t0, [%dst - offset - 0x02]; \ stb %t0, [%dst - (offset) - 0x02]; \
stb %t1, [%dst - offset - 0x01]; stb %t1, [%dst - (offset) - 0x01];
.text .text
.align 4 .align 4
......
...@@ -382,6 +382,7 @@ source "fs/Kconfig.binfmt" ...@@ -382,6 +382,7 @@ source "fs/Kconfig.binfmt"
config SUNOS_EMUL config SUNOS_EMUL
bool "SunOS binary emulation" bool "SunOS binary emulation"
depends on BINFMT_AOUT32
help help
This allows you to run most SunOS binaries. If you want to do this, This allows you to run most SunOS binaries. If you want to do this,
say Y here and place appropriate files in /usr/gnemul/sunos. See say Y here and place appropriate files in /usr/gnemul/sunos. See
...@@ -391,7 +392,7 @@ config SUNOS_EMUL ...@@ -391,7 +392,7 @@ config SUNOS_EMUL
config SOLARIS_EMUL config SOLARIS_EMUL
tristate "Solaris binary emulation (EXPERIMENTAL)" tristate "Solaris binary emulation (EXPERIMENTAL)"
depends on EXPERIMENTAL depends on SPARC32_COMPAT && EXPERIMENTAL
help help
This is experimental code which will enable you to run (many) This is experimental code which will enable you to run (many)
Solaris binaries on your SPARC Linux machine. Solaris binaries on your SPARC Linux machine.
......
...@@ -201,8 +201,6 @@ CONFIG_SUN_OPENPROMIO=m ...@@ -201,8 +201,6 @@ CONFIG_SUN_OPENPROMIO=m
CONFIG_SUN_MOSTEK_RTC=y CONFIG_SUN_MOSTEK_RTC=y
CONFIG_OBP_FLASH=m CONFIG_OBP_FLASH=m
# CONFIG_SUN_BPP is not set # CONFIG_SUN_BPP is not set
# CONFIG_SUN_VIDEOPIX is not set
# CONFIG_SUN_AURORA is not set
# #
# Memory Technology Devices (MTD) # Memory Technology Devices (MTD)
...@@ -346,10 +344,8 @@ CONFIG_SCSI_SATA_VIA=m ...@@ -346,10 +344,8 @@ CONFIG_SCSI_SATA_VIA=m
CONFIG_SCSI_SATA_VITESSE=m CONFIG_SCSI_SATA_VITESSE=m
# CONFIG_SCSI_BUSLOGIC is not set # CONFIG_SCSI_BUSLOGIC is not set
CONFIG_SCSI_DMX3191D=m CONFIG_SCSI_DMX3191D=m
# CONFIG_SCSI_EATA is not set
CONFIG_SCSI_EATA_PIO=m CONFIG_SCSI_EATA_PIO=m
# CONFIG_SCSI_FUTURE_DOMAIN is not set # CONFIG_SCSI_FUTURE_DOMAIN is not set
# CONFIG_SCSI_GDTH is not set
CONFIG_SCSI_IPS=m CONFIG_SCSI_IPS=m
CONFIG_SCSI_INIA100=m CONFIG_SCSI_INIA100=m
CONFIG_SCSI_PPA=m CONFIG_SCSI_PPA=m
...@@ -377,7 +373,7 @@ CONFIG_SCSI_QLA2XXX=y ...@@ -377,7 +373,7 @@ CONFIG_SCSI_QLA2XXX=y
# CONFIG_SCSI_QLA6312 is not set # CONFIG_SCSI_QLA6312 is not set
# CONFIG_SCSI_QLA6322 is not set # CONFIG_SCSI_QLA6322 is not set
CONFIG_SCSI_DC395x=m CONFIG_SCSI_DC395x=m
CONFIG_SCSI_DC390T=m # CONFIG_SCSI_DC390T is not set
CONFIG_SCSI_DEBUG=m CONFIG_SCSI_DEBUG=m
CONFIG_SCSI_SUNESP=y CONFIG_SCSI_SUNESP=y
...@@ -1132,12 +1128,15 @@ CONFIG_I2C_VOODOO3=m ...@@ -1132,12 +1128,15 @@ CONFIG_I2C_VOODOO3=m
# #
CONFIG_I2C_SENSOR=m CONFIG_I2C_SENSOR=m
CONFIG_SENSORS_ADM1021=m CONFIG_SENSORS_ADM1021=m
CONFIG_SENSORS_ADM1025=m
CONFIG_SENSORS_ADM1031=m
CONFIG_SENSORS_ASB100=m CONFIG_SENSORS_ASB100=m
CONFIG_SENSORS_DS1621=m CONFIG_SENSORS_DS1621=m
CONFIG_SENSORS_FSCHER=m CONFIG_SENSORS_FSCHER=m
CONFIG_SENSORS_GL518SM=m CONFIG_SENSORS_GL518SM=m
CONFIG_SENSORS_IT87=m CONFIG_SENSORS_IT87=m
CONFIG_SENSORS_LM75=m CONFIG_SENSORS_LM75=m
CONFIG_SENSORS_LM77=m
CONFIG_SENSORS_LM78=m CONFIG_SENSORS_LM78=m
CONFIG_SENSORS_LM80=m CONFIG_SENSORS_LM80=m
CONFIG_SENSORS_LM83=m CONFIG_SENSORS_LM83=m
...@@ -1240,6 +1239,7 @@ CONFIG_BEFS_FS=m ...@@ -1240,6 +1239,7 @@ CONFIG_BEFS_FS=m
# CONFIG_BEFS_DEBUG is not set # CONFIG_BEFS_DEBUG is not set
CONFIG_BFS_FS=m CONFIG_BFS_FS=m
CONFIG_EFS_FS=m CONFIG_EFS_FS=m
# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
CONFIG_CRAMFS=m CONFIG_CRAMFS=m
CONFIG_VXFS_FS=m CONFIG_VXFS_FS=m
CONFIG_HPFS_FS=m CONFIG_HPFS_FS=m
...@@ -1606,6 +1606,7 @@ CONFIG_USB_HPUSBSCSI=m ...@@ -1606,6 +1606,7 @@ CONFIG_USB_HPUSBSCSI=m
# CONFIG_USB_OV511 is not set # CONFIG_USB_OV511 is not set
CONFIG_USB_PWC=m CONFIG_USB_PWC=m
# CONFIG_USB_SE401 is not set # CONFIG_USB_SE401 is not set
CONFIG_USB_SN9C102=m
# CONFIG_USB_STV680 is not set # CONFIG_USB_STV680 is not set
CONFIG_USB_W9968CF=m CONFIG_USB_W9968CF=m
......
...@@ -1496,28 +1496,30 @@ sunos_getgid: ...@@ -1496,28 +1496,30 @@ sunos_getgid:
/* SunOS's execv() call only specifies the argv argument, the /* SunOS's execv() call only specifies the argv argument, the
* environment settings are the same as the calling processes. * environment settings are the same as the calling processes.
*/ */
.globl sunos_execv, sys_execve, sys32_execve .globl sunos_execv
sys_execve: sys_execve:
sethi %hi(sparc_execve), %g1 sethi %hi(sparc_execve), %g1
ba,pt %xcc, execve_merge ba,pt %xcc, execve_merge
or %g1, %lo(sparc_execve), %g1 or %g1, %lo(sparc_execve), %g1
#ifdef CONFIG_COMPAT
.globl sys_execve
sunos_execv: sunos_execv:
stx %g0, [%sp + PTREGS_OFF + PT_V9_I2] stx %g0, [%sp + PTREGS_OFF + PT_V9_I2]
.globl sys32_execve
sys32_execve: sys32_execve:
sethi %hi(sparc32_execve), %g1 sethi %hi(sparc32_execve), %g1
or %g1, %lo(sparc32_execve), %g1 or %g1, %lo(sparc32_execve), %g1
#endif
execve_merge: execve_merge:
flushw flushw
jmpl %g1, %g0 jmpl %g1, %g0
add %sp, PTREGS_OFF, %o0 add %sp, PTREGS_OFF, %o0
.globl sys_pipe, sys_sigpause, sys_nis_syscall .globl sys_pipe, sys_sigpause, sys_nis_syscall
.globl sys_sigsuspend, sys_rt_sigsuspend, sys32_rt_sigsuspend .globl sys_sigsuspend, sys_rt_sigsuspend
.globl sys_rt_sigreturn .globl sys_rt_sigreturn
.globl sys32_sigreturn, sys32_rt_sigreturn .globl sys_ptrace
.globl sys32_execve, sys_ptrace .globl sys_sigaltstack
.globl sys_sigaltstack, sys32_sigaltstack
.globl sys32_sigstack
.align 32 .align 32
sys_pipe: ba,pt %xcc, sparc_pipe sys_pipe: ba,pt %xcc, sparc_pipe
add %sp, PTREGS_OFF, %o0 add %sp, PTREGS_OFF, %o0
...@@ -1528,12 +1530,15 @@ sys_memory_ordering: ...@@ -1528,12 +1530,15 @@ sys_memory_ordering:
add %sp, PTREGS_OFF, %o1 add %sp, PTREGS_OFF, %o1
sys_sigaltstack:ba,pt %xcc, do_sigaltstack sys_sigaltstack:ba,pt %xcc, do_sigaltstack
add %i6, STACK_BIAS, %o2 add %i6, STACK_BIAS, %o2
#ifdef CONFIG_COMPAT
.globl sys32_sigstack
sys32_sigstack: ba,pt %xcc, do_sys32_sigstack sys32_sigstack: ba,pt %xcc, do_sys32_sigstack
mov %i6, %o2 mov %i6, %o2
.globl sys32_sigaltstack
sys32_sigaltstack: sys32_sigaltstack:
ba,pt %xcc, do_sys32_sigaltstack ba,pt %xcc, do_sys32_sigaltstack
mov %i6, %o2 mov %i6, %o2
#endif
.align 32 .align 32
sys_sigsuspend: add %sp, PTREGS_OFF, %o0 sys_sigsuspend: add %sp, PTREGS_OFF, %o0
call do_sigsuspend call do_sigsuspend
...@@ -1544,31 +1549,40 @@ sys_rt_sigsuspend: /* NOTE: %o0,%o1 have a correct value already */ ...@@ -1544,31 +1549,40 @@ sys_rt_sigsuspend: /* NOTE: %o0,%o1 have a correct value already */
call do_rt_sigsuspend call do_rt_sigsuspend
add %o7, 1f-.-4, %o7 add %o7, 1f-.-4, %o7
nop nop
#ifdef CONFIG_COMPAT
.globl sys32_rt_sigsuspend
sys32_rt_sigsuspend: /* NOTE: %o0,%o1 have a correct value already */ sys32_rt_sigsuspend: /* NOTE: %o0,%o1 have a correct value already */
srl %o0, 0, %o0 srl %o0, 0, %o0
add %sp, PTREGS_OFF, %o2 add %sp, PTREGS_OFF, %o2
call do_rt_sigsuspend32 call do_rt_sigsuspend32
add %o7, 1f-.-4, %o7 add %o7, 1f-.-4, %o7
#endif
/* NOTE: %o0 has a correct value already */ /* NOTE: %o0 has a correct value already */
sys_sigpause: add %sp, PTREGS_OFF, %o1 sys_sigpause: add %sp, PTREGS_OFF, %o1
call do_sigpause call do_sigpause
add %o7, 1f-.-4, %o7 add %o7, 1f-.-4, %o7
nop nop
#ifdef CONFIG_COMPAT
.globl sys32_sigreturn
sys32_sigreturn: sys32_sigreturn:
add %sp, PTREGS_OFF, %o0 add %sp, PTREGS_OFF, %o0
call do_sigreturn32 call do_sigreturn32
add %o7, 1f-.-4, %o7 add %o7, 1f-.-4, %o7
nop nop
#endif
sys_rt_sigreturn: sys_rt_sigreturn:
add %sp, PTREGS_OFF, %o0 add %sp, PTREGS_OFF, %o0
call do_rt_sigreturn call do_rt_sigreturn
add %o7, 1f-.-4, %o7 add %o7, 1f-.-4, %o7
nop nop
#ifdef CONFIG_COMPAT
.globl sys32_rt_sigreturn
sys32_rt_sigreturn: sys32_rt_sigreturn:
add %sp, PTREGS_OFF, %o0 add %sp, PTREGS_OFF, %o0
call do_rt_sigreturn32 call do_rt_sigreturn32
add %o7, 1f-.-4, %o7 add %o7, 1f-.-4, %o7
nop nop
#endif
sys_ptrace: add %sp, PTREGS_OFF, %o0 sys_ptrace: add %sp, PTREGS_OFF, %o0
call do_ptrace call do_ptrace
add %o7, 1f-.-4, %o7 add %o7, 1f-.-4, %o7
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include <stdarg.h> #include <stdarg.h>
#include <linux/config.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/sched.h> #include <linux/sched.h>
...@@ -28,6 +29,7 @@ ...@@ -28,6 +29,7 @@
#include <linux/config.h> #include <linux/config.h>
#include <linux/reboot.h> #include <linux/reboot.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/compat.h>
#include <linux/init.h> #include <linux/init.h>
#include <asm/oplib.h> #include <asm/oplib.h>
...@@ -588,10 +590,13 @@ asmlinkage long sparc_do_fork(unsigned long clone_flags, ...@@ -588,10 +590,13 @@ asmlinkage long sparc_do_fork(unsigned long clone_flags,
clone_flags &= ~CLONE_IDLETASK; clone_flags &= ~CLONE_IDLETASK;
#ifdef CONFIG_COMPAT
if (test_thread_flag(TIF_32BIT)) { if (test_thread_flag(TIF_32BIT)) {
parent_tid_ptr = compat_ptr(regs->u_regs[UREG_I2]); parent_tid_ptr = compat_ptr(regs->u_regs[UREG_I2]);
child_tid_ptr = compat_ptr(regs->u_regs[UREG_I4]); child_tid_ptr = compat_ptr(regs->u_regs[UREG_I4]);
} else { } else
#endif
{
parent_tid_ptr = (int __user *) regs->u_regs[UREG_I2]; parent_tid_ptr = (int __user *) regs->u_regs[UREG_I2];
child_tid_ptr = (int __user *) regs->u_regs[UREG_I4]; child_tid_ptr = (int __user *) regs->u_regs[UREG_I4];
} }
......
...@@ -28,10 +28,10 @@ ...@@ -28,10 +28,10 @@
* *
* On SYSIO, using an 8K page size we have 1GB of SBUS * On SYSIO, using an 8K page size we have 1GB of SBUS
* DMA space mapped. We divide this space into equally * DMA space mapped. We divide this space into equally
* sized clusters. Currently we allow clusters up to a * sized clusters. We allocate a DMA mapping from the
* size of 1MB. If anything begins to generate DMA * cluster that matches the order of the allocation, or
* mapping requests larger than this we will need to * if the order is greater than the number of clusters,
* increase things a bit. * we try to allocate from the last cluster.
*/ */
#define NCLUSTERS 8UL #define NCLUSTERS 8UL
...@@ -134,12 +134,17 @@ static void strbuf_flush(struct sbus_iommu *iommu, u32 base, unsigned long npage ...@@ -134,12 +134,17 @@ static void strbuf_flush(struct sbus_iommu *iommu, u32 base, unsigned long npage
static iopte_t *alloc_streaming_cluster(struct sbus_iommu *iommu, unsigned long npages) static iopte_t *alloc_streaming_cluster(struct sbus_iommu *iommu, unsigned long npages)
{ {
iopte_t *iopte, *limit, *first; iopte_t *iopte, *limit, *first, *cluster;
unsigned long cnum, ent, flush_point; unsigned long cnum, ent, nent, flush_point, found;
cnum = 0; cnum = 0;
nent = 1;
while ((1UL << cnum) < npages) while ((1UL << cnum) < npages)
cnum++; cnum++;
if(cnum >= NCLUSTERS) {
nent = 1UL << (cnum - NCLUSTERS);
cnum = NCLUSTERS - 1;
}
iopte = iommu->page_table + (cnum * CLUSTER_NPAGES); iopte = iommu->page_table + (cnum * CLUSTER_NPAGES);
if (cnum == 0) if (cnum == 0)
...@@ -152,22 +157,31 @@ static iopte_t *alloc_streaming_cluster(struct sbus_iommu *iommu, unsigned long ...@@ -152,22 +157,31 @@ static iopte_t *alloc_streaming_cluster(struct sbus_iommu *iommu, unsigned long
flush_point = iommu->alloc_info[cnum].flush; flush_point = iommu->alloc_info[cnum].flush;
first = iopte; first = iopte;
cluster = NULL;
found = 0;
for (;;) { for (;;) {
if (iopte_val(*iopte) == 0UL) { if (iopte_val(*iopte) == 0UL) {
if ((iopte + (1 << cnum)) >= limit) found++;
ent = 0; if (!cluster)
else cluster = iopte;
ent = ent + 1; } else {
iommu->alloc_info[cnum].next = ent; /* Used cluster in the way */
if (ent == flush_point) cluster = NULL;
__iommu_flushall(iommu); found = 0;
break;
} }
if (found == nent)
break;
iopte += (1 << cnum); iopte += (1 << cnum);
ent++; ent++;
if (iopte >= limit) { if (iopte >= limit) {
iopte = (iommu->page_table + (cnum * CLUSTER_NPAGES)); iopte = (iommu->page_table + (cnum * CLUSTER_NPAGES));
ent = 0; ent = 0;
/* Multiple cluster allocations must not wrap */
cluster = NULL;
found = 0;
} }
if (ent == flush_point) if (ent == flush_point)
__iommu_flushall(iommu); __iommu_flushall(iommu);
...@@ -175,8 +189,19 @@ static iopte_t *alloc_streaming_cluster(struct sbus_iommu *iommu, unsigned long ...@@ -175,8 +189,19 @@ static iopte_t *alloc_streaming_cluster(struct sbus_iommu *iommu, unsigned long
goto bad; goto bad;
} }
/* ent/iopte points to the last cluster entry we're going to use,
* so save our place for the next allocation.
*/
if ((iopte + (1 << cnum)) >= limit)
ent = 0;
else
ent = ent + 1;
iommu->alloc_info[cnum].next = ent;
if (ent == flush_point)
__iommu_flushall(iommu);
/* I've got your streaming cluster right here buddy boy... */ /* I've got your streaming cluster right here buddy boy... */
return iopte; return cluster;
bad: bad:
printk(KERN_EMERG "sbus: alloc_streaming_cluster of npages(%ld) failed!\n", printk(KERN_EMERG "sbus: alloc_streaming_cluster of npages(%ld) failed!\n",
...@@ -186,15 +211,23 @@ static iopte_t *alloc_streaming_cluster(struct sbus_iommu *iommu, unsigned long ...@@ -186,15 +211,23 @@ static iopte_t *alloc_streaming_cluster(struct sbus_iommu *iommu, unsigned long
static void free_streaming_cluster(struct sbus_iommu *iommu, u32 base, unsigned long npages) static void free_streaming_cluster(struct sbus_iommu *iommu, u32 base, unsigned long npages)
{ {
unsigned long cnum, ent; unsigned long cnum, ent, nent;
iopte_t *iopte; iopte_t *iopte;
cnum = 0; cnum = 0;
nent = 1;
while ((1UL << cnum) < npages) while ((1UL << cnum) < npages)
cnum++; cnum++;
if(cnum >= NCLUSTERS) {
nent = 1UL << (cnum - NCLUSTERS);
cnum = NCLUSTERS - 1;
}
ent = (base & CLUSTER_MASK) >> (IO_PAGE_SHIFT + cnum); ent = (base & CLUSTER_MASK) >> (IO_PAGE_SHIFT + cnum);
iopte = iommu->page_table + ((base - MAP_BASE) >> IO_PAGE_SHIFT); iopte = iommu->page_table + ((base - MAP_BASE) >> IO_PAGE_SHIFT);
do {
iopte_val(*iopte) = 0UL; iopte_val(*iopte) = 0UL;
iopte += 1 << cnum;
} while(--nent);
/* If the global flush might not have caught this entry, /* If the global flush might not have caught this entry,
* adjust the flush point such that we will flush before * adjust the flush point such that we will flush before
......
...@@ -350,9 +350,10 @@ EXPORT_SYMBOL(csum_partial); ...@@ -350,9 +350,10 @@ EXPORT_SYMBOL(csum_partial);
EXPORT_SYMBOL(csum_partial_copy_sparc64); EXPORT_SYMBOL(csum_partial_copy_sparc64);
EXPORT_SYMBOL(ip_fast_csum); EXPORT_SYMBOL(ip_fast_csum);
/* Moving data to/from userspace. */ /* Moving data to/from/in userspace. */
EXPORT_SYMBOL(__copy_to_user); EXPORT_SYMBOL(__copy_to_user);
EXPORT_SYMBOL(__copy_from_user); EXPORT_SYMBOL(__copy_from_user);
EXPORT_SYMBOL(__copy_in_user);
EXPORT_SYMBOL(__strncpy_from_user); EXPORT_SYMBOL(__strncpy_from_user);
EXPORT_SYMBOL(__bzero_noasi); EXPORT_SYMBOL(__bzero_noasi);
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
.text .text
.align 4 .align 4
#ifdef CONFIG_COMPAT
/* First, the 32-bit Linux native syscall table. */ /* First, the 32-bit Linux native syscall table. */
.globl sys_call_table32 .globl sys_call_table32
...@@ -77,6 +78,8 @@ sys_call_table32: ...@@ -77,6 +78,8 @@ sys_call_table32:
.word sys_mq_timedsend, sys_mq_timedreceive, compat_sys_mq_notify, compat_sys_mq_getsetattr, sys_ni_syscall .word sys_mq_timedsend, sys_mq_timedreceive, compat_sys_mq_notify, compat_sys_mq_getsetattr, sys_ni_syscall
/*280*/ .word sys_ni_syscall, sys_ni_syscall, sys_ni_syscall /*280*/ .word sys_ni_syscall, sys_ni_syscall, sys_ni_syscall
#endif /* CONFIG_COMPAT */
/* Now the 64-bit native Linux syscall table. */ /* Now the 64-bit native Linux syscall table. */
.align 4 .align 4
...@@ -85,7 +88,7 @@ sys_call_table64: ...@@ -85,7 +88,7 @@ sys_call_table64:
sys_call_table: sys_call_table:
/*0*/ .word sys_restart_syscall, sparc_exit, sys_fork, sys_read, sys_write /*0*/ .word sys_restart_syscall, sparc_exit, sys_fork, sys_read, sys_write
/*5*/ .word sys_open, sys_close, sys_wait4, sys_creat, sys_link /*5*/ .word sys_open, sys_close, sys_wait4, sys_creat, sys_link
/*10*/ .word sys_unlink, sunos_execv, sys_chdir, sys_chown, sys_mknod /*10*/ .word sys_unlink, sys_nis_syscall, sys_chdir, sys_chown, sys_mknod
/*15*/ .word sys_chmod, sys_lchown, sparc_brk, sys_perfctr, sys_lseek /*15*/ .word sys_chmod, sys_lchown, sparc_brk, sys_perfctr, sys_lseek
/*20*/ .word sys_getpid, sys_capget, sys_capset, sys_setuid, sys_getuid /*20*/ .word sys_getpid, sys_capget, sys_capset, sys_setuid, sys_getuid
/*25*/ .word sys_nis_syscall, sys_ptrace, sys_alarm, sys_sigaltstack, sys_nis_syscall /*25*/ .word sys_nis_syscall, sys_ptrace, sys_alarm, sys_sigaltstack, sys_nis_syscall
......
...@@ -154,6 +154,13 @@ static inline void pcibios_add_platform_entries(struct pci_dev *dev) ...@@ -154,6 +154,13 @@ static inline void pcibios_add_platform_entries(struct pci_dev *dev)
{ {
} }
#define PCI_DMA_ERROR_CODE (~(dma_addr_t)0x0)
static inline int pci_dma_mapping_error(dma_addr_t dma_addr)
{
return (dma_addr == PCI_DMA_ERROR_CODE);
}
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
/* generic pci stuff */ /* generic pci stuff */
......
...@@ -14,8 +14,11 @@ ...@@ -14,8 +14,11 @@
#ifdef __KERNEL__ #ifdef __KERNEL__
#include <linux/config.h>
#include <linux/compat.h> #include <linux/compat.h>
#ifdef CONFIG_COMPAT
typedef union sigval32 { typedef union sigval32 {
int sival_int; int sival_int;
u32 sival_ptr; u32 sival_ptr;
...@@ -72,6 +75,7 @@ typedef struct siginfo32 { ...@@ -72,6 +75,7 @@ typedef struct siginfo32 {
} _sigpoll; } _sigpoll;
} _sifields; } _sifields;
} siginfo_t32; } siginfo_t32;
#endif /* CONFIG_COMPAT */
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
...@@ -85,6 +89,8 @@ typedef struct siginfo32 { ...@@ -85,6 +89,8 @@ typedef struct siginfo32 {
#ifdef __KERNEL__ #ifdef __KERNEL__
#ifdef CONFIG_COMPAT
typedef struct sigevent32 { typedef struct sigevent32 {
sigval_t32 sigev_value; sigval_t32 sigev_value;
int sigev_signo; int sigev_signo;
...@@ -101,6 +107,8 @@ typedef struct sigevent32 { ...@@ -101,6 +107,8 @@ typedef struct sigevent32 {
extern int copy_siginfo_to_user32(siginfo_t32 __user *to, siginfo_t *from); extern int copy_siginfo_to_user32(siginfo_t32 __user *to, siginfo_t *from);
#endif /* CONFIG_COMPAT */
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
#endif #endif
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#ifdef __KERNEL__ #ifdef __KERNEL__
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
#include <linux/config.h>
#include <linux/personality.h> #include <linux/personality.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/compat.h> #include <linux/compat.h>
...@@ -208,12 +209,15 @@ struct __new_sigaction { ...@@ -208,12 +209,15 @@ struct __new_sigaction {
}; };
#ifdef __KERNEL__ #ifdef __KERNEL__
#ifdef CONFIG_COMPAT
struct __new_sigaction32 { struct __new_sigaction32 {
unsigned sa_handler; unsigned sa_handler;
unsigned int sa_flags; unsigned int sa_flags;
unsigned sa_restorer; /* not used by Linux/SPARC yet */ unsigned sa_restorer; /* not used by Linux/SPARC yet */
compat_sigset_t sa_mask; compat_sigset_t sa_mask;
}; };
#endif
struct k_sigaction { struct k_sigaction {
struct __new_sigaction sa; struct __new_sigaction sa;
...@@ -229,6 +233,8 @@ struct __old_sigaction { ...@@ -229,6 +233,8 @@ struct __old_sigaction {
}; };
#ifdef __KERNEL__ #ifdef __KERNEL__
#ifdef CONFIG_COMPAT
struct __old_sigaction32 { struct __old_sigaction32 {
unsigned sa_handler; unsigned sa_handler;
compat_old_sigset_t sa_mask; compat_old_sigset_t sa_mask;
...@@ -237,6 +243,8 @@ struct __old_sigaction32 { ...@@ -237,6 +243,8 @@ struct __old_sigaction32 {
}; };
#endif #endif
#endif
typedef struct sigaltstack { typedef struct sigaltstack {
void __user *ss_sp; void __user *ss_sp;
int ss_flags; int ss_flags;
...@@ -244,11 +252,14 @@ typedef struct sigaltstack { ...@@ -244,11 +252,14 @@ typedef struct sigaltstack {
} stack_t; } stack_t;
#ifdef __KERNEL__ #ifdef __KERNEL__
#ifdef CONFIG_COMPAT
typedef struct sigaltstack32 { typedef struct sigaltstack32 {
u32 ss_sp; u32 ss_sp;
int ss_flags; int ss_flags;
compat_size_t ss_size; compat_size_t ss_size;
} stack_t32; } stack_t32;
#endif
struct signal_deliver_cookie { struct signal_deliver_cookie {
int restart_syscall; int restart_syscall;
......
...@@ -123,7 +123,11 @@ ...@@ -123,7 +123,11 @@
#else #else
#define SUNOS_SYSCALL_TRAP TRAP(sunos_syscall) #define SUNOS_SYSCALL_TRAP TRAP(sunos_syscall)
#endif #endif
#ifdef CONFIG_COMPAT
#define LINUX_32BIT_SYSCALL_TRAP SYSCALL_TRAP(linux_sparc_syscall32, sys_call_table32) #define LINUX_32BIT_SYSCALL_TRAP SYSCALL_TRAP(linux_sparc_syscall32, sys_call_table32)
#else
#define LINUX_32BIT_SYSCALL_TRAP BTRAP(0x110)
#endif
#define LINUX_64BIT_SYSCALL_TRAP SYSCALL_TRAP(linux_sparc_syscall, sys_call_table64) #define LINUX_64BIT_SYSCALL_TRAP SYSCALL_TRAP(linux_sparc_syscall, sys_call_table64)
#define GETCC_TRAP TRAP(getcc) #define GETCC_TRAP TRAP(getcc)
#define SETCC_TRAP TRAP(setcc) #define SETCC_TRAP TRAP(setcc)
......
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