mirror of
https://github.com/torvalds/linux.git
synced 2026-06-08 14:42:37 +02:00
Merge commit 'v2.6.32.9' into android-2.6.32
This commit is contained in:
commit
67078ecae3
|
|
@ -49,6 +49,8 @@ o oprofile 0.9 # oprofiled --version
|
|||
o udev 081 # udevinfo -V
|
||||
o grub 0.93 # grub --version
|
||||
o mcelog 0.6
|
||||
o iptables 1.4.1 # iptables -V
|
||||
|
||||
|
||||
Kernel compilation
|
||||
==================
|
||||
|
|
|
|||
|
|
@ -32,10 +32,10 @@ PS_METHOD = $(prefer-db2x)
|
|||
|
||||
###
|
||||
# The targets that may be used.
|
||||
PHONY += xmldocs sgmldocs psdocs pdfdocs htmldocs mandocs installmandocs cleandocs media
|
||||
PHONY += xmldocs sgmldocs psdocs pdfdocs htmldocs mandocs installmandocs cleandocs xmldoclinks
|
||||
|
||||
BOOKS := $(addprefix $(obj)/,$(DOCBOOKS))
|
||||
xmldocs: $(BOOKS)
|
||||
xmldocs: $(BOOKS) xmldoclinks
|
||||
sgmldocs: xmldocs
|
||||
|
||||
PS := $(patsubst %.xml, %.ps, $(BOOKS))
|
||||
|
|
@ -45,15 +45,24 @@ PDF := $(patsubst %.xml, %.pdf, $(BOOKS))
|
|||
pdfdocs: $(PDF)
|
||||
|
||||
HTML := $(sort $(patsubst %.xml, %.html, $(BOOKS)))
|
||||
htmldocs: media $(HTML)
|
||||
htmldocs: $(HTML)
|
||||
$(call build_main_index)
|
||||
$(call build_images)
|
||||
|
||||
MAN := $(patsubst %.xml, %.9, $(BOOKS))
|
||||
mandocs: $(MAN)
|
||||
|
||||
media:
|
||||
mkdir -p $(srctree)/Documentation/DocBook/media/
|
||||
cp $(srctree)/Documentation/DocBook/dvb/*.png $(srctree)/Documentation/DocBook/v4l/*.gif $(srctree)/Documentation/DocBook/media/
|
||||
build_images = mkdir -p $(objtree)/Documentation/DocBook/media/ && \
|
||||
cp $(srctree)/Documentation/DocBook/dvb/*.png $(srctree)/Documentation/DocBook/v4l/*.gif $(objtree)/Documentation/DocBook/media/
|
||||
|
||||
xmldoclinks:
|
||||
ifneq ($(objtree),$(srctree))
|
||||
for dep in dvb media-entities.tmpl media-indices.tmpl v4l; do \
|
||||
rm -f $(objtree)/Documentation/DocBook/$$dep \
|
||||
&& ln -s $(srctree)/Documentation/DocBook/$$dep $(objtree)/Documentation/DocBook/ \
|
||||
|| exit; \
|
||||
done
|
||||
endif
|
||||
|
||||
installmandocs: mandocs
|
||||
mkdir -p /usr/local/man/man9/
|
||||
|
|
|
|||
|
|
@ -153,8 +153,8 @@ journal_dev=devnum When the external journal device's major/minor numbers
|
|||
identified through its new major/minor numbers encoded
|
||||
in devnum.
|
||||
|
||||
noload Don't load the journal on mounting. Note that
|
||||
if the filesystem was not unmounted cleanly,
|
||||
norecovery Don't load the journal on mounting. Note that
|
||||
noload if the filesystem was not unmounted cleanly,
|
||||
skipping the journal replay will lead to the
|
||||
filesystem containing inconsistencies that can
|
||||
lead to any number of problems.
|
||||
|
|
@ -196,7 +196,7 @@ nobarrier This also requires an IO stack which can support
|
|||
also be used to enable or disable barriers, for
|
||||
consistency with other ext4 mount options.
|
||||
|
||||
inode_readahead=n This tuning parameter controls the maximum
|
||||
inode_readahead_blks=n This tuning parameter controls the maximum
|
||||
number of inode table blocks that ext4's inode
|
||||
table readahead algorithm will pre-read into
|
||||
the buffer cache. The default value is 32 blocks.
|
||||
|
|
@ -353,6 +353,12 @@ noauto_da_alloc replacing existing files via patterns such as
|
|||
system crashes before the delayed allocation
|
||||
blocks are forced to disk.
|
||||
|
||||
discard Controls whether ext4 should issue discard/TRIM
|
||||
nodiscard(*) commands to the underlying block device when
|
||||
blocks are freed. This is useful for SSD devices
|
||||
and sparse/thinly-provisioned LUNs, but it is off
|
||||
by default until sufficient testing has been done.
|
||||
|
||||
Data Mode
|
||||
=========
|
||||
There are 3 different data modes:
|
||||
|
|
|
|||
|
|
@ -2645,6 +2645,8 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
to a common usb-storage quirk flag as follows:
|
||||
a = SANE_SENSE (collect more than 18 bytes
|
||||
of sense data);
|
||||
b = BAD_SENSE (don't collect more than 18
|
||||
bytes of sense data);
|
||||
c = FIX_CAPACITY (decrease the reported
|
||||
device capacity by one sector);
|
||||
h = CAPACITY_HEURISTICS (decrease the
|
||||
|
|
|
|||
|
|
@ -593,6 +593,42 @@ struct kvm_irqchip {
|
|||
} chip;
|
||||
};
|
||||
|
||||
4.27 KVM_GET_CLOCK
|
||||
|
||||
Capability: KVM_CAP_ADJUST_CLOCK
|
||||
Architectures: x86
|
||||
Type: vm ioctl
|
||||
Parameters: struct kvm_clock_data (out)
|
||||
Returns: 0 on success, -1 on error
|
||||
|
||||
Gets the current timestamp of kvmclock as seen by the current guest. In
|
||||
conjunction with KVM_SET_CLOCK, it is used to ensure monotonicity on scenarios
|
||||
such as migration.
|
||||
|
||||
struct kvm_clock_data {
|
||||
__u64 clock; /* kvmclock current value */
|
||||
__u32 flags;
|
||||
__u32 pad[9];
|
||||
};
|
||||
|
||||
4.28 KVM_SET_CLOCK
|
||||
|
||||
Capability: KVM_CAP_ADJUST_CLOCK
|
||||
Architectures: x86
|
||||
Type: vm ioctl
|
||||
Parameters: struct kvm_clock_data (in)
|
||||
Returns: 0 on success, -1 on error
|
||||
|
||||
Sets the current timestamp of kvmclock to the valued specific in its parameter.
|
||||
In conjunction with KVM_GET_CLOCK, it is used to ensure monotonicity on scenarios
|
||||
such as migration.
|
||||
|
||||
struct kvm_clock_data {
|
||||
__u64 clock; /* kvmclock current value */
|
||||
__u32 flags;
|
||||
__u32 pad[9];
|
||||
};
|
||||
|
||||
5. The kvm_run structure
|
||||
|
||||
Application code obtains a pointer to the kvm_run structure by
|
||||
|
|
|
|||
|
|
@ -172,3 +172,4 @@
|
|||
171 -> Beholder BeholdTV X7 [5ace:7595]
|
||||
172 -> RoverMedia TV Link Pro FM [19d1:0138]
|
||||
173 -> Zolid Hybrid TV Tuner PCI [1131:2004]
|
||||
174 -> Asus Europa Hybrid OEM [1043:4847]
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@ ov519 041e:405f Creative Live! VISTA VF0330
|
|||
ov519 041e:4060 Creative Live! VISTA VF0350
|
||||
ov519 041e:4061 Creative Live! VISTA VF0400
|
||||
ov519 041e:4064 Creative Live! VISTA VF0420
|
||||
ov519 041e:4067 Creative Live! Cam Video IM (VF0350)
|
||||
ov519 041e:4068 Creative Live! VISTA VF0470
|
||||
spca561 0458:7004 Genius VideoCAM Express V2
|
||||
sunplus 0458:7006 Genius Dsc 1.3 Smart
|
||||
|
|
|
|||
|
|
@ -5594,9 +5594,11 @@ S: Maintained
|
|||
F: drivers/net/wireless/rndis_wlan.c
|
||||
|
||||
USB XHCI DRIVER
|
||||
M: Sarah Sharp <sarah.a.sharp@intel.com>
|
||||
M: Sarah Sharp <sarah.a.sharp@linux.intel.com>
|
||||
L: linux-usb@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/usb/host/xhci*
|
||||
F: drivers/usb/host/pci-quirks*
|
||||
|
||||
USB ZC0301 DRIVER
|
||||
M: Luca Risolia <luca.risolia@studio.unibo.it>
|
||||
|
|
|
|||
2
Makefile
2
Makefile
|
|
@ -1,7 +1,7 @@
|
|||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 32
|
||||
EXTRAVERSION =
|
||||
EXTRAVERSION = .9
|
||||
NAME = Man-Eating Seals of Antiquity
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
|
|
|||
|
|
@ -178,25 +178,18 @@ SYSCALL_DEFINE6(osf_mmap, unsigned long, addr, unsigned long, len,
|
|||
unsigned long, prot, unsigned long, flags, unsigned long, fd,
|
||||
unsigned long, off)
|
||||
{
|
||||
struct file *file = NULL;
|
||||
unsigned long ret = -EBADF;
|
||||
unsigned long ret = -EINVAL;
|
||||
|
||||
#if 0
|
||||
if (flags & (_MAP_HASSEMAPHORE | _MAP_INHERIT | _MAP_UNALIGNED))
|
||||
printk("%s: unimplemented OSF mmap flags %04lx\n",
|
||||
current->comm, flags);
|
||||
#endif
|
||||
if (!(flags & MAP_ANONYMOUS)) {
|
||||
file = fget(fd);
|
||||
if (!file)
|
||||
goto out;
|
||||
}
|
||||
flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
|
||||
down_write(¤t->mm->mmap_sem);
|
||||
ret = do_mmap(file, addr, len, prot, flags, off);
|
||||
up_write(¤t->mm->mmap_sem);
|
||||
if (file)
|
||||
fput(file);
|
||||
if ((off + PAGE_ALIGN(len)) < off)
|
||||
goto out;
|
||||
if (off & ~PAGE_MASK)
|
||||
goto out;
|
||||
ret = sys_mmap_pgoff(addr, len, prot, flags, fd, off >> PAGE_SHIFT);
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1 +1,4 @@
|
|||
#include <asm-generic/mman.h>
|
||||
|
||||
#define arch_mmap_check(addr, len, flags) \
|
||||
(((flags) & MAP_FIXED && (addr) < FIRST_USER_ADDRESS) ? -EINVAL : 0)
|
||||
|
|
|
|||
|
|
@ -172,7 +172,7 @@
|
|||
/* 160 */ CALL(sys_sched_get_priority_min)
|
||||
CALL(sys_sched_rr_get_interval)
|
||||
CALL(sys_nanosleep)
|
||||
CALL(sys_arm_mremap)
|
||||
CALL(sys_mremap)
|
||||
CALL(sys_setresuid16)
|
||||
/* 165 */ CALL(sys_getresuid16)
|
||||
CALL(sys_ni_syscall) /* vm86 */
|
||||
|
|
|
|||
|
|
@ -416,12 +416,12 @@ sys_mmap2:
|
|||
tst r5, #PGOFF_MASK
|
||||
moveq r5, r5, lsr #PAGE_SHIFT - 12
|
||||
streq r5, [sp, #4]
|
||||
beq do_mmap2
|
||||
beq sys_mmap_pgoff
|
||||
mov r0, #-EINVAL
|
||||
mov pc, lr
|
||||
#else
|
||||
str r5, [sp, #4]
|
||||
b do_mmap2
|
||||
b sys_mmap_pgoff
|
||||
#endif
|
||||
ENDPROC(sys_mmap2)
|
||||
|
||||
|
|
|
|||
|
|
@ -28,41 +28,6 @@
|
|||
#include <linux/ipc.h>
|
||||
#include <linux/uaccess.h>
|
||||
|
||||
extern unsigned long do_mremap(unsigned long addr, unsigned long old_len,
|
||||
unsigned long new_len, unsigned long flags,
|
||||
unsigned long new_addr);
|
||||
|
||||
/* common code for old and new mmaps */
|
||||
inline long do_mmap2(
|
||||
unsigned long addr, unsigned long len,
|
||||
unsigned long prot, unsigned long flags,
|
||||
unsigned long fd, unsigned long pgoff)
|
||||
{
|
||||
int error = -EINVAL;
|
||||
struct file * file = NULL;
|
||||
|
||||
flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
|
||||
|
||||
if (flags & MAP_FIXED && addr < FIRST_USER_ADDRESS)
|
||||
goto out;
|
||||
|
||||
error = -EBADF;
|
||||
if (!(flags & MAP_ANONYMOUS)) {
|
||||
file = fget(fd);
|
||||
if (!file)
|
||||
goto out;
|
||||
}
|
||||
|
||||
down_write(¤t->mm->mmap_sem);
|
||||
error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
|
||||
up_write(¤t->mm->mmap_sem);
|
||||
|
||||
if (file)
|
||||
fput(file);
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
|
||||
struct mmap_arg_struct {
|
||||
unsigned long addr;
|
||||
unsigned long len;
|
||||
|
|
@ -84,29 +49,11 @@ asmlinkage int old_mmap(struct mmap_arg_struct __user *arg)
|
|||
if (a.offset & ~PAGE_MASK)
|
||||
goto out;
|
||||
|
||||
error = do_mmap2(a.addr, a.len, a.prot, a.flags, a.fd, a.offset >> PAGE_SHIFT);
|
||||
error = sys_mmap_pgoff(a.addr, a.len, a.prot, a.flags, a.fd, a.offset >> PAGE_SHIFT);
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
|
||||
asmlinkage unsigned long
|
||||
sys_arm_mremap(unsigned long addr, unsigned long old_len,
|
||||
unsigned long new_len, unsigned long flags,
|
||||
unsigned long new_addr)
|
||||
{
|
||||
unsigned long ret = -EINVAL;
|
||||
|
||||
if (flags & MREMAP_FIXED && new_addr < FIRST_USER_ADDRESS)
|
||||
goto out;
|
||||
|
||||
down_write(¤t->mm->mmap_sem);
|
||||
ret = do_mremap(addr, old_len, new_len, flags, new_addr);
|
||||
up_write(¤t->mm->mmap_sem);
|
||||
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Perform the select(nd, in, out, ex, tv) and mmap() system
|
||||
* calls.
|
||||
|
|
|
|||
|
|
@ -789,7 +789,14 @@ static struct davinci_id dm646x_ids[] = {
|
|||
.part_no = 0xb770,
|
||||
.manufacturer = 0x017,
|
||||
.cpu_id = DAVINCI_CPU_ID_DM6467,
|
||||
.name = "dm6467",
|
||||
.name = "dm6467_rev1.x",
|
||||
},
|
||||
{
|
||||
.variant = 0x1,
|
||||
.part_no = 0xb770,
|
||||
.manufacturer = 0x017,
|
||||
.cpu_id = DAVINCI_CPU_ID_DM6467,
|
||||
.name = "dm6467_rev3.x",
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -497,16 +497,15 @@ static int em_x270_usb_hub_init(void)
|
|||
goto err_free_vbus_gpio;
|
||||
|
||||
/* USB Hub power-on and reset */
|
||||
gpio_direction_output(usb_hub_reset, 0);
|
||||
gpio_direction_output(usb_hub_reset, 1);
|
||||
gpio_direction_output(GPIO9_USB_VBUS_EN, 0);
|
||||
regulator_enable(em_x270_usb_ldo);
|
||||
gpio_set_value(usb_hub_reset, 1);
|
||||
gpio_set_value(usb_hub_reset, 0);
|
||||
gpio_set_value(usb_hub_reset, 1);
|
||||
regulator_disable(em_x270_usb_ldo);
|
||||
regulator_enable(em_x270_usb_ldo);
|
||||
gpio_set_value(usb_hub_reset, 1);
|
||||
|
||||
/* enable VBUS */
|
||||
gpio_direction_output(GPIO9_USB_VBUS_EN, 1);
|
||||
gpio_set_value(usb_hub_reset, 0);
|
||||
gpio_set_value(GPIO9_USB_VBUS_EN, 1);
|
||||
|
||||
return 0;
|
||||
|
||||
|
|
|
|||
|
|
@ -54,7 +54,8 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr,
|
|||
* We enforce the MAP_FIXED case.
|
||||
*/
|
||||
if (flags & MAP_FIXED) {
|
||||
if (aliasing && flags & MAP_SHARED && addr & (SHMLBA - 1))
|
||||
if (aliasing && flags & MAP_SHARED &&
|
||||
(addr - (pgoff << PAGE_SHIFT)) & (SHMLBA - 1))
|
||||
return -EINVAL;
|
||||
return addr;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -29,10 +29,6 @@ asmlinkage int sys_sigaltstack(const stack_t __user *, stack_t __user *,
|
|||
struct pt_regs *);
|
||||
asmlinkage int sys_rt_sigreturn(struct pt_regs *);
|
||||
|
||||
/* kernel/sys_avr32.c */
|
||||
asmlinkage long sys_mmap2(unsigned long, unsigned long, unsigned long,
|
||||
unsigned long, unsigned long, off_t);
|
||||
|
||||
/* mm/cache.c */
|
||||
asmlinkage int sys_cacheflush(int, void __user *, size_t);
|
||||
|
||||
|
|
|
|||
|
|
@ -5,39 +5,8 @@
|
|||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#include <linux/errno.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/file.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/unistd.h>
|
||||
|
||||
#include <asm/mman.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/syscalls.h>
|
||||
|
||||
asmlinkage long sys_mmap2(unsigned long addr, unsigned long len,
|
||||
unsigned long prot, unsigned long flags,
|
||||
unsigned long fd, off_t offset)
|
||||
{
|
||||
int error = -EBADF;
|
||||
struct file *file = NULL;
|
||||
|
||||
flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
|
||||
if (!(flags & MAP_ANONYMOUS)) {
|
||||
file = fget(fd);
|
||||
if (!file)
|
||||
return error;
|
||||
}
|
||||
|
||||
down_write(¤t->mm->mmap_sem);
|
||||
error = do_mmap_pgoff(file, addr, len, prot, flags, offset);
|
||||
up_write(¤t->mm->mmap_sem);
|
||||
|
||||
if (file)
|
||||
fput(file);
|
||||
return error;
|
||||
}
|
||||
|
||||
int kernel_execve(const char *file, char **argv, char **envp)
|
||||
{
|
||||
register long scno asm("r8") = __NR_execve;
|
||||
|
|
|
|||
|
|
@ -61,7 +61,7 @@ __sys_execve:
|
|||
__sys_mmap2:
|
||||
pushm lr
|
||||
st.w --sp, ARG6
|
||||
call sys_mmap2
|
||||
call sys_mmap_pgoff
|
||||
sub sp, -4
|
||||
popm pc
|
||||
|
||||
|
|
|
|||
|
|
@ -10,4 +10,9 @@
|
|||
#include <asm-generic/page.h>
|
||||
#define MAP_NR(addr) (((unsigned long)(addr)-PAGE_OFFSET) >> PAGE_SHIFT)
|
||||
|
||||
#define VM_DATA_DEFAULT_FLAGS \
|
||||
(VM_READ | VM_WRITE | \
|
||||
((current->personality & READ_IMPLIES_EXEC) ? VM_EXEC : 0 ) | \
|
||||
VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -22,39 +22,6 @@
|
|||
#include <asm/cacheflush.h>
|
||||
#include <asm/dma.h>
|
||||
|
||||
/* common code for old and new mmaps */
|
||||
static inline long
|
||||
do_mmap2(unsigned long addr, unsigned long len,
|
||||
unsigned long prot, unsigned long flags,
|
||||
unsigned long fd, unsigned long pgoff)
|
||||
{
|
||||
int error = -EBADF;
|
||||
struct file *file = NULL;
|
||||
|
||||
flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
|
||||
if (!(flags & MAP_ANONYMOUS)) {
|
||||
file = fget(fd);
|
||||
if (!file)
|
||||
goto out;
|
||||
}
|
||||
|
||||
down_write(¤t->mm->mmap_sem);
|
||||
error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
|
||||
up_write(¤t->mm->mmap_sem);
|
||||
|
||||
if (file)
|
||||
fput(file);
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
|
||||
asmlinkage long sys_mmap2(unsigned long addr, unsigned long len,
|
||||
unsigned long prot, unsigned long flags,
|
||||
unsigned long fd, unsigned long pgoff)
|
||||
{
|
||||
return do_mmap2(addr, len, prot, flags, fd, pgoff);
|
||||
}
|
||||
|
||||
asmlinkage void *sys_sram_alloc(size_t size, unsigned long flags)
|
||||
{
|
||||
return sram_alloc_with_lsl(size, flags);
|
||||
|
|
|
|||
|
|
@ -1422,7 +1422,7 @@ ENTRY(_sys_call_table)
|
|||
.long _sys_ni_syscall /* streams2 */
|
||||
.long _sys_vfork /* 190 */
|
||||
.long _sys_getrlimit
|
||||
.long _sys_mmap2
|
||||
.long _sys_mmap_pgoff
|
||||
.long _sys_truncate64
|
||||
.long _sys_ftruncate64
|
||||
.long _sys_stat64 /* 195 */
|
||||
|
|
|
|||
|
|
@ -26,31 +26,6 @@
|
|||
#include <asm/uaccess.h>
|
||||
#include <asm/segment.h>
|
||||
|
||||
/* common code for old and new mmaps */
|
||||
static inline long
|
||||
do_mmap2(unsigned long addr, unsigned long len, unsigned long prot,
|
||||
unsigned long flags, unsigned long fd, unsigned long pgoff)
|
||||
{
|
||||
int error = -EBADF;
|
||||
struct file * file = NULL;
|
||||
|
||||
flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
|
||||
if (!(flags & MAP_ANONYMOUS)) {
|
||||
file = fget(fd);
|
||||
if (!file)
|
||||
goto out;
|
||||
}
|
||||
|
||||
down_write(¤t->mm->mmap_sem);
|
||||
error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
|
||||
up_write(¤t->mm->mmap_sem);
|
||||
|
||||
if (file)
|
||||
fput(file);
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
|
||||
asmlinkage unsigned long old_mmap(unsigned long __user *args)
|
||||
{
|
||||
unsigned long buffer[6];
|
||||
|
|
@ -63,7 +38,7 @@ asmlinkage unsigned long old_mmap(unsigned long __user *args)
|
|||
if (buffer[5] & ~PAGE_MASK) /* verify that offset is on page boundary */
|
||||
goto out;
|
||||
|
||||
err = do_mmap2(buffer[0], buffer[1], buffer[2], buffer[3],
|
||||
err = sys_mmap_pgoff(buffer[0], buffer[1], buffer[2], buffer[3],
|
||||
buffer[4], buffer[5] >> PAGE_SHIFT);
|
||||
out:
|
||||
return err;
|
||||
|
|
@ -73,7 +48,8 @@ asmlinkage long
|
|||
sys_mmap2(unsigned long addr, unsigned long len, unsigned long prot,
|
||||
unsigned long flags, unsigned long fd, unsigned long pgoff)
|
||||
{
|
||||
return do_mmap2(addr, len, prot, flags, fd, pgoff);
|
||||
/* bug(?): 8Kb pages here */
|
||||
return sys_mmap_pgoff(addr, len, prot, flags, fd, pgoff);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -63,12 +63,10 @@ extern unsigned long max_pfn;
|
|||
#define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
|
||||
|
||||
|
||||
#ifdef CONFIG_MMU
|
||||
#define VM_DATA_DEFAULT_FLAGS \
|
||||
(VM_READ | VM_WRITE | \
|
||||
((current->personality & READ_IMPLIES_EXEC) ? VM_EXEC : 0 ) | \
|
||||
VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
|
||||
#endif
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
|
|
|
|||
|
|
@ -31,9 +31,6 @@ asmlinkage long sys_mmap2(unsigned long addr, unsigned long len,
|
|||
unsigned long prot, unsigned long flags,
|
||||
unsigned long fd, unsigned long pgoff)
|
||||
{
|
||||
int error = -EBADF;
|
||||
struct file * file = NULL;
|
||||
|
||||
/* As with sparc32, make sure the shift for mmap2 is constant
|
||||
(12), no matter what PAGE_SIZE we have.... */
|
||||
|
||||
|
|
@ -41,70 +38,11 @@ asmlinkage long sys_mmap2(unsigned long addr, unsigned long len,
|
|||
trying to map something we can't */
|
||||
if (pgoff & ((1 << (PAGE_SHIFT - 12)) - 1))
|
||||
return -EINVAL;
|
||||
pgoff >>= PAGE_SHIFT - 12;
|
||||
|
||||
flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
|
||||
if (!(flags & MAP_ANONYMOUS)) {
|
||||
file = fget(fd);
|
||||
if (!file)
|
||||
goto out;
|
||||
}
|
||||
|
||||
down_write(¤t->mm->mmap_sem);
|
||||
error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
|
||||
up_write(¤t->mm->mmap_sem);
|
||||
|
||||
if (file)
|
||||
fput(file);
|
||||
out:
|
||||
return error;
|
||||
return sys_mmap_pgoff(addr, len, prot, flags, fd,
|
||||
pgoff >> (PAGE_SHIFT - 12));
|
||||
}
|
||||
|
||||
#if 0 /* DAVIDM - do we want this */
|
||||
struct mmap_arg_struct64 {
|
||||
__u32 addr;
|
||||
__u32 len;
|
||||
__u32 prot;
|
||||
__u32 flags;
|
||||
__u64 offset; /* 64 bits */
|
||||
__u32 fd;
|
||||
};
|
||||
|
||||
asmlinkage long sys_mmap64(struct mmap_arg_struct64 *arg)
|
||||
{
|
||||
int error = -EFAULT;
|
||||
struct file * file = NULL;
|
||||
struct mmap_arg_struct64 a;
|
||||
unsigned long pgoff;
|
||||
|
||||
if (copy_from_user(&a, arg, sizeof(a)))
|
||||
return -EFAULT;
|
||||
|
||||
if ((long)a.offset & ~PAGE_MASK)
|
||||
return -EINVAL;
|
||||
|
||||
pgoff = a.offset >> PAGE_SHIFT;
|
||||
if ((a.offset >> PAGE_SHIFT) != pgoff)
|
||||
return -EINVAL;
|
||||
|
||||
if (!(a.flags & MAP_ANONYMOUS)) {
|
||||
error = -EBADF;
|
||||
file = fget(a.fd);
|
||||
if (!file)
|
||||
goto out;
|
||||
}
|
||||
a.flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
|
||||
|
||||
down_write(¤t->mm->mmap_sem);
|
||||
error = do_mmap_pgoff(file, a.addr, a.len, a.prot, a.flags, pgoff);
|
||||
up_write(¤t->mm->mmap_sem);
|
||||
if (file)
|
||||
fput(file);
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* sys_ipc() is the de-multiplexer for the SysV IPC calls..
|
||||
*
|
||||
|
|
|
|||
|
|
@ -26,39 +26,6 @@
|
|||
#include <asm/traps.h>
|
||||
#include <asm/unistd.h>
|
||||
|
||||
/* common code for old and new mmaps */
|
||||
static inline long do_mmap2(
|
||||
unsigned long addr, unsigned long len,
|
||||
unsigned long prot, unsigned long flags,
|
||||
unsigned long fd, unsigned long pgoff)
|
||||
{
|
||||
int error = -EBADF;
|
||||
struct file * file = NULL;
|
||||
|
||||
flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
|
||||
if (!(flags & MAP_ANONYMOUS)) {
|
||||
file = fget(fd);
|
||||
if (!file)
|
||||
goto out;
|
||||
}
|
||||
|
||||
down_write(¤t->mm->mmap_sem);
|
||||
error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
|
||||
up_write(¤t->mm->mmap_sem);
|
||||
|
||||
if (file)
|
||||
fput(file);
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
|
||||
asmlinkage long sys_mmap2(unsigned long addr, unsigned long len,
|
||||
unsigned long prot, unsigned long flags,
|
||||
unsigned long fd, unsigned long pgoff)
|
||||
{
|
||||
return do_mmap2(addr, len, prot, flags, fd, pgoff);
|
||||
}
|
||||
|
||||
/*
|
||||
* Perform the select(nd, in, out, ex, tv) and mmap() system
|
||||
* calls. Linux/m68k cloned Linux/i386, which didn't use to be able to
|
||||
|
|
@ -87,58 +54,12 @@ asmlinkage int old_mmap(struct mmap_arg_struct *arg)
|
|||
if (a.offset & ~PAGE_MASK)
|
||||
goto out;
|
||||
|
||||
a.flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
|
||||
|
||||
error = do_mmap2(a.addr, a.len, a.prot, a.flags, a.fd, a.offset >> PAGE_SHIFT);
|
||||
error = sys_mmap_pgoff(a.addr, a.len, a.prot, a.flags, a.fd,
|
||||
a.offset >> PAGE_SHIFT);
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
|
||||
#if 0 /* DAVIDM - do we want this */
|
||||
struct mmap_arg_struct64 {
|
||||
__u32 addr;
|
||||
__u32 len;
|
||||
__u32 prot;
|
||||
__u32 flags;
|
||||
__u64 offset; /* 64 bits */
|
||||
__u32 fd;
|
||||
};
|
||||
|
||||
asmlinkage long sys_mmap64(struct mmap_arg_struct64 *arg)
|
||||
{
|
||||
int error = -EFAULT;
|
||||
struct file * file = NULL;
|
||||
struct mmap_arg_struct64 a;
|
||||
unsigned long pgoff;
|
||||
|
||||
if (copy_from_user(&a, arg, sizeof(a)))
|
||||
return -EFAULT;
|
||||
|
||||
if ((long)a.offset & ~PAGE_MASK)
|
||||
return -EINVAL;
|
||||
|
||||
pgoff = a.offset >> PAGE_SHIFT;
|
||||
if ((a.offset >> PAGE_SHIFT) != pgoff)
|
||||
return -EINVAL;
|
||||
|
||||
if (!(a.flags & MAP_ANONYMOUS)) {
|
||||
error = -EBADF;
|
||||
file = fget(a.fd);
|
||||
if (!file)
|
||||
goto out;
|
||||
}
|
||||
a.flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
|
||||
|
||||
down_write(¤t->mm->mmap_sem);
|
||||
error = do_mmap_pgoff(file, a.addr, a.len, a.prot, a.flags, pgoff);
|
||||
up_write(¤t->mm->mmap_sem);
|
||||
if (file)
|
||||
fput(file);
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
#endif
|
||||
|
||||
struct sel_arg_struct {
|
||||
unsigned long n;
|
||||
fd_set *inp, *outp, *exp;
|
||||
|
|
|
|||
|
|
@ -206,7 +206,7 @@ SYMBOL_NAME_LABEL(sys_call_table)
|
|||
.long SYMBOL_NAME(sys_ni_syscall) /* streams2 */
|
||||
.long SYMBOL_NAME(sys_vfork) /* 190 */
|
||||
.long SYMBOL_NAME(sys_getrlimit)
|
||||
.long SYMBOL_NAME(sys_mmap2)
|
||||
.long SYMBOL_NAME(sys_mmap_pgoff)
|
||||
.long SYMBOL_NAME(sys_truncate64)
|
||||
.long SYMBOL_NAME(sys_ftruncate64)
|
||||
.long SYMBOL_NAME(sys_stat64) /* 195 */
|
||||
|
|
|
|||
|
|
@ -858,6 +858,9 @@ ia32_do_mmap (struct file *file, unsigned long addr, unsigned long len, int prot
|
|||
|
||||
prot = get_prot32(prot);
|
||||
|
||||
if (flags & MAP_HUGETLB)
|
||||
return -ENOMEM;
|
||||
|
||||
#if PAGE_SHIFT > IA32_PAGE_SHIFT
|
||||
mutex_lock(&ia32_mmap_mutex);
|
||||
{
|
||||
|
|
|
|||
|
|
@ -424,6 +424,8 @@ __writeq (unsigned long val, volatile void __iomem *addr)
|
|||
extern void __iomem * ioremap(unsigned long offset, unsigned long size);
|
||||
extern void __iomem * ioremap_nocache (unsigned long offset, unsigned long size);
|
||||
extern void iounmap (volatile void __iomem *addr);
|
||||
extern void __iomem * early_ioremap (unsigned long phys_addr, unsigned long size);
|
||||
extern void early_iounmap (volatile void __iomem *addr, unsigned long size);
|
||||
|
||||
/*
|
||||
* String version of IO memory access ops:
|
||||
|
|
|
|||
|
|
@ -100,51 +100,7 @@ sys_getpagesize (void)
|
|||
asmlinkage unsigned long
|
||||
ia64_brk (unsigned long brk)
|
||||
{
|
||||
unsigned long rlim, retval, newbrk, oldbrk;
|
||||
struct mm_struct *mm = current->mm;
|
||||
|
||||
/*
|
||||
* Most of this replicates the code in sys_brk() except for an additional safety
|
||||
* check and the clearing of r8. However, we can't call sys_brk() because we need
|
||||
* to acquire the mmap_sem before we can do the test...
|
||||
*/
|
||||
down_write(&mm->mmap_sem);
|
||||
|
||||
if (brk < mm->end_code)
|
||||
goto out;
|
||||
newbrk = PAGE_ALIGN(brk);
|
||||
oldbrk = PAGE_ALIGN(mm->brk);
|
||||
if (oldbrk == newbrk)
|
||||
goto set_brk;
|
||||
|
||||
/* Always allow shrinking brk. */
|
||||
if (brk <= mm->brk) {
|
||||
if (!do_munmap(mm, newbrk, oldbrk-newbrk))
|
||||
goto set_brk;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Check against unimplemented/unmapped addresses: */
|
||||
if ((newbrk - oldbrk) > RGN_MAP_LIMIT || REGION_OFFSET(newbrk) > RGN_MAP_LIMIT)
|
||||
goto out;
|
||||
|
||||
/* Check against rlimit.. */
|
||||
rlim = current->signal->rlim[RLIMIT_DATA].rlim_cur;
|
||||
if (rlim < RLIM_INFINITY && brk - mm->start_data > rlim)
|
||||
goto out;
|
||||
|
||||
/* Check against existing mmap mappings. */
|
||||
if (find_vma_intersection(mm, oldbrk, newbrk+PAGE_SIZE))
|
||||
goto out;
|
||||
|
||||
/* Ok, looks good - let it rip. */
|
||||
if (do_brk(oldbrk, newbrk-oldbrk) != oldbrk)
|
||||
goto out;
|
||||
set_brk:
|
||||
mm->brk = brk;
|
||||
out:
|
||||
retval = mm->brk;
|
||||
up_write(&mm->mmap_sem);
|
||||
unsigned long retval = sys_brk(brk);
|
||||
force_successful_syscall_return();
|
||||
return retval;
|
||||
}
|
||||
|
|
@ -185,39 +141,6 @@ int ia64_mmap_check(unsigned long addr, unsigned long len,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline unsigned long
|
||||
do_mmap2 (unsigned long addr, unsigned long len, int prot, int flags, int fd, unsigned long pgoff)
|
||||
{
|
||||
struct file *file = NULL;
|
||||
|
||||
flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
|
||||
if (!(flags & MAP_ANONYMOUS)) {
|
||||
file = fget(fd);
|
||||
if (!file)
|
||||
return -EBADF;
|
||||
|
||||
if (!file->f_op || !file->f_op->mmap) {
|
||||
addr = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
/* Careful about overflows.. */
|
||||
len = PAGE_ALIGN(len);
|
||||
if (!len || len > TASK_SIZE) {
|
||||
addr = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
down_write(¤t->mm->mmap_sem);
|
||||
addr = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
|
||||
up_write(¤t->mm->mmap_sem);
|
||||
|
||||
out: if (file)
|
||||
fput(file);
|
||||
return addr;
|
||||
}
|
||||
|
||||
/*
|
||||
* mmap2() is like mmap() except that the offset is expressed in units
|
||||
* of PAGE_SIZE (instead of bytes). This allows to mmap2() (pieces
|
||||
|
|
@ -226,7 +149,7 @@ out: if (file)
|
|||
asmlinkage unsigned long
|
||||
sys_mmap2 (unsigned long addr, unsigned long len, int prot, int flags, int fd, long pgoff)
|
||||
{
|
||||
addr = do_mmap2(addr, len, prot, flags, fd, pgoff);
|
||||
addr = sys_mmap_pgoff(addr, len, prot, flags, fd, pgoff);
|
||||
if (!IS_ERR((void *) addr))
|
||||
force_successful_syscall_return();
|
||||
return addr;
|
||||
|
|
@ -238,7 +161,7 @@ sys_mmap (unsigned long addr, unsigned long len, int prot, int flags, int fd, lo
|
|||
if (offset_in_page(off) != 0)
|
||||
return -EINVAL;
|
||||
|
||||
addr = do_mmap2(addr, len, prot, flags, fd, off >> PAGE_SHIFT);
|
||||
addr = sys_mmap_pgoff(addr, len, prot, flags, fd, off >> PAGE_SHIFT);
|
||||
if (!IS_ERR((void *) addr))
|
||||
force_successful_syscall_return();
|
||||
return addr;
|
||||
|
|
|
|||
|
|
@ -21,6 +21,12 @@ __ioremap (unsigned long phys_addr)
|
|||
return (void __iomem *) (__IA64_UNCACHED_OFFSET | phys_addr);
|
||||
}
|
||||
|
||||
void __iomem *
|
||||
early_ioremap (unsigned long phys_addr, unsigned long size)
|
||||
{
|
||||
return __ioremap(phys_addr);
|
||||
}
|
||||
|
||||
void __iomem *
|
||||
ioremap (unsigned long phys_addr, unsigned long size)
|
||||
{
|
||||
|
|
@ -101,6 +107,11 @@ ioremap_nocache (unsigned long phys_addr, unsigned long size)
|
|||
}
|
||||
EXPORT_SYMBOL(ioremap_nocache);
|
||||
|
||||
void
|
||||
early_iounmap (volatile void __iomem *addr, unsigned long size)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
iounmap (volatile void __iomem *addr)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -76,30 +76,6 @@ asmlinkage int sys_tas(int __user *addr)
|
|||
return oldval;
|
||||
}
|
||||
|
||||
asmlinkage long sys_mmap2(unsigned long addr, unsigned long len,
|
||||
unsigned long prot, unsigned long flags,
|
||||
unsigned long fd, unsigned long pgoff)
|
||||
{
|
||||
int error = -EBADF;
|
||||
struct file *file = NULL;
|
||||
|
||||
flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
|
||||
if (!(flags & MAP_ANONYMOUS)) {
|
||||
file = fget(fd);
|
||||
if (!file)
|
||||
goto out;
|
||||
}
|
||||
|
||||
down_write(¤t->mm->mmap_sem);
|
||||
error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
|
||||
up_write(¤t->mm->mmap_sem);
|
||||
|
||||
if (file)
|
||||
fput(file);
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
|
||||
/*
|
||||
* sys_ipc() is the de-multiplexer for the SysV IPC calls..
|
||||
*
|
||||
|
|
|
|||
|
|
@ -191,7 +191,7 @@ ENTRY(sys_call_table)
|
|||
.long sys_ni_syscall /* streams2 */
|
||||
.long sys_vfork /* 190 */
|
||||
.long sys_getrlimit
|
||||
.long sys_mmap2
|
||||
.long sys_mmap_pgoff
|
||||
.long sys_truncate64
|
||||
.long sys_ftruncate64
|
||||
.long sys_stat64 /* 195 */
|
||||
|
|
|
|||
|
|
@ -29,37 +29,16 @@
|
|||
#include <asm/page.h>
|
||||
#include <asm/unistd.h>
|
||||
|
||||
/* common code for old and new mmaps */
|
||||
static inline long do_mmap2(
|
||||
unsigned long addr, unsigned long len,
|
||||
unsigned long prot, unsigned long flags,
|
||||
unsigned long fd, unsigned long pgoff)
|
||||
{
|
||||
int error = -EBADF;
|
||||
struct file * file = NULL;
|
||||
|
||||
flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
|
||||
if (!(flags & MAP_ANONYMOUS)) {
|
||||
file = fget(fd);
|
||||
if (!file)
|
||||
goto out;
|
||||
}
|
||||
|
||||
down_write(¤t->mm->mmap_sem);
|
||||
error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
|
||||
up_write(¤t->mm->mmap_sem);
|
||||
|
||||
if (file)
|
||||
fput(file);
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
|
||||
asmlinkage long sys_mmap2(unsigned long addr, unsigned long len,
|
||||
unsigned long prot, unsigned long flags,
|
||||
unsigned long fd, unsigned long pgoff)
|
||||
{
|
||||
return do_mmap2(addr, len, prot, flags, fd, pgoff);
|
||||
/*
|
||||
* This is wrong for sun3 - there PAGE_SIZE is 8Kb,
|
||||
* so we need to shift the argument down by 1; m68k mmap64(3)
|
||||
* (in libc) expects the last argument of mmap2 in 4Kb units.
|
||||
*/
|
||||
return sys_mmap_pgoff(addr, len, prot, flags, fd, pgoff);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -90,58 +69,12 @@ asmlinkage int old_mmap(struct mmap_arg_struct __user *arg)
|
|||
if (a.offset & ~PAGE_MASK)
|
||||
goto out;
|
||||
|
||||
a.flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
|
||||
|
||||
error = do_mmap2(a.addr, a.len, a.prot, a.flags, a.fd, a.offset >> PAGE_SHIFT);
|
||||
error = sys_mmap_pgoff(a.addr, a.len, a.prot, a.flags, a.fd,
|
||||
a.offset >> PAGE_SHIFT);
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
|
||||
#if 0
|
||||
struct mmap_arg_struct64 {
|
||||
__u32 addr;
|
||||
__u32 len;
|
||||
__u32 prot;
|
||||
__u32 flags;
|
||||
__u64 offset; /* 64 bits */
|
||||
__u32 fd;
|
||||
};
|
||||
|
||||
asmlinkage long sys_mmap64(struct mmap_arg_struct64 *arg)
|
||||
{
|
||||
int error = -EFAULT;
|
||||
struct file * file = NULL;
|
||||
struct mmap_arg_struct64 a;
|
||||
unsigned long pgoff;
|
||||
|
||||
if (copy_from_user(&a, arg, sizeof(a)))
|
||||
return -EFAULT;
|
||||
|
||||
if ((long)a.offset & ~PAGE_MASK)
|
||||
return -EINVAL;
|
||||
|
||||
pgoff = a.offset >> PAGE_SHIFT;
|
||||
if ((a.offset >> PAGE_SHIFT) != pgoff)
|
||||
return -EINVAL;
|
||||
|
||||
if (!(a.flags & MAP_ANONYMOUS)) {
|
||||
error = -EBADF;
|
||||
file = fget(a.fd);
|
||||
if (!file)
|
||||
goto out;
|
||||
}
|
||||
a.flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
|
||||
|
||||
down_write(¤t->mm->mmap_sem);
|
||||
error = do_mmap_pgoff(file, a.addr, a.len, a.prot, a.flags, pgoff);
|
||||
up_write(¤t->mm->mmap_sem);
|
||||
if (file)
|
||||
fput(file);
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
#endif
|
||||
|
||||
struct sel_arg_struct {
|
||||
unsigned long n;
|
||||
fd_set __user *inp, *outp, *exp;
|
||||
|
|
|
|||
|
|
@ -27,39 +27,6 @@
|
|||
#include <asm/cacheflush.h>
|
||||
#include <asm/unistd.h>
|
||||
|
||||
/* common code for old and new mmaps */
|
||||
static inline long do_mmap2(
|
||||
unsigned long addr, unsigned long len,
|
||||
unsigned long prot, unsigned long flags,
|
||||
unsigned long fd, unsigned long pgoff)
|
||||
{
|
||||
int error = -EBADF;
|
||||
struct file * file = NULL;
|
||||
|
||||
flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
|
||||
if (!(flags & MAP_ANONYMOUS)) {
|
||||
file = fget(fd);
|
||||
if (!file)
|
||||
goto out;
|
||||
}
|
||||
|
||||
down_write(¤t->mm->mmap_sem);
|
||||
error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
|
||||
up_write(¤t->mm->mmap_sem);
|
||||
|
||||
if (file)
|
||||
fput(file);
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
|
||||
asmlinkage long sys_mmap2(unsigned long addr, unsigned long len,
|
||||
unsigned long prot, unsigned long flags,
|
||||
unsigned long fd, unsigned long pgoff)
|
||||
{
|
||||
return do_mmap2(addr, len, prot, flags, fd, pgoff);
|
||||
}
|
||||
|
||||
/*
|
||||
* Perform the select(nd, in, out, ex, tv) and mmap() system
|
||||
* calls. Linux/m68k cloned Linux/i386, which didn't use to be able to
|
||||
|
|
@ -88,9 +55,8 @@ asmlinkage int old_mmap(struct mmap_arg_struct *arg)
|
|||
if (a.offset & ~PAGE_MASK)
|
||||
goto out;
|
||||
|
||||
a.flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
|
||||
|
||||
error = do_mmap2(a.addr, a.len, a.prot, a.flags, a.fd, a.offset >> PAGE_SHIFT);
|
||||
error = sys_mmap_pgoff(a.addr, a.len, a.prot, a.flags, a.fd,
|
||||
a.offset >> PAGE_SHIFT);
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -210,7 +210,7 @@ ENTRY(sys_call_table)
|
|||
.long sys_ni_syscall /* streams2 */
|
||||
.long sys_vfork /* 190 */
|
||||
.long sys_getrlimit
|
||||
.long sys_mmap2
|
||||
.long sys_mmap_pgoff
|
||||
.long sys_truncate64
|
||||
.long sys_ftruncate64
|
||||
.long sys_stat64 /* 195 */
|
||||
|
|
|
|||
|
|
@ -62,46 +62,14 @@ asmlinkage long microblaze_execve(char __user *filenamei, char __user *__user *a
|
|||
return error;
|
||||
}
|
||||
|
||||
asmlinkage long
|
||||
sys_mmap2(unsigned long addr, unsigned long len,
|
||||
unsigned long prot, unsigned long flags,
|
||||
unsigned long fd, unsigned long pgoff)
|
||||
{
|
||||
struct file *file = NULL;
|
||||
int ret = -EBADF;
|
||||
|
||||
flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
|
||||
if (!(flags & MAP_ANONYMOUS)) {
|
||||
file = fget(fd);
|
||||
if (!file) {
|
||||
printk(KERN_INFO "no fd in mmap\r\n");
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
down_write(¤t->mm->mmap_sem);
|
||||
ret = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
|
||||
up_write(¤t->mm->mmap_sem);
|
||||
if (file)
|
||||
fput(file);
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
asmlinkage long sys_mmap(unsigned long addr, unsigned long len,
|
||||
unsigned long prot, unsigned long flags,
|
||||
unsigned long fd, off_t pgoff)
|
||||
{
|
||||
int err = -EINVAL;
|
||||
if (pgoff & ~PAGE_MASK)
|
||||
return -EINVAL;
|
||||
|
||||
if (pgoff & ~PAGE_MASK) {
|
||||
printk(KERN_INFO "no pagemask in mmap\r\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
err = sys_mmap2(addr, len, prot, flags, fd, pgoff >> PAGE_SHIFT);
|
||||
out:
|
||||
return err;
|
||||
return sys_mmap_pgoff(addr, len, prot, flags, fd, pgoff >> PAGE_SHIFT);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -196,7 +196,7 @@ ENTRY(sys_call_table)
|
|||
.long sys_ni_syscall /* reserved for streams2 */
|
||||
.long sys_vfork /* 190 */
|
||||
.long sys_getrlimit
|
||||
.long sys_mmap2 /* mmap2 */
|
||||
.long sys_mmap_pgoff /* mmap2 */
|
||||
.long sys_truncate64
|
||||
.long sys_ftruncate64
|
||||
.long sys_stat64 /* 195 */
|
||||
|
|
|
|||
|
|
@ -67,28 +67,13 @@ SYSCALL_DEFINE6(32_mmap2, unsigned long, addr, unsigned long, len,
|
|||
unsigned long, prot, unsigned long, flags, unsigned long, fd,
|
||||
unsigned long, pgoff)
|
||||
{
|
||||
struct file * file = NULL;
|
||||
unsigned long error;
|
||||
|
||||
error = -EINVAL;
|
||||
if (pgoff & (~PAGE_MASK >> 12))
|
||||
goto out;
|
||||
pgoff >>= PAGE_SHIFT-12;
|
||||
|
||||
if (!(flags & MAP_ANONYMOUS)) {
|
||||
error = -EBADF;
|
||||
file = fget(fd);
|
||||
if (!file)
|
||||
goto out;
|
||||
}
|
||||
flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
|
||||
|
||||
down_write(¤t->mm->mmap_sem);
|
||||
error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
|
||||
up_write(¤t->mm->mmap_sem);
|
||||
if (file)
|
||||
fput(file);
|
||||
|
||||
error = sys_mmap_pgoff(addr, len, prot, flags, fd,
|
||||
pgoff >> (PAGE_SHIFT-12));
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -93,7 +93,8 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr,
|
|||
* We do not accept a shared mapping if it would violate
|
||||
* cache aliasing constraints.
|
||||
*/
|
||||
if ((flags & MAP_SHARED) && (addr & shm_align_mask))
|
||||
if ((flags & MAP_SHARED) &&
|
||||
((addr - (pgoff << PAGE_SHIFT)) & shm_align_mask))
|
||||
return -EINVAL;
|
||||
return addr;
|
||||
}
|
||||
|
|
@ -129,31 +130,6 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr,
|
|||
}
|
||||
}
|
||||
|
||||
/* common code for old and new mmaps */
|
||||
static inline unsigned long
|
||||
do_mmap2(unsigned long addr, unsigned long len, unsigned long prot,
|
||||
unsigned long flags, unsigned long fd, unsigned long pgoff)
|
||||
{
|
||||
unsigned long error = -EBADF;
|
||||
struct file * file = NULL;
|
||||
|
||||
flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
|
||||
if (!(flags & MAP_ANONYMOUS)) {
|
||||
file = fget(fd);
|
||||
if (!file)
|
||||
goto out;
|
||||
}
|
||||
|
||||
down_write(¤t->mm->mmap_sem);
|
||||
error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
|
||||
up_write(¤t->mm->mmap_sem);
|
||||
|
||||
if (file)
|
||||
fput(file);
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
|
||||
SYSCALL_DEFINE6(mips_mmap, unsigned long, addr, unsigned long, len,
|
||||
unsigned long, prot, unsigned long, flags, unsigned long,
|
||||
fd, off_t, offset)
|
||||
|
|
@ -164,7 +140,7 @@ SYSCALL_DEFINE6(mips_mmap, unsigned long, addr, unsigned long, len,
|
|||
if (offset & ~PAGE_MASK)
|
||||
goto out;
|
||||
|
||||
result = do_mmap2(addr, len, prot, flags, fd, offset >> PAGE_SHIFT);
|
||||
result = sys_mmap_pgoff(addr, len, prot, flags, fd, offset >> PAGE_SHIFT);
|
||||
|
||||
out:
|
||||
return result;
|
||||
|
|
@ -177,7 +153,7 @@ SYSCALL_DEFINE6(mips_mmap2, unsigned long, addr, unsigned long, len,
|
|||
if (pgoff & (~PAGE_MASK >> 12))
|
||||
return -EINVAL;
|
||||
|
||||
return do_mmap2(addr, len, prot, flags, fd, pgoff >> (PAGE_SHIFT-12));
|
||||
return sys_mmap_pgoff(addr, len, prot, flags, fd, pgoff >> (PAGE_SHIFT-12));
|
||||
}
|
||||
|
||||
save_static_function(sys_fork);
|
||||
|
|
|
|||
|
|
@ -1 +1,6 @@
|
|||
#include <asm-generic/mman.h>
|
||||
|
||||
#define MIN_MAP_ADDR PAGE_SIZE /* minimum fixed mmap address */
|
||||
|
||||
#define arch_mmap_check(addr, len, flags) \
|
||||
(((flags) & MAP_FIXED && (addr) < MIN_MAP_ADDR) ? -EINVAL : 0)
|
||||
|
|
|
|||
|
|
@ -578,7 +578,7 @@ ENTRY(sys_call_table)
|
|||
.long sys_ni_syscall /* reserved for streams2 */
|
||||
.long sys_vfork /* 190 */
|
||||
.long sys_getrlimit
|
||||
.long sys_mmap2
|
||||
.long sys_mmap_pgoff
|
||||
.long sys_truncate64
|
||||
.long sys_ftruncate64
|
||||
.long sys_stat64 /* 195 */
|
||||
|
|
|
|||
|
|
@ -23,47 +23,13 @@
|
|||
|
||||
#include <asm/uaccess.h>
|
||||
|
||||
#define MIN_MAP_ADDR PAGE_SIZE /* minimum fixed mmap address */
|
||||
|
||||
/*
|
||||
* memory mapping syscall
|
||||
*/
|
||||
asmlinkage long sys_mmap2(unsigned long addr, unsigned long len,
|
||||
unsigned long prot, unsigned long flags,
|
||||
unsigned long fd, unsigned long pgoff)
|
||||
{
|
||||
struct file *file = NULL;
|
||||
long error = -EINVAL;
|
||||
|
||||
flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
|
||||
|
||||
if (flags & MAP_FIXED && addr < MIN_MAP_ADDR)
|
||||
goto out;
|
||||
|
||||
error = -EBADF;
|
||||
if (!(flags & MAP_ANONYMOUS)) {
|
||||
file = fget(fd);
|
||||
if (!file)
|
||||
goto out;
|
||||
}
|
||||
|
||||
down_write(¤t->mm->mmap_sem);
|
||||
error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
|
||||
up_write(¤t->mm->mmap_sem);
|
||||
|
||||
if (file)
|
||||
fput(file);
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
|
||||
asmlinkage long old_mmap(unsigned long addr, unsigned long len,
|
||||
unsigned long prot, unsigned long flags,
|
||||
unsigned long fd, unsigned long offset)
|
||||
{
|
||||
if (offset & ~PAGE_MASK)
|
||||
return -EINVAL;
|
||||
return sys_mmap2(addr, len, prot, flags, fd, offset >> PAGE_SHIFT);
|
||||
return sys_mmap_pgoff(addr, len, prot, flags, fd, offset >> PAGE_SHIFT);
|
||||
}
|
||||
|
||||
struct sel_arg_struct {
|
||||
|
|
|
|||
|
|
@ -110,37 +110,14 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr,
|
|||
return addr;
|
||||
}
|
||||
|
||||
static unsigned long do_mmap2(unsigned long addr, unsigned long len,
|
||||
unsigned long prot, unsigned long flags, unsigned long fd,
|
||||
unsigned long pgoff)
|
||||
{
|
||||
struct file * file = NULL;
|
||||
unsigned long error = -EBADF;
|
||||
if (!(flags & MAP_ANONYMOUS)) {
|
||||
file = fget(fd);
|
||||
if (!file)
|
||||
goto out;
|
||||
}
|
||||
|
||||
flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
|
||||
|
||||
down_write(¤t->mm->mmap_sem);
|
||||
error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
|
||||
up_write(¤t->mm->mmap_sem);
|
||||
|
||||
if (file != NULL)
|
||||
fput(file);
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
|
||||
asmlinkage unsigned long sys_mmap2(unsigned long addr, unsigned long len,
|
||||
unsigned long prot, unsigned long flags, unsigned long fd,
|
||||
unsigned long pgoff)
|
||||
{
|
||||
/* Make sure the shift for mmap2 is constant (12), no matter what PAGE_SIZE
|
||||
we have. */
|
||||
return do_mmap2(addr, len, prot, flags, fd, pgoff >> (PAGE_SHIFT - 12));
|
||||
return sys_mmap_pgoff(addr, len, prot, flags, fd,
|
||||
pgoff >> (PAGE_SHIFT - 12));
|
||||
}
|
||||
|
||||
asmlinkage unsigned long sys_mmap(unsigned long addr, unsigned long len,
|
||||
|
|
@ -148,7 +125,8 @@ asmlinkage unsigned long sys_mmap(unsigned long addr, unsigned long len,
|
|||
unsigned long offset)
|
||||
{
|
||||
if (!(offset & ~PAGE_MASK)) {
|
||||
return do_mmap2(addr, len, prot, flags, fd, offset >> PAGE_SHIFT);
|
||||
return sys_mmap_pgoff(addr, len, prot, flags, fd,
|
||||
offset >> PAGE_SHIFT);
|
||||
} else {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -236,14 +236,10 @@ typedef elf_vrregset_t elf_fpxregset_t;
|
|||
#ifdef __powerpc64__
|
||||
# define SET_PERSONALITY(ex) \
|
||||
do { \
|
||||
unsigned long new_flags = 0; \
|
||||
if ((ex).e_ident[EI_CLASS] == ELFCLASS32) \
|
||||
new_flags = _TIF_32BIT; \
|
||||
if ((current_thread_info()->flags & _TIF_32BIT) \
|
||||
!= new_flags) \
|
||||
set_thread_flag(TIF_ABI_PENDING); \
|
||||
set_thread_flag(TIF_32BIT); \
|
||||
else \
|
||||
clear_thread_flag(TIF_ABI_PENDING); \
|
||||
clear_thread_flag(TIF_32BIT); \
|
||||
if (personality(current->personality) != PER_LINUX32) \
|
||||
set_personality(PER_LINUX | \
|
||||
(current->personality & (~PER_MASK))); \
|
||||
|
|
|
|||
|
|
@ -87,5 +87,10 @@ struct exception_table_entry;
|
|||
void sort_ex_table(struct exception_table_entry *start,
|
||||
struct exception_table_entry *finish);
|
||||
|
||||
#ifdef CONFIG_MODVERSIONS
|
||||
#define ARCH_RELOCATES_KCRCTAB
|
||||
|
||||
extern const unsigned long reloc_start[];
|
||||
#endif
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* _ASM_POWERPC_MODULE_H */
|
||||
|
|
|
|||
|
|
@ -111,7 +111,6 @@ static inline struct thread_info *current_thread_info(void)
|
|||
#define TIF_NOTIFY_RESUME 13 /* callback before returning to user */
|
||||
#define TIF_FREEZE 14 /* Freezing for suspend */
|
||||
#define TIF_RUNLATCH 15 /* Is the runlatch enabled? */
|
||||
#define TIF_ABI_PENDING 16 /* 32/64 bit switch needed */
|
||||
|
||||
/* as above, but as bit values */
|
||||
#define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE)
|
||||
|
|
@ -129,7 +128,6 @@ static inline struct thread_info *current_thread_info(void)
|
|||
#define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME)
|
||||
#define _TIF_FREEZE (1<<TIF_FREEZE)
|
||||
#define _TIF_RUNLATCH (1<<TIF_RUNLATCH)
|
||||
#define _TIF_ABI_PENDING (1<<TIF_ABI_PENDING)
|
||||
#define _TIF_SYSCALL_T_OR_A (_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SECCOMP)
|
||||
|
||||
#define _TIF_USER_WORK_MASK (_TIF_SIGPENDING | _TIF_NEED_RESCHED | \
|
||||
|
|
|
|||
|
|
@ -642,10 +642,14 @@ static int emulate_spe(struct pt_regs *regs, unsigned int reg,
|
|||
*/
|
||||
static int emulate_vsx(unsigned char __user *addr, unsigned int reg,
|
||||
unsigned int areg, struct pt_regs *regs,
|
||||
unsigned int flags, unsigned int length)
|
||||
unsigned int flags, unsigned int length,
|
||||
unsigned int elsize)
|
||||
{
|
||||
char *ptr;
|
||||
unsigned long *lptr;
|
||||
int ret = 0;
|
||||
int sw = 0;
|
||||
int i, j;
|
||||
|
||||
flush_vsx_to_thread(current);
|
||||
|
||||
|
|
@ -654,19 +658,35 @@ static int emulate_vsx(unsigned char __user *addr, unsigned int reg,
|
|||
else
|
||||
ptr = (char *) ¤t->thread.vr[reg - 32];
|
||||
|
||||
if (flags & ST)
|
||||
ret = __copy_to_user(addr, ptr, length);
|
||||
else {
|
||||
if (flags & SPLT){
|
||||
ret = __copy_from_user(ptr, addr, length);
|
||||
ptr += length;
|
||||
lptr = (unsigned long *) ptr;
|
||||
|
||||
if (flags & SW)
|
||||
sw = elsize-1;
|
||||
|
||||
for (j = 0; j < length; j += elsize) {
|
||||
for (i = 0; i < elsize; ++i) {
|
||||
if (flags & ST)
|
||||
ret |= __put_user(ptr[i^sw], addr + i);
|
||||
else
|
||||
ret |= __get_user(ptr[i^sw], addr + i);
|
||||
}
|
||||
ret |= __copy_from_user(ptr, addr, length);
|
||||
ptr += elsize;
|
||||
addr += elsize;
|
||||
}
|
||||
if (flags & U)
|
||||
regs->gpr[areg] = regs->dar;
|
||||
if (ret)
|
||||
|
||||
if (!ret) {
|
||||
if (flags & U)
|
||||
regs->gpr[areg] = regs->dar;
|
||||
|
||||
/* Splat load copies the same data to top and bottom 8 bytes */
|
||||
if (flags & SPLT)
|
||||
lptr[1] = lptr[0];
|
||||
/* For 8 byte loads, zero the top 8 bytes */
|
||||
else if (!(flags & ST) && (8 == length))
|
||||
lptr[1] = 0;
|
||||
} else
|
||||
return -EFAULT;
|
||||
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
|
@ -767,16 +787,25 @@ int fix_alignment(struct pt_regs *regs)
|
|||
|
||||
#ifdef CONFIG_VSX
|
||||
if ((instruction & 0xfc00003e) == 0x7c000018) {
|
||||
/* Additional register addressing bit (64 VSX vs 32 FPR/GPR */
|
||||
unsigned int elsize;
|
||||
|
||||
/* Additional register addressing bit (64 VSX vs 32 FPR/GPR) */
|
||||
reg |= (instruction & 0x1) << 5;
|
||||
/* Simple inline decoder instead of a table */
|
||||
/* VSX has only 8 and 16 byte memory accesses */
|
||||
nb = 8;
|
||||
if (instruction & 0x200)
|
||||
nb = 16;
|
||||
else if (instruction & 0x080)
|
||||
nb = 8;
|
||||
else
|
||||
nb = 4;
|
||||
|
||||
/* Vector stores in little-endian mode swap individual
|
||||
elements, so process them separately */
|
||||
elsize = 4;
|
||||
if (instruction & 0x80)
|
||||
elsize = 8;
|
||||
|
||||
flags = 0;
|
||||
if (regs->msr & MSR_LE)
|
||||
flags |= SW;
|
||||
if (instruction & 0x100)
|
||||
flags |= ST;
|
||||
if (instruction & 0x040)
|
||||
|
|
@ -787,7 +816,7 @@ int fix_alignment(struct pt_regs *regs)
|
|||
nb = 8;
|
||||
}
|
||||
PPC_WARN_EMULATED(vsx);
|
||||
return emulate_vsx(addr, reg, areg, regs, flags, nb);
|
||||
return emulate_vsx(addr, reg, areg, regs, flags, nb, elsize);
|
||||
}
|
||||
#endif
|
||||
/* A size of 0 indicates an instruction we don't support, with
|
||||
|
|
|
|||
|
|
@ -1107,6 +1107,12 @@ void __devinit pcibios_setup_bus_devices(struct pci_bus *bus)
|
|||
list_for_each_entry(dev, &bus->devices, bus_list) {
|
||||
struct dev_archdata *sd = &dev->dev.archdata;
|
||||
|
||||
/* Cardbus can call us to add new devices to a bus, so ignore
|
||||
* those who are already fully discovered
|
||||
*/
|
||||
if (dev->is_added)
|
||||
continue;
|
||||
|
||||
/* Setup OF node pointer in archdata */
|
||||
sd->of_node = pci_device_to_OF_node(dev);
|
||||
|
||||
|
|
@ -1147,6 +1153,13 @@ void __devinit pcibios_fixup_bus(struct pci_bus *bus)
|
|||
}
|
||||
EXPORT_SYMBOL(pcibios_fixup_bus);
|
||||
|
||||
void __devinit pci_fixup_cardbus(struct pci_bus *bus)
|
||||
{
|
||||
/* Now fixup devices on that bus */
|
||||
pcibios_setup_bus_devices(bus);
|
||||
}
|
||||
|
||||
|
||||
static int skip_isa_ioresource_align(struct pci_dev *dev)
|
||||
{
|
||||
if ((ppc_pci_flags & PPC_PCI_CAN_SKIP_ISA_ALIGN) &&
|
||||
|
|
|
|||
|
|
@ -554,18 +554,6 @@ void exit_thread(void)
|
|||
|
||||
void flush_thread(void)
|
||||
{
|
||||
#ifdef CONFIG_PPC64
|
||||
struct thread_info *t = current_thread_info();
|
||||
|
||||
if (test_ti_thread_flag(t, TIF_ABI_PENDING)) {
|
||||
clear_ti_thread_flag(t, TIF_ABI_PENDING);
|
||||
if (test_ti_thread_flag(t, TIF_32BIT))
|
||||
clear_ti_thread_flag(t, TIF_32BIT);
|
||||
else
|
||||
set_ti_thread_flag(t, TIF_32BIT);
|
||||
}
|
||||
#endif
|
||||
|
||||
discard_lazy_cpu_state();
|
||||
|
||||
if (current->thread.dabr) {
|
||||
|
|
|
|||
|
|
@ -140,7 +140,6 @@ static inline unsigned long do_mmap2(unsigned long addr, size_t len,
|
|||
unsigned long prot, unsigned long flags,
|
||||
unsigned long fd, unsigned long off, int shift)
|
||||
{
|
||||
struct file * file = NULL;
|
||||
unsigned long ret = -EINVAL;
|
||||
|
||||
if (!arch_validate_prot(prot))
|
||||
|
|
@ -151,20 +150,8 @@ static inline unsigned long do_mmap2(unsigned long addr, size_t len,
|
|||
goto out;
|
||||
off >>= shift;
|
||||
}
|
||||
|
||||
ret = -EBADF;
|
||||
if (!(flags & MAP_ANONYMOUS)) {
|
||||
if (!(file = fget(fd)))
|
||||
goto out;
|
||||
}
|
||||
|
||||
flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
|
||||
|
||||
down_write(¤t->mm->mmap_sem);
|
||||
ret = do_mmap_pgoff(file, addr, len, prot, flags, off);
|
||||
up_write(¤t->mm->mmap_sem);
|
||||
if (file)
|
||||
fput(file);
|
||||
ret = sys_mmap_pgoff(addr, len, prot, flags, fd, off);
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -58,7 +58,7 @@ _GLOBAL(load_up_altivec)
|
|||
* all 1's
|
||||
*/
|
||||
mfspr r4,SPRN_VRSAVE
|
||||
cmpdi 0,r4,0
|
||||
cmpwi 0,r4,0
|
||||
bne+ 1f
|
||||
li r4,-1
|
||||
mtspr SPRN_VRSAVE,r4
|
||||
|
|
|
|||
|
|
@ -38,6 +38,9 @@ jiffies = jiffies_64 + 4;
|
|||
#endif
|
||||
SECTIONS
|
||||
{
|
||||
. = 0;
|
||||
reloc_start = .;
|
||||
|
||||
. = KERNELBASE;
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -392,8 +392,22 @@ DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8536, quirk_fsl_pcie_header);
|
|||
DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8641, quirk_fsl_pcie_header);
|
||||
DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8641D, quirk_fsl_pcie_header);
|
||||
DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8610, quirk_fsl_pcie_header);
|
||||
DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1011E, quirk_fsl_pcie_header);
|
||||
DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1011, quirk_fsl_pcie_header);
|
||||
DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1013E, quirk_fsl_pcie_header);
|
||||
DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1013, quirk_fsl_pcie_header);
|
||||
DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1020E, quirk_fsl_pcie_header);
|
||||
DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1020, quirk_fsl_pcie_header);
|
||||
DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1022E, quirk_fsl_pcie_header);
|
||||
DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1022, quirk_fsl_pcie_header);
|
||||
DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2010E, quirk_fsl_pcie_header);
|
||||
DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2010, quirk_fsl_pcie_header);
|
||||
DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2020E, quirk_fsl_pcie_header);
|
||||
DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2020, quirk_fsl_pcie_header);
|
||||
DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P4040E, quirk_fsl_pcie_header);
|
||||
DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P4040, quirk_fsl_pcie_header);
|
||||
DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P4080E, quirk_fsl_pcie_header);
|
||||
DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P4080, quirk_fsl_pcie_header);
|
||||
#endif /* CONFIG_PPC_85xx || CONFIG_PPC_86xx */
|
||||
|
||||
#if defined(CONFIG_PPC_83xx) || defined(CONFIG_PPC_MPC512x)
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
#ifndef __LINUX_KVM_S390_H
|
||||
#define __LINUX_KVM_S390_H
|
||||
|
||||
/*
|
||||
* asm-s390/kvm.h - KVM s390 specific structures and definitions
|
||||
*
|
||||
|
|
@ -15,6 +14,8 @@
|
|||
*/
|
||||
#include <linux/types.h>
|
||||
|
||||
#define __KVM_S390
|
||||
|
||||
/* for KVM_GET_REGS and KVM_SET_REGS */
|
||||
struct kvm_regs {
|
||||
/* general purpose regs for s390 */
|
||||
|
|
|
|||
|
|
@ -683,38 +683,6 @@ struct mmap_arg_struct_emu31 {
|
|||
u32 offset;
|
||||
};
|
||||
|
||||
/* common code for old and new mmaps */
|
||||
static inline long do_mmap2(
|
||||
unsigned long addr, unsigned long len,
|
||||
unsigned long prot, unsigned long flags,
|
||||
unsigned long fd, unsigned long pgoff)
|
||||
{
|
||||
struct file * file = NULL;
|
||||
unsigned long error = -EBADF;
|
||||
|
||||
flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
|
||||
if (!(flags & MAP_ANONYMOUS)) {
|
||||
file = fget(fd);
|
||||
if (!file)
|
||||
goto out;
|
||||
}
|
||||
|
||||
down_write(¤t->mm->mmap_sem);
|
||||
error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
|
||||
if (!IS_ERR((void *) error) && error + len >= 0x80000000ULL) {
|
||||
/* Result is out of bounds. */
|
||||
do_munmap(current->mm, addr, len);
|
||||
error = -ENOMEM;
|
||||
}
|
||||
up_write(¤t->mm->mmap_sem);
|
||||
|
||||
if (file)
|
||||
fput(file);
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
|
||||
|
||||
asmlinkage unsigned long
|
||||
old32_mmap(struct mmap_arg_struct_emu31 __user *arg)
|
||||
{
|
||||
|
|
@ -728,7 +696,8 @@ old32_mmap(struct mmap_arg_struct_emu31 __user *arg)
|
|||
if (a.offset & ~PAGE_MASK)
|
||||
goto out;
|
||||
|
||||
error = do_mmap2(a.addr, a.len, a.prot, a.flags, a.fd, a.offset >> PAGE_SHIFT);
|
||||
error = sys_mmap_pgoff(a.addr, a.len, a.prot, a.flags, a.fd,
|
||||
a.offset >> PAGE_SHIFT);
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
|
|
@ -741,7 +710,7 @@ sys32_mmap2(struct mmap_arg_struct_emu31 __user *arg)
|
|||
|
||||
if (copy_from_user(&a, arg, sizeof(a)))
|
||||
goto out;
|
||||
error = do_mmap2(a.addr, a.len, a.prot, a.flags, a.fd, a.offset);
|
||||
error = sys_mmap_pgoff(a.addr, a.len, a.prot, a.flags, a.fd, a.offset);
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -571,6 +571,7 @@ pgm_svcper:
|
|||
mvc __THREAD_per+__PER_access_id(1,%r8),__LC_PER_ACCESS_ID
|
||||
oi __TI_flags+3(%r9),_TIF_SINGLE_STEP # set TIF_SINGLE_STEP
|
||||
TRACE_IRQS_ON
|
||||
lm %r2,%r6,SP_R2(%r15) # load svc arguments
|
||||
stosm __SF_EMPTY(%r15),0x03 # reenable interrupts
|
||||
b BASED(sysc_do_svc)
|
||||
|
||||
|
|
|
|||
|
|
@ -549,6 +549,7 @@ pgm_svcper:
|
|||
mvc __THREAD_per+__PER_access_id(1,%r8),__LC_PER_ACCESS_ID
|
||||
oi __TI_flags+7(%r9),_TIF_SINGLE_STEP # set TIF_SINGLE_STEP
|
||||
TRACE_IRQS_ON
|
||||
lmg %r2,%r6,SP_R2(%r15) # load svc arguments
|
||||
stosm __SF_EMPTY(%r15),0x03 # reenable interrupts
|
||||
j sysc_do_svc
|
||||
|
||||
|
|
|
|||
|
|
@ -83,6 +83,8 @@ startup_continue:
|
|||
slr %r0,%r0 # set cpuid to zero
|
||||
sigp %r1,%r0,0x12 # switch to esame mode
|
||||
sam64 # switch to 64 bit mode
|
||||
llgfr %r13,%r13 # clear high-order half of base reg
|
||||
lmh %r0,%r15,.Lzero64-.LPG1(%r13) # clear high-order half
|
||||
lctlg %c0,%c15,.Lctl-.LPG1(%r13) # load control registers
|
||||
lg %r12,.Lparmaddr-.LPG1(%r13) # pointer to parameter area
|
||||
# move IPL device to lowcore
|
||||
|
|
@ -127,6 +129,7 @@ startup_continue:
|
|||
.L4malign:.quad 0xffffffffffc00000
|
||||
.Lscan2g:.quad 0x80000000 + 0x20000 - 8 # 2GB + 128K - 8
|
||||
.Lnop: .long 0x07000700
|
||||
.Lzero64:.fill 16,4,0x0
|
||||
#ifdef CONFIG_ZFCPDUMP
|
||||
.Lcurrent_cpu:
|
||||
.long 0x0
|
||||
|
|
|
|||
|
|
@ -32,32 +32,6 @@
|
|||
#include <asm/uaccess.h>
|
||||
#include "entry.h"
|
||||
|
||||
/* common code for old and new mmaps */
|
||||
static inline long do_mmap2(
|
||||
unsigned long addr, unsigned long len,
|
||||
unsigned long prot, unsigned long flags,
|
||||
unsigned long fd, unsigned long pgoff)
|
||||
{
|
||||
long error = -EBADF;
|
||||
struct file * file = NULL;
|
||||
|
||||
flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
|
||||
if (!(flags & MAP_ANONYMOUS)) {
|
||||
file = fget(fd);
|
||||
if (!file)
|
||||
goto out;
|
||||
}
|
||||
|
||||
down_write(¤t->mm->mmap_sem);
|
||||
error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
|
||||
up_write(¤t->mm->mmap_sem);
|
||||
|
||||
if (file)
|
||||
fput(file);
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
|
||||
/*
|
||||
* Perform the select(nd, in, out, ex, tv) and mmap() system
|
||||
* calls. Linux for S/390 isn't able to handle more than 5
|
||||
|
|
@ -81,7 +55,7 @@ SYSCALL_DEFINE1(mmap2, struct mmap_arg_struct __user *, arg)
|
|||
|
||||
if (copy_from_user(&a, arg, sizeof(a)))
|
||||
goto out;
|
||||
error = do_mmap2(a.addr, a.len, a.prot, a.flags, a.fd, a.offset);
|
||||
error = sys_mmap_pgoff(a.addr, a.len, a.prot, a.flags, a.fd, a.offset);
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
|
|
@ -98,7 +72,7 @@ SYSCALL_DEFINE1(s390_old_mmap, struct mmap_arg_struct __user *, arg)
|
|||
if (a.offset & ~PAGE_MASK)
|
||||
goto out;
|
||||
|
||||
error = do_mmap2(a.addr, a.len, a.prot, a.flags, a.fd, a.offset >> PAGE_SHIFT);
|
||||
error = sys_mmap_pgoff(a.addr, a.len, a.prot, a.flags, a.fd, a.offset >> PAGE_SHIFT);
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -213,7 +213,7 @@ static int handle_instruction_and_prog(struct kvm_vcpu *vcpu)
|
|||
return rc2;
|
||||
}
|
||||
|
||||
static const intercept_handler_t intercept_funcs[0x48 >> 2] = {
|
||||
static const intercept_handler_t intercept_funcs[] = {
|
||||
[0x00 >> 2] = handle_noop,
|
||||
[0x04 >> 2] = handle_instruction,
|
||||
[0x08 >> 2] = handle_prog,
|
||||
|
|
@ -230,7 +230,7 @@ int kvm_handle_sie_intercept(struct kvm_vcpu *vcpu)
|
|||
intercept_handler_t func;
|
||||
u8 code = vcpu->arch.sie_block->icptcode;
|
||||
|
||||
if (code & 3 || code > 0x48)
|
||||
if (code & 3 || (code >> 2) >= ARRAY_SIZE(intercept_funcs))
|
||||
return -ENOTSUPP;
|
||||
func = intercept_funcs[code >> 2];
|
||||
if (func)
|
||||
|
|
|
|||
|
|
@ -116,10 +116,16 @@ long kvm_arch_dev_ioctl(struct file *filp,
|
|||
|
||||
int kvm_dev_ioctl_check_extension(long ext)
|
||||
{
|
||||
int r;
|
||||
|
||||
switch (ext) {
|
||||
case KVM_CAP_S390_PSW:
|
||||
r = 1;
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
r = 0;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
/* Section: vm related */
|
||||
|
|
@ -419,8 +425,10 @@ static int kvm_arch_vcpu_ioctl_set_initial_psw(struct kvm_vcpu *vcpu, psw_t psw)
|
|||
vcpu_load(vcpu);
|
||||
if (atomic_read(&vcpu->arch.sie_block->cpuflags) & CPUSTAT_RUNNING)
|
||||
rc = -EBUSY;
|
||||
else
|
||||
vcpu->arch.sie_block->gpsw = psw;
|
||||
else {
|
||||
vcpu->run->psw_mask = psw.mask;
|
||||
vcpu->run->psw_addr = psw.addr;
|
||||
}
|
||||
vcpu_put(vcpu);
|
||||
return rc;
|
||||
}
|
||||
|
|
@ -508,9 +516,6 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
|
|||
|
||||
switch (kvm_run->exit_reason) {
|
||||
case KVM_EXIT_S390_SIEIC:
|
||||
vcpu->arch.sie_block->gpsw.mask = kvm_run->s390_sieic.mask;
|
||||
vcpu->arch.sie_block->gpsw.addr = kvm_run->s390_sieic.addr;
|
||||
break;
|
||||
case KVM_EXIT_UNKNOWN:
|
||||
case KVM_EXIT_INTR:
|
||||
case KVM_EXIT_S390_RESET:
|
||||
|
|
@ -519,6 +524,9 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
|
|||
BUG();
|
||||
}
|
||||
|
||||
vcpu->arch.sie_block->gpsw.mask = kvm_run->psw_mask;
|
||||
vcpu->arch.sie_block->gpsw.addr = kvm_run->psw_addr;
|
||||
|
||||
might_fault();
|
||||
|
||||
do {
|
||||
|
|
@ -538,8 +546,6 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
|
|||
/* intercept cannot be handled in-kernel, prepare kvm-run */
|
||||
kvm_run->exit_reason = KVM_EXIT_S390_SIEIC;
|
||||
kvm_run->s390_sieic.icptcode = vcpu->arch.sie_block->icptcode;
|
||||
kvm_run->s390_sieic.mask = vcpu->arch.sie_block->gpsw.mask;
|
||||
kvm_run->s390_sieic.addr = vcpu->arch.sie_block->gpsw.addr;
|
||||
kvm_run->s390_sieic.ipa = vcpu->arch.sie_block->ipa;
|
||||
kvm_run->s390_sieic.ipb = vcpu->arch.sie_block->ipb;
|
||||
rc = 0;
|
||||
|
|
@ -551,6 +557,9 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
|
|||
rc = 0;
|
||||
}
|
||||
|
||||
kvm_run->psw_mask = vcpu->arch.sie_block->gpsw.mask;
|
||||
kvm_run->psw_addr = vcpu->arch.sie_block->gpsw.addr;
|
||||
|
||||
if (vcpu->sigset_active)
|
||||
sigprocmask(SIG_SETMASK, &sigsaved, NULL);
|
||||
|
||||
|
|
|
|||
|
|
@ -188,9 +188,9 @@ static int __sigp_set_prefix(struct kvm_vcpu *vcpu, u16 cpu_addr, u32 address,
|
|||
|
||||
/* make sure that the new value is valid memory */
|
||||
address = address & 0x7fffe000u;
|
||||
if ((copy_from_guest(vcpu, &tmp,
|
||||
(u64) (address + vcpu->arch.sie_block->gmsor) , 1)) ||
|
||||
(copy_from_guest(vcpu, &tmp, (u64) (address +
|
||||
if ((copy_from_user(&tmp, (void __user *)
|
||||
(address + vcpu->arch.sie_block->gmsor) , 1)) ||
|
||||
(copy_from_user(&tmp, (void __user *)(address +
|
||||
vcpu->arch.sie_block->gmsor + PAGE_SIZE), 1))) {
|
||||
*reg |= SIGP_STAT_INVALID_PARAMETER;
|
||||
return 1; /* invalid parameter */
|
||||
|
|
|
|||
|
|
@ -36,34 +36,16 @@ asmlinkage long
|
|||
sys_mmap2(unsigned long addr, unsigned long len, unsigned long prot,
|
||||
unsigned long flags, unsigned long fd, unsigned long pgoff)
|
||||
{
|
||||
int error = -EBADF;
|
||||
struct file *file = NULL;
|
||||
|
||||
if (pgoff & (~PAGE_MASK >> 12))
|
||||
return -EINVAL;
|
||||
|
||||
flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
|
||||
if (!(flags & MAP_ANONYMOUS)) {
|
||||
file = fget(fd);
|
||||
if (!file)
|
||||
return error;
|
||||
}
|
||||
|
||||
down_write(¤t->mm->mmap_sem);
|
||||
error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
|
||||
up_write(¤t->mm->mmap_sem);
|
||||
|
||||
if (file)
|
||||
fput(file);
|
||||
|
||||
return error;
|
||||
return sys_mmap_pgoff(addr, len, prot, flags, fd, pgoff);
|
||||
}
|
||||
|
||||
asmlinkage long
|
||||
sys_mmap(unsigned long addr, unsigned long len, unsigned long prot,
|
||||
unsigned long flags, unsigned long fd, off_t pgoff)
|
||||
unsigned long flags, unsigned long fd, off_t offset)
|
||||
{
|
||||
return sys_mmap2(addr, len, prot, flags, fd, pgoff >> PAGE_SHIFT);
|
||||
if (unlikely(offset & ~PAGE_MASK))
|
||||
return -EINVAL;
|
||||
return sys_mmap_pgoff(addr, len, prot, flags, fd, offset >> PAGE_SHIFT);
|
||||
}
|
||||
|
||||
asmlinkage long
|
||||
|
|
|
|||
|
|
@ -344,7 +344,8 @@ static inline void set_pte(pte_t *ptep, pte_t pte)
|
|||
#define pte_special(pte) ((pte).pte_low & _PAGE_SPECIAL)
|
||||
|
||||
#ifdef CONFIG_X2TLB
|
||||
#define pte_write(pte) ((pte).pte_high & _PAGE_EXT_USER_WRITE)
|
||||
#define pte_write(pte) \
|
||||
((pte).pte_high & (_PAGE_EXT_USER_WRITE | _PAGE_EXT_KERN_WRITE))
|
||||
#else
|
||||
#define pte_write(pte) ((pte).pte_low & _PAGE_RW)
|
||||
#endif
|
||||
|
|
@ -358,7 +359,7 @@ static inline pte_t pte_##fn(pte_t pte) { pte.pte_##h op; return pte; }
|
|||
* individually toggled (and user permissions are entirely decoupled from
|
||||
* kernel permissions), we attempt to couple them a bit more sanely here.
|
||||
*/
|
||||
PTE_BIT_FUNC(high, wrprotect, &= ~_PAGE_EXT_USER_WRITE);
|
||||
PTE_BIT_FUNC(high, wrprotect, &= ~(_PAGE_EXT_USER_WRITE | _PAGE_EXT_KERN_WRITE));
|
||||
PTE_BIT_FUNC(high, mkwrite, |= _PAGE_EXT_USER_WRITE | _PAGE_EXT_KERN_WRITE);
|
||||
PTE_BIT_FUNC(high, mkhuge, |= _PAGE_SZHUGE);
|
||||
#else
|
||||
|
|
|
|||
|
|
@ -367,7 +367,7 @@ void exit_thread(void)
|
|||
void flush_thread(void)
|
||||
{
|
||||
|
||||
/* Called by fs/exec.c (flush_old_exec) to remove traces of a
|
||||
/* Called by fs/exec.c (setup_new_exec) to remove traces of a
|
||||
* previously running executable. */
|
||||
#ifdef CONFIG_SH_FPU
|
||||
if (last_task_used_math == current) {
|
||||
|
|
|
|||
|
|
@ -28,37 +28,13 @@
|
|||
#include <asm/cacheflush.h>
|
||||
#include <asm/cachectl.h>
|
||||
|
||||
static inline long
|
||||
do_mmap2(unsigned long addr, unsigned long len, unsigned long prot,
|
||||
unsigned long flags, int fd, unsigned long pgoff)
|
||||
{
|
||||
int error = -EBADF;
|
||||
struct file *file = NULL;
|
||||
|
||||
flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
|
||||
if (!(flags & MAP_ANONYMOUS)) {
|
||||
file = fget(fd);
|
||||
if (!file)
|
||||
goto out;
|
||||
}
|
||||
|
||||
down_write(¤t->mm->mmap_sem);
|
||||
error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
|
||||
up_write(¤t->mm->mmap_sem);
|
||||
|
||||
if (file)
|
||||
fput(file);
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
|
||||
asmlinkage int old_mmap(unsigned long addr, unsigned long len,
|
||||
unsigned long prot, unsigned long flags,
|
||||
int fd, unsigned long off)
|
||||
{
|
||||
if (off & ~PAGE_MASK)
|
||||
return -EINVAL;
|
||||
return do_mmap2(addr, len, prot, flags, fd, off>>PAGE_SHIFT);
|
||||
return sys_mmap_pgoff(addr, len, prot, flags, fd, off>>PAGE_SHIFT);
|
||||
}
|
||||
|
||||
asmlinkage long sys_mmap2(unsigned long addr, unsigned long len,
|
||||
|
|
@ -74,7 +50,7 @@ asmlinkage long sys_mmap2(unsigned long addr, unsigned long len,
|
|||
|
||||
pgoff >>= PAGE_SHIFT - 12;
|
||||
|
||||
return do_mmap2(addr, len, prot, flags, fd, pgoff);
|
||||
return sys_mmap_pgoff(addr, len, prot, flags, fd, pgoff);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -54,7 +54,8 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr,
|
|||
/* We do not accept a shared mapping if it would violate
|
||||
* cache aliasing constraints.
|
||||
*/
|
||||
if ((flags & MAP_SHARED) && (addr & shm_align_mask))
|
||||
if ((flags & MAP_SHARED) &&
|
||||
((addr - (pgoff << PAGE_SHIFT)) & shm_align_mask))
|
||||
return -EINVAL;
|
||||
return addr;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@ AS := $(AS) -32
|
|||
LDFLAGS := -m elf32_sparc
|
||||
CHECKFLAGS += -D__sparc__
|
||||
export BITS := 32
|
||||
UTS_MACHINE := sparc
|
||||
|
||||
#KBUILD_CFLAGS += -g -pipe -fcall-used-g5 -fcall-used-g7
|
||||
KBUILD_CFLAGS += -m32 -pipe -mno-fpu -fcall-used-g5 -fcall-used-g7
|
||||
|
|
@ -46,6 +47,7 @@ CHECKFLAGS += -D__sparc__ -D__sparc_v9__ -D__arch64__ -m64
|
|||
|
||||
LDFLAGS := -m elf64_sparc
|
||||
export BITS := 64
|
||||
UTS_MACHINE := sparc64
|
||||
|
||||
KBUILD_CFLAGS += -m64 -pipe -mno-fpu -mcpu=ultrasparc -mcmodel=medlow \
|
||||
-ffixed-g4 -ffixed-g5 -fcall-used-g7 -Wno-sign-compare \
|
||||
|
|
|
|||
|
|
@ -196,17 +196,10 @@ static inline unsigned int sparc64_elf_hwcap(void)
|
|||
#define ELF_PLATFORM (NULL)
|
||||
|
||||
#define SET_PERSONALITY(ex) \
|
||||
do { unsigned long new_flags = current_thread_info()->flags; \
|
||||
new_flags &= _TIF_32BIT; \
|
||||
if ((ex).e_ident[EI_CLASS] == ELFCLASS32) \
|
||||
new_flags |= _TIF_32BIT; \
|
||||
do { if ((ex).e_ident[EI_CLASS] == ELFCLASS32) \
|
||||
set_thread_flag(TIF_32BIT); \
|
||||
else \
|
||||
new_flags &= ~_TIF_32BIT; \
|
||||
if ((current_thread_info()->flags & _TIF_32BIT) \
|
||||
!= new_flags) \
|
||||
set_thread_flag(TIF_ABI_PENDING); \
|
||||
else \
|
||||
clear_thread_flag(TIF_ABI_PENDING); \
|
||||
clear_thread_flag(TIF_32BIT); \
|
||||
/* flush_thread will update pgd cache */ \
|
||||
if (personality(current->personality) != PER_LINUX32) \
|
||||
set_personality(PER_LINUX | \
|
||||
|
|
|
|||
|
|
@ -227,12 +227,11 @@ register struct thread_info *current_thread_info_reg asm("g6");
|
|||
/* flag bit 8 is available */
|
||||
#define TIF_SECCOMP 9 /* secure computing */
|
||||
#define TIF_SYSCALL_AUDIT 10 /* syscall auditing active */
|
||||
/* flag bit 11 is available */
|
||||
/* NOTE: Thread flags >= 12 should be ones we have no interest
|
||||
* in using in assembly, else we can't use the mask as
|
||||
* an immediate value in instructions such as andcc.
|
||||
*/
|
||||
#define TIF_ABI_PENDING 12
|
||||
/* flag bit 12 is available */
|
||||
#define TIF_MEMDIE 13
|
||||
#define TIF_POLLING_NRFLAG 14
|
||||
#define TIF_FREEZE 15 /* is freezing for suspend */
|
||||
|
|
@ -246,7 +245,6 @@ register struct thread_info *current_thread_info_reg asm("g6");
|
|||
#define _TIF_32BIT (1<<TIF_32BIT)
|
||||
#define _TIF_SECCOMP (1<<TIF_SECCOMP)
|
||||
#define _TIF_SYSCALL_AUDIT (1<<TIF_SYSCALL_AUDIT)
|
||||
#define _TIF_ABI_PENDING (1<<TIF_ABI_PENDING)
|
||||
#define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG)
|
||||
#define _TIF_FREEZE (1<<TIF_FREEZE)
|
||||
|
||||
|
|
|
|||
|
|
@ -1242,13 +1242,13 @@ int ldc_bind(struct ldc_channel *lp, const char *name)
|
|||
snprintf(lp->tx_irq_name, LDC_IRQ_NAME_MAX, "%s TX", name);
|
||||
|
||||
err = request_irq(lp->cfg.rx_irq, ldc_rx,
|
||||
IRQF_SAMPLE_RANDOM | IRQF_DISABLED | IRQF_SHARED,
|
||||
IRQF_SAMPLE_RANDOM | IRQF_DISABLED,
|
||||
lp->rx_irq_name, lp);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = request_irq(lp->cfg.tx_irq, ldc_tx,
|
||||
IRQF_SAMPLE_RANDOM | IRQF_DISABLED | IRQF_SHARED,
|
||||
IRQF_SAMPLE_RANDOM | IRQF_DISABLED,
|
||||
lp->tx_irq_name, lp);
|
||||
if (err) {
|
||||
free_irq(lp->cfg.rx_irq, lp);
|
||||
|
|
|
|||
|
|
@ -96,7 +96,6 @@ notrace __kprobes void perfctr_irq(int irq, struct pt_regs *regs)
|
|||
int cpu = smp_processor_id();
|
||||
|
||||
clear_softint(1 << irq);
|
||||
pcr_ops->write(PCR_PIC_PRIV);
|
||||
|
||||
local_cpu_data().__nmi_count++;
|
||||
|
||||
|
|
@ -105,6 +104,8 @@ notrace __kprobes void perfctr_irq(int irq, struct pt_regs *regs)
|
|||
if (notify_die(DIE_NMI, "nmi", regs, 0,
|
||||
pt_regs_trap_type(regs), SIGINT) == NOTIFY_STOP)
|
||||
touched = 1;
|
||||
else
|
||||
pcr_ops->write(PCR_PIC_PRIV);
|
||||
|
||||
sum = kstat_irqs_cpu(0, cpu);
|
||||
if (__get_cpu_var(nmi_touch)) {
|
||||
|
|
|
|||
|
|
@ -104,9 +104,19 @@ static int of_bus_pci_map(u32 *addr, const u32 *range,
|
|||
int i;
|
||||
|
||||
/* Check address type match */
|
||||
if ((addr[0] ^ range[0]) & 0x03000000)
|
||||
return -EINVAL;
|
||||
if (!((addr[0] ^ range[0]) & 0x03000000))
|
||||
goto type_match;
|
||||
|
||||
/* Special exception, we can map a 64-bit address into
|
||||
* a 32-bit range.
|
||||
*/
|
||||
if ((addr[0] & 0x03000000) == 0x03000000 &&
|
||||
(range[0] & 0x03000000) == 0x02000000)
|
||||
goto type_match;
|
||||
|
||||
return -EINVAL;
|
||||
|
||||
type_match:
|
||||
if (of_out_of_range(addr + 1, range + 1, range + na + pna,
|
||||
na - 1, ns))
|
||||
return -EINVAL;
|
||||
|
|
|
|||
|
|
@ -986,6 +986,17 @@ static int __kprobes perf_event_nmi_handler(struct notifier_block *self,
|
|||
data.addr = 0;
|
||||
|
||||
cpuc = &__get_cpu_var(cpu_hw_events);
|
||||
|
||||
/* If the PMU has the TOE IRQ enable bits, we need to do a
|
||||
* dummy write to the %pcr to clear the overflow bits and thus
|
||||
* the interrupt.
|
||||
*
|
||||
* Do this before we peek at the counters to determine
|
||||
* overflow so we don't lose any events.
|
||||
*/
|
||||
if (sparc_pmu->irq_bit)
|
||||
pcr_ops->write(cpuc->pcr);
|
||||
|
||||
for (idx = 0; idx < MAX_HWEVENTS; idx++) {
|
||||
struct perf_event *event = cpuc->events[idx];
|
||||
struct hw_perf_event *hwc;
|
||||
|
|
|
|||
|
|
@ -365,14 +365,6 @@ void flush_thread(void)
|
|||
struct thread_info *t = current_thread_info();
|
||||
struct mm_struct *mm;
|
||||
|
||||
if (test_ti_thread_flag(t, TIF_ABI_PENDING)) {
|
||||
clear_ti_thread_flag(t, TIF_ABI_PENDING);
|
||||
if (test_ti_thread_flag(t, TIF_32BIT))
|
||||
clear_ti_thread_flag(t, TIF_32BIT);
|
||||
else
|
||||
set_ti_thread_flag(t, TIF_32BIT);
|
||||
}
|
||||
|
||||
mm = t->task->mm;
|
||||
if (mm)
|
||||
tsb_context_switch(mm);
|
||||
|
|
|
|||
|
|
@ -45,7 +45,8 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, unsi
|
|||
/* We do not accept a shared mapping if it would violate
|
||||
* cache aliasing constraints.
|
||||
*/
|
||||
if ((flags & MAP_SHARED) && (addr & (SHMLBA - 1)))
|
||||
if ((flags & MAP_SHARED) &&
|
||||
((addr - (pgoff << PAGE_SHIFT)) & (SHMLBA - 1)))
|
||||
return -EINVAL;
|
||||
return addr;
|
||||
}
|
||||
|
|
@ -79,15 +80,6 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, unsi
|
|||
}
|
||||
}
|
||||
|
||||
asmlinkage unsigned long sparc_brk(unsigned long brk)
|
||||
{
|
||||
if(ARCH_SUN4C) {
|
||||
if ((brk & 0xe0000000) != (current->mm->brk & 0xe0000000))
|
||||
return current->mm->brk;
|
||||
}
|
||||
return sys_brk(brk);
|
||||
}
|
||||
|
||||
/*
|
||||
* sys_pipe() is the normal C calling standard for creating
|
||||
* a pipe. It's not the way unix traditionally does this, though.
|
||||
|
|
@ -234,31 +226,6 @@ int sparc_mmap_check(unsigned long addr, unsigned long len)
|
|||
}
|
||||
|
||||
/* Linux version of mmap */
|
||||
static unsigned long do_mmap2(unsigned long addr, unsigned long len,
|
||||
unsigned long prot, unsigned long flags, unsigned long fd,
|
||||
unsigned long pgoff)
|
||||
{
|
||||
struct file * file = NULL;
|
||||
unsigned long retval = -EBADF;
|
||||
|
||||
if (!(flags & MAP_ANONYMOUS)) {
|
||||
file = fget(fd);
|
||||
if (!file)
|
||||
goto out;
|
||||
}
|
||||
|
||||
len = PAGE_ALIGN(len);
|
||||
flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
|
||||
|
||||
down_write(¤t->mm->mmap_sem);
|
||||
retval = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
|
||||
up_write(¤t->mm->mmap_sem);
|
||||
|
||||
if (file)
|
||||
fput(file);
|
||||
out:
|
||||
return retval;
|
||||
}
|
||||
|
||||
asmlinkage unsigned long sys_mmap2(unsigned long addr, unsigned long len,
|
||||
unsigned long prot, unsigned long flags, unsigned long fd,
|
||||
|
|
@ -266,14 +233,16 @@ asmlinkage unsigned long sys_mmap2(unsigned long addr, unsigned long len,
|
|||
{
|
||||
/* Make sure the shift for mmap2 is constant (12), no matter what PAGE_SIZE
|
||||
we have. */
|
||||
return do_mmap2(addr, len, prot, flags, fd, pgoff >> (PAGE_SHIFT - 12));
|
||||
return sys_mmap_pgoff(addr, len, prot, flags, fd,
|
||||
pgoff >> (PAGE_SHIFT - 12));
|
||||
}
|
||||
|
||||
asmlinkage unsigned long sys_mmap(unsigned long addr, unsigned long len,
|
||||
unsigned long prot, unsigned long flags, unsigned long fd,
|
||||
unsigned long off)
|
||||
{
|
||||
return do_mmap2(addr, len, prot, flags, fd, off >> PAGE_SHIFT);
|
||||
/* no alignment check? */
|
||||
return sys_mmap_pgoff(addr, len, prot, flags, fd, off >> PAGE_SHIFT);
|
||||
}
|
||||
|
||||
long sparc_remap_file_pages(unsigned long start, unsigned long size,
|
||||
|
|
@ -287,27 +256,6 @@ long sparc_remap_file_pages(unsigned long start, unsigned long size,
|
|||
(pgoff >> (PAGE_SHIFT - 12)), flags);
|
||||
}
|
||||
|
||||
extern unsigned long do_mremap(unsigned long addr,
|
||||
unsigned long old_len, unsigned long new_len,
|
||||
unsigned long flags, unsigned long new_addr);
|
||||
|
||||
asmlinkage unsigned long sparc_mremap(unsigned long addr,
|
||||
unsigned long old_len, unsigned long new_len,
|
||||
unsigned long flags, unsigned long new_addr)
|
||||
{
|
||||
unsigned long ret = -EINVAL;
|
||||
|
||||
if (unlikely(sparc_mmap_check(addr, old_len)))
|
||||
goto out;
|
||||
if (unlikely(sparc_mmap_check(new_addr, new_len)))
|
||||
goto out;
|
||||
down_write(¤t->mm->mmap_sem);
|
||||
ret = do_mremap(addr, old_len, new_len, flags, new_addr);
|
||||
up_write(¤t->mm->mmap_sem);
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* we come to here via sys_nis_syscall so it can setup the regs argument */
|
||||
asmlinkage unsigned long
|
||||
c_sys_nis_syscall (struct pt_regs *regs)
|
||||
|
|
|
|||
|
|
@ -317,10 +317,14 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,
|
|||
unsigned long get_fb_unmapped_area(struct file *filp, unsigned long orig_addr, unsigned long len, unsigned long pgoff, unsigned long flags)
|
||||
{
|
||||
unsigned long align_goal, addr = -ENOMEM;
|
||||
unsigned long (*get_area)(struct file *, unsigned long,
|
||||
unsigned long, unsigned long, unsigned long);
|
||||
|
||||
get_area = current->mm->get_unmapped_area;
|
||||
|
||||
if (flags & MAP_FIXED) {
|
||||
/* Ok, don't mess with it. */
|
||||
return get_unmapped_area(NULL, orig_addr, len, pgoff, flags);
|
||||
return get_area(NULL, orig_addr, len, pgoff, flags);
|
||||
}
|
||||
flags &= ~MAP_SHARED;
|
||||
|
||||
|
|
@ -333,7 +337,7 @@ unsigned long get_fb_unmapped_area(struct file *filp, unsigned long orig_addr, u
|
|||
align_goal = (64UL * 1024);
|
||||
|
||||
do {
|
||||
addr = get_unmapped_area(NULL, orig_addr, len + (align_goal - PAGE_SIZE), pgoff, flags);
|
||||
addr = get_area(NULL, orig_addr, len + (align_goal - PAGE_SIZE), pgoff, flags);
|
||||
if (!(addr & ~PAGE_MASK)) {
|
||||
addr = (addr + (align_goal - 1UL)) & ~(align_goal - 1UL);
|
||||
break;
|
||||
|
|
@ -351,7 +355,7 @@ unsigned long get_fb_unmapped_area(struct file *filp, unsigned long orig_addr, u
|
|||
* be obtained.
|
||||
*/
|
||||
if (addr & ~PAGE_MASK)
|
||||
addr = get_unmapped_area(NULL, orig_addr, len, pgoff, flags);
|
||||
addr = get_area(NULL, orig_addr, len, pgoff, flags);
|
||||
|
||||
return addr;
|
||||
}
|
||||
|
|
@ -399,18 +403,6 @@ void arch_pick_mmap_layout(struct mm_struct *mm)
|
|||
}
|
||||
}
|
||||
|
||||
SYSCALL_DEFINE1(sparc_brk, unsigned long, brk)
|
||||
{
|
||||
/* People could try to be nasty and use ta 0x6d in 32bit programs */
|
||||
if (test_thread_flag(TIF_32BIT) && brk >= STACK_TOP32)
|
||||
return current->mm->brk;
|
||||
|
||||
if (unlikely(straddles_64bit_va_hole(current->mm->brk, brk)))
|
||||
return current->mm->brk;
|
||||
|
||||
return sys_brk(brk);
|
||||
}
|
||||
|
||||
/*
|
||||
* sys_pipe() is the normal C calling standard for creating
|
||||
* a pipe. It's not the way unix traditionally does this, though.
|
||||
|
|
@ -568,23 +560,13 @@ SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len,
|
|||
unsigned long, prot, unsigned long, flags, unsigned long, fd,
|
||||
unsigned long, off)
|
||||
{
|
||||
struct file * file = NULL;
|
||||
unsigned long retval = -EBADF;
|
||||
unsigned long retval = -EINVAL;
|
||||
|
||||
if (!(flags & MAP_ANONYMOUS)) {
|
||||
file = fget(fd);
|
||||
if (!file)
|
||||
goto out;
|
||||
}
|
||||
flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
|
||||
len = PAGE_ALIGN(len);
|
||||
|
||||
down_write(¤t->mm->mmap_sem);
|
||||
retval = do_mmap(file, addr, len, prot, flags, off);
|
||||
up_write(¤t->mm->mmap_sem);
|
||||
|
||||
if (file)
|
||||
fput(file);
|
||||
if ((off + PAGE_ALIGN(len)) < off)
|
||||
goto out;
|
||||
if (off & ~PAGE_MASK)
|
||||
goto out;
|
||||
retval = sys_mmap_pgoff(addr, len, prot, flags, fd, off >> PAGE_SHIFT);
|
||||
out:
|
||||
return retval;
|
||||
}
|
||||
|
|
@ -614,12 +596,6 @@ SYSCALL_DEFINE5(64_mremap, unsigned long, addr, unsigned long, old_len,
|
|||
|
||||
if (test_thread_flag(TIF_32BIT))
|
||||
goto out;
|
||||
if (unlikely(new_len >= VA_EXCLUDE_START))
|
||||
goto out;
|
||||
if (unlikely(sparc_mmap_check(addr, old_len)))
|
||||
goto out;
|
||||
if (unlikely(sparc_mmap_check(new_addr, new_len)))
|
||||
goto out;
|
||||
|
||||
down_write(¤t->mm->mmap_sem);
|
||||
ret = do_mremap(addr, old_len, new_len, flags, new_addr);
|
||||
|
|
|
|||
|
|
@ -9,7 +9,6 @@
|
|||
struct new_utsname;
|
||||
|
||||
extern asmlinkage unsigned long sys_getpagesize(void);
|
||||
extern asmlinkage unsigned long sparc_brk(unsigned long brk);
|
||||
extern asmlinkage long sparc_pipe(struct pt_regs *regs);
|
||||
extern asmlinkage long sys_ipc(unsigned int call, int first,
|
||||
unsigned long second,
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ sys_call_table:
|
|||
/*0*/ .long sys_restart_syscall, sys_exit, sys_fork, sys_read, sys_write
|
||||
/*5*/ .long sys_open, sys_close, sys_wait4, sys_creat, sys_link
|
||||
/*10*/ .long sys_unlink, sunos_execv, sys_chdir, sys_chown16, sys_mknod
|
||||
/*15*/ .long sys_chmod, sys_lchown16, sparc_brk, sys_nis_syscall, sys_lseek
|
||||
/*15*/ .long sys_chmod, sys_lchown16, sys_brk, sys_nis_syscall, sys_lseek
|
||||
/*20*/ .long sys_getpid, sys_capget, sys_capset, sys_setuid16, sys_getuid16
|
||||
/*25*/ .long sys_vmsplice, sys_ptrace, sys_alarm, sys_sigaltstack, sys_pause
|
||||
/*30*/ .long sys_utime, sys_lchown, sys_fchown, sys_access, sys_nice
|
||||
|
|
@ -67,7 +67,7 @@ sys_call_table:
|
|||
/*235*/ .long sys_fstatfs64, sys_llseek, sys_mlock, sys_munlock, sys_mlockall
|
||||
/*240*/ .long sys_munlockall, sys_sched_setparam, sys_sched_getparam, sys_sched_setscheduler, sys_sched_getscheduler
|
||||
/*245*/ .long sys_sched_yield, sys_sched_get_priority_max, sys_sched_get_priority_min, sys_sched_rr_get_interval, sys_nanosleep
|
||||
/*250*/ .long sparc_mremap, sys_sysctl, sys_getsid, sys_fdatasync, sys_nfsservctl
|
||||
/*250*/ .long sys_mremap, sys_sysctl, sys_getsid, sys_fdatasync, sys_nfsservctl
|
||||
/*255*/ .long sys_sync_file_range, sys_clock_settime, sys_clock_gettime, sys_clock_getres, sys_clock_nanosleep
|
||||
/*260*/ .long sys_sched_getaffinity, sys_sched_setaffinity, sys_timer_settime, sys_timer_gettime, sys_timer_getoverrun
|
||||
/*265*/ .long sys_timer_delete, sys_timer_create, sys_nis_syscall, sys_io_setup, sys_io_destroy
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ sys_call_table32:
|
|||
/*0*/ .word sys_restart_syscall, sys32_exit, sys_fork, sys_read, sys_write
|
||||
/*5*/ .word sys32_open, sys_close, sys32_wait4, sys32_creat, sys_link
|
||||
/*10*/ .word sys_unlink, sunos_execv, sys_chdir, sys_chown16, sys32_mknod
|
||||
/*15*/ .word sys_chmod, sys_lchown16, sys_sparc_brk, sys32_perfctr, sys32_lseek
|
||||
/*15*/ .word sys_chmod, sys_lchown16, sys_brk, sys32_perfctr, sys32_lseek
|
||||
/*20*/ .word sys_getpid, sys_capget, sys_capset, sys_setuid16, sys_getuid16
|
||||
/*25*/ .word sys32_vmsplice, compat_sys_ptrace, sys_alarm, sys32_sigaltstack, sys_pause
|
||||
/*30*/ .word compat_sys_utime, sys_lchown, sys_fchown, sys32_access, sys32_nice
|
||||
|
|
@ -96,7 +96,7 @@ sys_call_table:
|
|||
/*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
|
||||
/*10*/ .word sys_unlink, sys_nis_syscall, sys_chdir, sys_chown, sys_mknod
|
||||
/*15*/ .word sys_chmod, sys_lchown, sys_sparc_brk, sys_perfctr, sys_lseek
|
||||
/*15*/ .word sys_chmod, sys_lchown, sys_brk, sys_perfctr, sys_lseek
|
||||
/*20*/ .word sys_getpid, sys_capget, sys_capset, sys_setuid, sys_getuid
|
||||
/*25*/ .word sys_vmsplice, sys_ptrace, sys_alarm, sys_sigaltstack, sys_nis_syscall
|
||||
/*30*/ .word sys_utime, sys_nis_syscall, sys_nis_syscall, sys_access, sys_nice
|
||||
|
|
|
|||
|
|
@ -64,8 +64,9 @@ mcount:
|
|||
2: sethi %hi(softirq_stack), %g3
|
||||
or %g3, %lo(softirq_stack), %g3
|
||||
ldx [%g3 + %g1], %g7
|
||||
sub %g7, STACK_BIAS, %g7
|
||||
cmp %sp, %g7
|
||||
bleu,pt %xcc, 2f
|
||||
bleu,pt %xcc, 3f
|
||||
sethi %hi(THREAD_SIZE), %g3
|
||||
add %g7, %g3, %g7
|
||||
cmp %sp, %g7
|
||||
|
|
@ -75,7 +76,7 @@ mcount:
|
|||
* again, we are already trying to output the stack overflow
|
||||
* message.
|
||||
*/
|
||||
sethi %hi(ovstack), %g7 ! cant move to panic stack fast enough
|
||||
3: sethi %hi(ovstack), %g7 ! cant move to panic stack fast enough
|
||||
or %g7, %lo(ovstack), %g7
|
||||
add %g7, OVSTACKSIZE, %g3
|
||||
sub %g3, STACK_BIAS + 192, %g3
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@
|
|||
#include "linux/mm.h"
|
||||
#include "linux/sched.h"
|
||||
#include "linux/utsname.h"
|
||||
#include "linux/syscalls.h"
|
||||
#include "asm/current.h"
|
||||
#include "asm/mman.h"
|
||||
#include "asm/uaccess.h"
|
||||
|
|
@ -37,31 +38,6 @@ long sys_vfork(void)
|
|||
return ret;
|
||||
}
|
||||
|
||||
/* common code for old and new mmaps */
|
||||
long sys_mmap2(unsigned long addr, unsigned long len,
|
||||
unsigned long prot, unsigned long flags,
|
||||
unsigned long fd, unsigned long pgoff)
|
||||
{
|
||||
long error = -EBADF;
|
||||
struct file * file = NULL;
|
||||
|
||||
flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
|
||||
if (!(flags & MAP_ANONYMOUS)) {
|
||||
file = fget(fd);
|
||||
if (!file)
|
||||
goto out;
|
||||
}
|
||||
|
||||
down_write(¤t->mm->mmap_sem);
|
||||
error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
|
||||
up_write(¤t->mm->mmap_sem);
|
||||
|
||||
if (file)
|
||||
fput(file);
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
|
||||
long old_mmap(unsigned long addr, unsigned long len,
|
||||
unsigned long prot, unsigned long flags,
|
||||
unsigned long fd, unsigned long offset)
|
||||
|
|
@ -70,7 +46,7 @@ long old_mmap(unsigned long addr, unsigned long len,
|
|||
if (offset & ~PAGE_MASK)
|
||||
goto out;
|
||||
|
||||
err = sys_mmap2(addr, len, prot, flags, fd, offset >> PAGE_SHIFT);
|
||||
err = sys_mmap_pgoff(addr, len, prot, flags, fd, offset >> PAGE_SHIFT);
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,7 +20,3 @@ extern syscall_handler_t *sys_call_table[];
|
|||
#define EXECUTE_SYSCALL(syscall, regs) \
|
||||
((long (*)(struct syscall_args)) \
|
||||
(*sys_call_table[syscall]))(SYSCALL_ARGS(®s->regs))
|
||||
|
||||
extern long sys_mmap2(unsigned long addr, unsigned long len,
|
||||
unsigned long prot, unsigned long flags,
|
||||
unsigned long fd, unsigned long pgoff);
|
||||
|
|
|
|||
|
|
@ -984,12 +984,6 @@ config X86_CPUID
|
|||
with major 203 and minors 0 to 31 for /dev/cpu/0/cpuid to
|
||||
/dev/cpu/31/cpuid.
|
||||
|
||||
config X86_CPU_DEBUG
|
||||
tristate "/sys/kernel/debug/x86/cpu/* - CPU Debug support"
|
||||
---help---
|
||||
If you select this option, this will provide various x86 CPUs
|
||||
information through debugfs.
|
||||
|
||||
choice
|
||||
prompt "High Memory Support"
|
||||
default HIGHMEM4G if !X86_NUMAQ
|
||||
|
|
|
|||
|
|
@ -400,7 +400,7 @@ config X86_TSC
|
|||
|
||||
config X86_CMPXCHG64
|
||||
def_bool y
|
||||
depends on !M386 && !M486
|
||||
depends on X86_PAE || X86_64 || MCORE2 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MATOM
|
||||
|
||||
# this should be set for all -march=.. options where the compiler
|
||||
# generates cmov.
|
||||
|
|
|
|||
|
|
@ -46,6 +46,13 @@ cflags-$(CONFIG_MGEODEGX1) += -march=pentium-mmx
|
|||
# cpu entries
|
||||
cflags-$(CONFIG_X86_GENERIC) += $(call tune,generic,$(call tune,i686))
|
||||
|
||||
# Work around the pentium-mmx code generator madness of gcc4.4.x which
|
||||
# does stack alignment by generating horrible code _before_ the mcount
|
||||
# prologue (push %ebp, mov %esp, %ebp) which breaks the function graph
|
||||
# tracer assumptions. For i686, generic, core2 this is set by the
|
||||
# compiler anyway
|
||||
cflags-$(CONFIG_FUNCTION_GRAPH_TRACER) += $(call cc-option,-maccumulate-outgoing-args)
|
||||
|
||||
# Bug fix for binutils: this option is required in order to keep
|
||||
# binutils from generating NOPL instructions against our will.
|
||||
ifneq ($(CONFIG_X86_P6_NOP),y)
|
||||
|
|
|
|||
|
|
@ -308,14 +308,15 @@ static int load_aout_binary(struct linux_binprm *bprm, struct pt_regs *regs)
|
|||
if (retval)
|
||||
return retval;
|
||||
|
||||
regs->cs = __USER32_CS;
|
||||
regs->r8 = regs->r9 = regs->r10 = regs->r11 = regs->r12 =
|
||||
regs->r13 = regs->r14 = regs->r15 = 0;
|
||||
|
||||
/* OK, This is the point of no return */
|
||||
set_personality(PER_LINUX);
|
||||
set_thread_flag(TIF_IA32);
|
||||
clear_thread_flag(TIF_ABI_PENDING);
|
||||
|
||||
setup_new_exec(bprm);
|
||||
|
||||
regs->cs = __USER32_CS;
|
||||
regs->r8 = regs->r9 = regs->r10 = regs->r11 = regs->r12 =
|
||||
regs->r13 = regs->r14 = regs->r15 = 0;
|
||||
|
||||
current->mm->end_code = ex.a_text +
|
||||
(current->mm->start_code = N_TXTADDR(ex));
|
||||
|
|
|
|||
|
|
@ -696,7 +696,7 @@ ia32_sys_call_table:
|
|||
.quad quiet_ni_syscall /* streams2 */
|
||||
.quad stub32_vfork /* 190 */
|
||||
.quad compat_sys_getrlimit
|
||||
.quad sys32_mmap2
|
||||
.quad sys_mmap_pgoff
|
||||
.quad sys32_truncate64
|
||||
.quad sys32_ftruncate64
|
||||
.quad sys32_stat64 /* 195 */
|
||||
|
|
|
|||
|
|
@ -155,9 +155,6 @@ struct mmap_arg_struct {
|
|||
asmlinkage long sys32_mmap(struct mmap_arg_struct __user *arg)
|
||||
{
|
||||
struct mmap_arg_struct a;
|
||||
struct file *file = NULL;
|
||||
unsigned long retval;
|
||||
struct mm_struct *mm ;
|
||||
|
||||
if (copy_from_user(&a, arg, sizeof(a)))
|
||||
return -EFAULT;
|
||||
|
|
@ -165,22 +162,8 @@ asmlinkage long sys32_mmap(struct mmap_arg_struct __user *arg)
|
|||
if (a.offset & ~PAGE_MASK)
|
||||
return -EINVAL;
|
||||
|
||||
if (!(a.flags & MAP_ANONYMOUS)) {
|
||||
file = fget(a.fd);
|
||||
if (!file)
|
||||
return -EBADF;
|
||||
}
|
||||
|
||||
mm = current->mm;
|
||||
down_write(&mm->mmap_sem);
|
||||
retval = do_mmap_pgoff(file, a.addr, a.len, a.prot, a.flags,
|
||||
return sys_mmap_pgoff(a.addr, a.len, a.prot, a.flags, a.fd,
|
||||
a.offset>>PAGE_SHIFT);
|
||||
if (file)
|
||||
fput(file);
|
||||
|
||||
up_write(&mm->mmap_sem);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
asmlinkage long sys32_mprotect(unsigned long start, size_t len,
|
||||
|
|
@ -539,30 +522,6 @@ asmlinkage long sys32_sendfile(int out_fd, int in_fd,
|
|||
return ret;
|
||||
}
|
||||
|
||||
asmlinkage long sys32_mmap2(unsigned long addr, unsigned long len,
|
||||
unsigned long prot, unsigned long flags,
|
||||
unsigned long fd, unsigned long pgoff)
|
||||
{
|
||||
struct mm_struct *mm = current->mm;
|
||||
unsigned long error;
|
||||
struct file *file = NULL;
|
||||
|
||||
flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
|
||||
if (!(flags & MAP_ANONYMOUS)) {
|
||||
file = fget(fd);
|
||||
if (!file)
|
||||
return -EBADF;
|
||||
}
|
||||
|
||||
down_write(&mm->mmap_sem);
|
||||
error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
|
||||
up_write(&mm->mmap_sem);
|
||||
|
||||
if (file)
|
||||
fput(file);
|
||||
return error;
|
||||
}
|
||||
|
||||
asmlinkage long sys32_olduname(struct oldold_utsname __user *name)
|
||||
{
|
||||
char *arch = "x86_64";
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@ extern void amd_iommu_flush_all_domains(void);
|
|||
extern void amd_iommu_flush_all_devices(void);
|
||||
extern void amd_iommu_shutdown(void);
|
||||
extern void amd_iommu_apply_erratum_63(u16 devid);
|
||||
extern void amd_iommu_init_api(void);
|
||||
#else
|
||||
static inline int amd_iommu_init(void) { return -ENODEV; }
|
||||
static inline void amd_iommu_detect(void) { }
|
||||
|
|
|
|||
|
|
@ -1,127 +0,0 @@
|
|||
#ifndef _ASM_X86_CPU_DEBUG_H
|
||||
#define _ASM_X86_CPU_DEBUG_H
|
||||
|
||||
/*
|
||||
* CPU x86 architecture debug
|
||||
*
|
||||
* Copyright(C) 2009 Jaswinder Singh Rajput
|
||||
*/
|
||||
|
||||
/* Register flags */
|
||||
enum cpu_debug_bit {
|
||||
/* Model Specific Registers (MSRs) */
|
||||
CPU_MC_BIT, /* Machine Check */
|
||||
CPU_MONITOR_BIT, /* Monitor */
|
||||
CPU_TIME_BIT, /* Time */
|
||||
CPU_PMC_BIT, /* Performance Monitor */
|
||||
CPU_PLATFORM_BIT, /* Platform */
|
||||
CPU_APIC_BIT, /* APIC */
|
||||
CPU_POWERON_BIT, /* Power-on */
|
||||
CPU_CONTROL_BIT, /* Control */
|
||||
CPU_FEATURES_BIT, /* Features control */
|
||||
CPU_LBRANCH_BIT, /* Last Branch */
|
||||
CPU_BIOS_BIT, /* BIOS */
|
||||
CPU_FREQ_BIT, /* Frequency */
|
||||
CPU_MTTR_BIT, /* MTRR */
|
||||
CPU_PERF_BIT, /* Performance */
|
||||
CPU_CACHE_BIT, /* Cache */
|
||||
CPU_SYSENTER_BIT, /* Sysenter */
|
||||
CPU_THERM_BIT, /* Thermal */
|
||||
CPU_MISC_BIT, /* Miscellaneous */
|
||||
CPU_DEBUG_BIT, /* Debug */
|
||||
CPU_PAT_BIT, /* PAT */
|
||||
CPU_VMX_BIT, /* VMX */
|
||||
CPU_CALL_BIT, /* System Call */
|
||||
CPU_BASE_BIT, /* BASE Address */
|
||||
CPU_VER_BIT, /* Version ID */
|
||||
CPU_CONF_BIT, /* Configuration */
|
||||
CPU_SMM_BIT, /* System mgmt mode */
|
||||
CPU_SVM_BIT, /*Secure Virtual Machine*/
|
||||
CPU_OSVM_BIT, /* OS-Visible Workaround*/
|
||||
/* Standard Registers */
|
||||
CPU_TSS_BIT, /* Task Stack Segment */
|
||||
CPU_CR_BIT, /* Control Registers */
|
||||
CPU_DT_BIT, /* Descriptor Table */
|
||||
/* End of Registers flags */
|
||||
CPU_REG_ALL_BIT, /* Select all Registers */
|
||||
};
|
||||
|
||||
#define CPU_REG_ALL (~0) /* Select all Registers */
|
||||
|
||||
#define CPU_MC (1 << CPU_MC_BIT)
|
||||
#define CPU_MONITOR (1 << CPU_MONITOR_BIT)
|
||||
#define CPU_TIME (1 << CPU_TIME_BIT)
|
||||
#define CPU_PMC (1 << CPU_PMC_BIT)
|
||||
#define CPU_PLATFORM (1 << CPU_PLATFORM_BIT)
|
||||
#define CPU_APIC (1 << CPU_APIC_BIT)
|
||||
#define CPU_POWERON (1 << CPU_POWERON_BIT)
|
||||
#define CPU_CONTROL (1 << CPU_CONTROL_BIT)
|
||||
#define CPU_FEATURES (1 << CPU_FEATURES_BIT)
|
||||
#define CPU_LBRANCH (1 << CPU_LBRANCH_BIT)
|
||||
#define CPU_BIOS (1 << CPU_BIOS_BIT)
|
||||
#define CPU_FREQ (1 << CPU_FREQ_BIT)
|
||||
#define CPU_MTRR (1 << CPU_MTTR_BIT)
|
||||
#define CPU_PERF (1 << CPU_PERF_BIT)
|
||||
#define CPU_CACHE (1 << CPU_CACHE_BIT)
|
||||
#define CPU_SYSENTER (1 << CPU_SYSENTER_BIT)
|
||||
#define CPU_THERM (1 << CPU_THERM_BIT)
|
||||
#define CPU_MISC (1 << CPU_MISC_BIT)
|
||||
#define CPU_DEBUG (1 << CPU_DEBUG_BIT)
|
||||
#define CPU_PAT (1 << CPU_PAT_BIT)
|
||||
#define CPU_VMX (1 << CPU_VMX_BIT)
|
||||
#define CPU_CALL (1 << CPU_CALL_BIT)
|
||||
#define CPU_BASE (1 << CPU_BASE_BIT)
|
||||
#define CPU_VER (1 << CPU_VER_BIT)
|
||||
#define CPU_CONF (1 << CPU_CONF_BIT)
|
||||
#define CPU_SMM (1 << CPU_SMM_BIT)
|
||||
#define CPU_SVM (1 << CPU_SVM_BIT)
|
||||
#define CPU_OSVM (1 << CPU_OSVM_BIT)
|
||||
#define CPU_TSS (1 << CPU_TSS_BIT)
|
||||
#define CPU_CR (1 << CPU_CR_BIT)
|
||||
#define CPU_DT (1 << CPU_DT_BIT)
|
||||
|
||||
/* Register file flags */
|
||||
enum cpu_file_bit {
|
||||
CPU_INDEX_BIT, /* index */
|
||||
CPU_VALUE_BIT, /* value */
|
||||
};
|
||||
|
||||
#define CPU_FILE_VALUE (1 << CPU_VALUE_BIT)
|
||||
|
||||
#define MAX_CPU_FILES 512
|
||||
|
||||
struct cpu_private {
|
||||
unsigned cpu;
|
||||
unsigned type;
|
||||
unsigned reg;
|
||||
unsigned file;
|
||||
};
|
||||
|
||||
struct cpu_debug_base {
|
||||
char *name; /* Register name */
|
||||
unsigned flag; /* Register flag */
|
||||
unsigned write; /* Register write flag */
|
||||
};
|
||||
|
||||
/*
|
||||
* Currently it looks similar to cpu_debug_base but once we add more files
|
||||
* cpu_file_base will go in different direction
|
||||
*/
|
||||
struct cpu_file_base {
|
||||
char *name; /* Register file name */
|
||||
unsigned flag; /* Register file flag */
|
||||
unsigned write; /* Register write flag */
|
||||
};
|
||||
|
||||
struct cpu_cpuX_base {
|
||||
struct dentry *dentry; /* Register dentry */
|
||||
int init; /* Register index file */
|
||||
};
|
||||
|
||||
struct cpu_debug_range {
|
||||
unsigned min; /* Register range min */
|
||||
unsigned max; /* Register range max */
|
||||
unsigned flag; /* Supported flags */
|
||||
};
|
||||
|
||||
#endif /* _ASM_X86_CPU_DEBUG_H */
|
||||
|
|
@ -197,14 +197,8 @@ do { \
|
|||
set_fs(USER_DS); \
|
||||
} while (0)
|
||||
|
||||
#define COMPAT_SET_PERSONALITY(ex) \
|
||||
do { \
|
||||
if (test_thread_flag(TIF_IA32)) \
|
||||
clear_thread_flag(TIF_ABI_PENDING); \
|
||||
else \
|
||||
set_thread_flag(TIF_ABI_PENDING); \
|
||||
current->personality |= force_personality32; \
|
||||
} while (0)
|
||||
void set_personality_ia32(void);
|
||||
#define COMPAT_SET_PERSONALITY(ex) set_personality_ia32()
|
||||
|
||||
#define COMPAT_ELF_PLATFORM ("i686")
|
||||
|
||||
|
|
|
|||
|
|
@ -66,6 +66,7 @@
|
|||
extern unsigned long hpet_address;
|
||||
extern unsigned long force_hpet_address;
|
||||
extern int hpet_force_user;
|
||||
extern u8 hpet_msi_disable;
|
||||
extern int is_hpet_enabled(void);
|
||||
extern int hpet_enable(void);
|
||||
extern void hpet_disable(void);
|
||||
|
|
|
|||
|
|
@ -113,7 +113,7 @@
|
|||
*/
|
||||
#define LOCAL_PENDING_VECTOR 0xec
|
||||
|
||||
#define UV_BAU_MESSAGE 0xec
|
||||
#define UV_BAU_MESSAGE 0xea
|
||||
|
||||
/*
|
||||
* Self IPI vector for machine checks
|
||||
|
|
|
|||
|
|
@ -129,7 +129,7 @@ struct decode_cache {
|
|||
u8 seg_override;
|
||||
unsigned int d;
|
||||
unsigned long regs[NR_VCPU_REGS];
|
||||
unsigned long eip;
|
||||
unsigned long eip, eip_orig;
|
||||
/* modrm */
|
||||
u8 modrm;
|
||||
u8 modrm_mod;
|
||||
|
|
|
|||
|
|
@ -412,6 +412,7 @@ struct kvm_arch{
|
|||
unsigned long irq_sources_bitmap;
|
||||
unsigned long irq_states[KVM_IOAPIC_NUM_PINS];
|
||||
u64 vm_init_tsc;
|
||||
s64 kvmclock_offset;
|
||||
};
|
||||
|
||||
struct kvm_vm_stat {
|
||||
|
|
|
|||
|
|
@ -214,5 +214,11 @@ void intel_init_thermal(struct cpuinfo_x86 *c);
|
|||
|
||||
void mce_log_therm_throt_event(__u64 status);
|
||||
|
||||
#ifdef CONFIG_X86_THERMAL_VECTOR
|
||||
extern void mcheck_intel_therm_init(void);
|
||||
#else
|
||||
static inline void mcheck_intel_therm_init(void) { }
|
||||
#endif
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* _ASM_X86_MCE_H */
|
||||
|
|
|
|||
|
|
@ -27,6 +27,18 @@ struct msr {
|
|||
};
|
||||
};
|
||||
|
||||
struct msr_info {
|
||||
u32 msr_no;
|
||||
struct msr reg;
|
||||
struct msr *msrs;
|
||||
int err;
|
||||
};
|
||||
|
||||
struct msr_regs_info {
|
||||
u32 *regs;
|
||||
int err;
|
||||
};
|
||||
|
||||
static inline unsigned long long native_read_tscp(unsigned int *aux)
|
||||
{
|
||||
unsigned long low, high;
|
||||
|
|
@ -244,11 +256,14 @@ do { \
|
|||
|
||||
#define write_rdtscp_aux(val) wrmsr(0xc0000103, (val), 0)
|
||||
|
||||
struct msr *msrs_alloc(void);
|
||||
void msrs_free(struct msr *msrs);
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
int rdmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h);
|
||||
int wrmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h);
|
||||
void rdmsr_on_cpus(const cpumask_t *mask, u32 msr_no, struct msr *msrs);
|
||||
void wrmsr_on_cpus(const cpumask_t *mask, u32 msr_no, struct msr *msrs);
|
||||
void rdmsr_on_cpus(const struct cpumask *mask, u32 msr_no, struct msr *msrs);
|
||||
void wrmsr_on_cpus(const struct cpumask *mask, u32 msr_no, struct msr *msrs);
|
||||
int rdmsr_safe_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h);
|
||||
int wrmsr_safe_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h);
|
||||
int rdmsr_safe_regs_on_cpu(unsigned int cpu, u32 regs[8]);
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user