diff options
| author | Chris Metcalf <cmetcalf@tilera.com> | 2010-06-25 17:00:56 -0400 |
|---|---|---|
| committer | Chris Metcalf <cmetcalf@tilera.com> | 2010-07-06 13:34:15 -0400 |
| commit | 9f9c0382cda2334b35b40b00f4ed9d6f89f37a7b (patch) | |
| tree | 8d862fd0883343e8788f86b8f7d37823db0e19a5 | |
| parent | fb702b942bf638baa6cbbbda9f76794db62921ef (diff) | |
arch/tile: Add driver to enable access to the user dynamic network.
This network (the "UDN") connects all the cpus on the chip in a
wormhole-routed dynamic network. Subrectangles of the chip can
be allocated by a "create" ioctl on /dev/hardwall, and then to access the
UDN in that rectangle, tasks must perform an "activate" ioctl on that
same file object after affinitizing themselves to a single cpu in
the region. Sending a wormhole-routed message that tries to leave
that subrectangle causes all activated tasks to receive a SIGILL
(just as they would if they tried to access the UDN without first
activating themselves to a hardwall rectangle).
The original submission of this code to LKML had the driver
instantiated under /proc/tile/hardwall. Now we just use a character
device for this, conventionally /dev/hardwall. Some futures planning
for the TILE-Gx chip suggests that we may want to have other types of
devices that share the general model of "bind a task to a cpu, then
'activate' a file descriptor on a pseudo-device that gives access to
some hardware resource". As such, we are using a device rather
than, for example, a syscall, to set up and activate this code.
As part of this change, the compat_ptr() declaration was fixed and used
to pass the compat_ioctl argument to the normal ioctl. So far we limit
compat code to 2GB, so the difference between zero-extend and sign-extend
(the latter being correct, eventually) had been overlooked.
Signed-off-by: Chris Metcalf <cmetcalf@tilera.com>
Acked-by: Arnd Bergmann <arnd@arndb.de>
| -rw-r--r-- | arch/tile/Kconfig | 4 | ||||
| -rw-r--r-- | arch/tile/include/asm/compat.h | 2 | ||||
| -rw-r--r-- | arch/tile/include/asm/hardwall.h | 56 | ||||
| -rw-r--r-- | arch/tile/include/asm/processor.h | 17 | ||||
| -rw-r--r-- | arch/tile/kernel/Makefile | 1 | ||||
| -rw-r--r-- | arch/tile/kernel/hardwall.c | 794 | ||||
| -rw-r--r-- | arch/tile/kernel/intvec_32.S | 6 |
7 files changed, 874 insertions, 6 deletions
diff --git a/arch/tile/Kconfig b/arch/tile/Kconfig index 290ef4161939..1eb308cb711a 100644 --- a/arch/tile/Kconfig +++ b/arch/tile/Kconfig | |||
| @@ -310,6 +310,10 @@ config VMALLOC_RESERVE | |||
| 310 | hex | 310 | hex |
| 311 | default 0x1000000 | 311 | default 0x1000000 |
| 312 | 312 | ||
| 313 | config HARDWALL | ||
| 314 | bool "Hardwall support to allow access to user dynamic network" | ||
| 315 | default y | ||
| 316 | |||
| 313 | endmenu # Tilera-specific configuration | 317 | endmenu # Tilera-specific configuration |
| 314 | 318 | ||
| 315 | menu "Bus options" | 319 | menu "Bus options" |
diff --git a/arch/tile/include/asm/compat.h b/arch/tile/include/asm/compat.h index e133c53f6c4f..b09292bcc19f 100644 --- a/arch/tile/include/asm/compat.h +++ b/arch/tile/include/asm/compat.h | |||
| @@ -222,7 +222,7 @@ struct compat_shmid64_ds { | |||
| 222 | 222 | ||
| 223 | static inline void __user *compat_ptr(compat_uptr_t uptr) | 223 | static inline void __user *compat_ptr(compat_uptr_t uptr) |
| 224 | { | 224 | { |
| 225 | return (void __user *)(unsigned long)uptr; | 225 | return (void __user *)(long)(s32)uptr; |
| 226 | } | 226 | } |
| 227 | 227 | ||
| 228 | static inline compat_uptr_t ptr_to_compat(void __user *uptr) | 228 | static inline compat_uptr_t ptr_to_compat(void __user *uptr) |
diff --git a/arch/tile/include/asm/hardwall.h b/arch/tile/include/asm/hardwall.h new file mode 100644 index 000000000000..0bed3ec7b42c --- /dev/null +++ b/arch/tile/include/asm/hardwall.h | |||
| @@ -0,0 +1,56 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2010 Tilera Corporation. All Rights Reserved. | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or | ||
| 5 | * modify it under the terms of the GNU General Public License | ||
| 6 | * as published by the Free Software Foundation, version 2. | ||
| 7 | * | ||
| 8 | * This program is distributed in the hope that it will be useful, but | ||
| 9 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 10 | * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or | ||
| 11 | * NON INFRINGEMENT. See the GNU General Public License for | ||
| 12 | * more details. | ||
| 13 | * | ||
| 14 | * Provide methods for the HARDWALL_FILE for accessing the UDN. | ||
| 15 | */ | ||
| 16 | |||
| 17 | #ifndef _ASM_TILE_HARDWALL_H | ||
| 18 | #define _ASM_TILE_HARDWALL_H | ||
| 19 | |||
| 20 | #include <linux/ioctl.h> | ||
| 21 | |||
| 22 | #define HARDWALL_IOCTL_BASE 0xa2 | ||
| 23 | |||
| 24 | /* | ||
| 25 | * The HARDWALL_CREATE() ioctl is a macro with a "size" argument. | ||
| 26 | * The resulting ioctl value is passed to the kernel in conjunction | ||
| 27 | * with a pointer to a little-endian bitmask of cpus, which must be | ||
| 28 | * physically in a rectangular configuration on the chip. | ||
| 29 | * The "size" is the number of bytes of cpu mask data. | ||
| 30 | */ | ||
| 31 | #define _HARDWALL_CREATE 1 | ||
| 32 | #define HARDWALL_CREATE(size) \ | ||
| 33 | _IOC(_IOC_READ, HARDWALL_IOCTL_BASE, _HARDWALL_CREATE, (size)) | ||
| 34 | |||
| 35 | #define _HARDWALL_ACTIVATE 2 | ||
| 36 | #define HARDWALL_ACTIVATE \ | ||
| 37 | _IO(HARDWALL_IOCTL_BASE, _HARDWALL_ACTIVATE) | ||
| 38 | |||
| 39 | #define _HARDWALL_DEACTIVATE 3 | ||
| 40 | #define HARDWALL_DEACTIVATE \ | ||
| 41 | _IO(HARDWALL_IOCTL_BASE, _HARDWALL_DEACTIVATE) | ||
| 42 | |||
| 43 | #ifndef __KERNEL__ | ||
| 44 | |||
| 45 | /* This is the canonical name expected by userspace. */ | ||
| 46 | #define HARDWALL_FILE "/dev/hardwall" | ||
| 47 | |||
| 48 | #else | ||
| 49 | |||
| 50 | /* Hook for /proc/tile/hardwall. */ | ||
| 51 | struct seq_file; | ||
| 52 | int proc_tile_hardwall_show(struct seq_file *sf, void *v); | ||
| 53 | |||
| 54 | #endif | ||
| 55 | |||
| 56 | #endif /* _ASM_TILE_HARDWALL_H */ | ||
diff --git a/arch/tile/include/asm/processor.h b/arch/tile/include/asm/processor.h index 96c50d2c4c2b..09584e263b00 100644 --- a/arch/tile/include/asm/processor.h +++ b/arch/tile/include/asm/processor.h | |||
| @@ -21,6 +21,7 @@ | |||
| 21 | * NOTE: we don't include <linux/ptrace.h> or <linux/percpu.h> as one | 21 | * NOTE: we don't include <linux/ptrace.h> or <linux/percpu.h> as one |
| 22 | * normally would, due to #include dependencies. | 22 | * normally would, due to #include dependencies. |
| 23 | */ | 23 | */ |
| 24 | #include <linux/types.h> | ||
| 24 | #include <asm/ptrace.h> | 25 | #include <asm/ptrace.h> |
| 25 | #include <asm/percpu.h> | 26 | #include <asm/percpu.h> |
| 26 | 27 | ||
| @@ -29,7 +30,6 @@ | |||
| 29 | 30 | ||
| 30 | struct task_struct; | 31 | struct task_struct; |
| 31 | struct thread_struct; | 32 | struct thread_struct; |
| 32 | struct list_head; | ||
| 33 | 33 | ||
| 34 | typedef struct { | 34 | typedef struct { |
| 35 | unsigned long seg; | 35 | unsigned long seg; |
| @@ -74,6 +74,9 @@ struct async_tlb { | |||
| 74 | unsigned long address; /* what address faulted? */ | 74 | unsigned long address; /* what address faulted? */ |
| 75 | }; | 75 | }; |
| 76 | 76 | ||
| 77 | #ifdef CONFIG_HARDWALL | ||
| 78 | struct hardwall_info; | ||
| 79 | #endif | ||
| 77 | 80 | ||
| 78 | struct thread_struct { | 81 | struct thread_struct { |
| 79 | /* kernel stack pointer */ | 82 | /* kernel stack pointer */ |
| @@ -100,6 +103,12 @@ struct thread_struct { | |||
| 100 | /* Any other miscellaneous processor state bits */ | 103 | /* Any other miscellaneous processor state bits */ |
| 101 | unsigned long proc_status; | 104 | unsigned long proc_status; |
| 102 | #endif | 105 | #endif |
| 106 | #ifdef CONFIG_HARDWALL | ||
| 107 | /* Is this task tied to an activated hardwall? */ | ||
| 108 | struct hardwall_info *hardwall; | ||
| 109 | /* Chains this task into the list at hardwall->list. */ | ||
| 110 | struct list_head hardwall_list; | ||
| 111 | #endif | ||
| 103 | #if CHIP_HAS_TILE_DMA() | 112 | #if CHIP_HAS_TILE_DMA() |
| 104 | /* Async DMA TLB fault information */ | 113 | /* Async DMA TLB fault information */ |
| 105 | struct async_tlb dma_async_tlb; | 114 | struct async_tlb dma_async_tlb; |
| @@ -194,8 +203,6 @@ static inline void release_thread(struct task_struct *dead_task) | |||
| 194 | 203 | ||
| 195 | extern int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags); | 204 | extern int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags); |
| 196 | 205 | ||
| 197 | /* Helper routines for setting home cache modes at exec() time. */ | ||
| 198 | |||
| 199 | 206 | ||
| 200 | /* | 207 | /* |
| 201 | * Return saved (kernel) PC of a blocked thread. | 208 | * Return saved (kernel) PC of a blocked thread. |
| @@ -240,6 +247,10 @@ struct siginfo; | |||
| 240 | extern void arch_coredump_signal(struct siginfo *, struct pt_regs *); | 247 | extern void arch_coredump_signal(struct siginfo *, struct pt_regs *); |
| 241 | #define arch_coredump_signal arch_coredump_signal | 248 | #define arch_coredump_signal arch_coredump_signal |
| 242 | 249 | ||
| 250 | /* Info on this processor (see fs/proc/cpuinfo.c) */ | ||
| 251 | struct seq_operations; | ||
| 252 | extern const struct seq_operations cpuinfo_op; | ||
| 253 | |||
| 243 | /* Provide information about the chip model. */ | 254 | /* Provide information about the chip model. */ |
| 244 | extern char chip_model[64]; | 255 | extern char chip_model[64]; |
| 245 | 256 | ||
diff --git a/arch/tile/kernel/Makefile b/arch/tile/kernel/Makefile index 756e6ec452d3..112b1e248f05 100644 --- a/arch/tile/kernel/Makefile +++ b/arch/tile/kernel/Makefile | |||
| @@ -8,6 +8,7 @@ obj-y := backtrace.o entry.o init_task.o irq.o messaging.o \ | |||
| 8 | setup.o signal.o single_step.o stack.o sys.o time.o traps.o \ | 8 | setup.o signal.o single_step.o stack.o sys.o time.o traps.o \ |
| 9 | intvec_$(BITS).o regs_$(BITS).o tile-desc_$(BITS).o | 9 | intvec_$(BITS).o regs_$(BITS).o tile-desc_$(BITS).o |
| 10 | 10 | ||
| 11 | obj-$(CONFIG_HARDWALL) += hardwall.o | ||
| 11 | obj-$(CONFIG_TILEGX) += futex_64.o | 12 | obj-$(CONFIG_TILEGX) += futex_64.o |
| 12 | obj-$(CONFIG_COMPAT) += compat.o compat_signal.o | 13 | obj-$(CONFIG_COMPAT) += compat.o compat_signal.o |
| 13 | obj-$(CONFIG_SMP) += smpboot.o smp.o tlb.o | 14 | obj-$(CONFIG_SMP) += smpboot.o smp.o tlb.o |
diff --git a/arch/tile/kernel/hardwall.c b/arch/tile/kernel/hardwall.c new file mode 100644 index 000000000000..7bf0627b733d --- /dev/null +++ b/arch/tile/kernel/hardwall.c | |||
| @@ -0,0 +1,794 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2010 Tilera Corporation. All Rights Reserved. | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or | ||
| 5 | * modify it under the terms of the GNU General Public License | ||
| 6 | * as published by the Free Software Foundation, version 2. | ||
| 7 | * | ||
| 8 | * This program is distributed in the hope that it will be useful, but | ||
| 9 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 10 | * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or | ||
| 11 | * NON INFRINGEMENT. See the GNU General Public License for | ||
| 12 | * more details. | ||
| 13 | */ | ||
| 14 | |||
| 15 | #include <linux/fs.h> | ||
| 16 | #include <linux/proc_fs.h> | ||
| 17 | #include <linux/seq_file.h> | ||
| 18 | #include <linux/rwsem.h> | ||
| 19 | #include <linux/kprobes.h> | ||
| 20 | #include <linux/sched.h> | ||
| 21 | #include <linux/hardirq.h> | ||
