Merge branch '3.16-fixes' into mips-for-linux-next
This commit is contained in:
commit
475d5928b7
15 changed files with 116 additions and 28 deletions
|
@ -59,7 +59,7 @@ struct platform_device jz4740_usb_ohci_device = {
|
||||||
|
|
||||||
/* USB Device Controller */
|
/* USB Device Controller */
|
||||||
struct platform_device jz4740_udc_xceiv_device = {
|
struct platform_device jz4740_udc_xceiv_device = {
|
||||||
.name = "usb_phy_gen_xceiv",
|
.name = "usb_phy_generic",
|
||||||
.id = 0,
|
.id = 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -63,7 +63,7 @@ static inline int in_kernel_space(unsigned long ip)
|
||||||
((unsigned int)(JAL | (((addr) >> 2) & ADDR_MASK)))
|
((unsigned int)(JAL | (((addr) >> 2) & ADDR_MASK)))
|
||||||
|
|
||||||
static unsigned int insn_jal_ftrace_caller __read_mostly;
|
static unsigned int insn_jal_ftrace_caller __read_mostly;
|
||||||
static unsigned int insn_lui_v1_hi16_mcount __read_mostly;
|
static unsigned int insn_la_mcount[2] __read_mostly;
|
||||||
static unsigned int insn_j_ftrace_graph_caller __maybe_unused __read_mostly;
|
static unsigned int insn_j_ftrace_graph_caller __maybe_unused __read_mostly;
|
||||||
|
|
||||||
static inline void ftrace_dyn_arch_init_insns(void)
|
static inline void ftrace_dyn_arch_init_insns(void)
|
||||||
|
@ -71,10 +71,10 @@ static inline void ftrace_dyn_arch_init_insns(void)
|
||||||
u32 *buf;
|
u32 *buf;
|
||||||
unsigned int v1;
|
unsigned int v1;
|
||||||
|
|
||||||
/* lui v1, hi16_mcount */
|
/* la v1, _mcount */
|
||||||
v1 = 3;
|
v1 = 3;
|
||||||
buf = (u32 *)&insn_lui_v1_hi16_mcount;
|
buf = (u32 *)&insn_la_mcount[0];
|
||||||
UASM_i_LA_mostly(&buf, v1, MCOUNT_ADDR);
|
UASM_i_LA(&buf, v1, MCOUNT_ADDR);
|
||||||
|
|
||||||
/* jal (ftrace_caller + 8), jump over the first two instruction */
|
/* jal (ftrace_caller + 8), jump over the first two instruction */
|
||||||
buf = (u32 *)&insn_jal_ftrace_caller;
|
buf = (u32 *)&insn_jal_ftrace_caller;
|
||||||
|
@ -111,14 +111,47 @@ static int ftrace_modify_code_2(unsigned long ip, unsigned int new_code1,
|
||||||
unsigned int new_code2)
|
unsigned int new_code2)
|
||||||
{
|
{
|
||||||
int faulted;
|
int faulted;
|
||||||
|
mm_segment_t old_fs;
|
||||||
|
|
||||||
safe_store_code(new_code1, ip, faulted);
|
safe_store_code(new_code1, ip, faulted);
|
||||||
if (unlikely(faulted))
|
if (unlikely(faulted))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
safe_store_code(new_code2, ip + 4, faulted);
|
|
||||||
|
ip += 4;
|
||||||
|
safe_store_code(new_code2, ip, faulted);
|
||||||
if (unlikely(faulted))
|
if (unlikely(faulted))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
|
ip -= 4;
|
||||||
|
old_fs = get_fs();
|
||||||
|
set_fs(get_ds());
|
||||||
flush_icache_range(ip, ip + 8);
|
flush_icache_range(ip, ip + 8);
|
||||||
|
set_fs(old_fs);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ftrace_modify_code_2r(unsigned long ip, unsigned int new_code1,
|
||||||
|
unsigned int new_code2)
|
||||||
|
{
|
||||||
|
int faulted;
|
||||||
|
mm_segment_t old_fs;
|
||||||
|
|
||||||
|
ip += 4;
|
||||||
|
safe_store_code(new_code2, ip, faulted);
|
||||||
|
if (unlikely(faulted))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
ip -= 4;
|
||||||
|
safe_store_code(new_code1, ip, faulted);
|
||||||
|
if (unlikely(faulted))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
old_fs = get_fs();
|
||||||
|
set_fs(get_ds());
|
||||||
|
flush_icache_range(ip, ip + 8);
|
||||||
|
set_fs(old_fs);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -130,13 +163,14 @@ static int ftrace_modify_code_2(unsigned long ip, unsigned int new_code1,
|
||||||
*
|
*
|
||||||
* move at, ra
|
* move at, ra
|
||||||
* jal _mcount --> nop
|
* jal _mcount --> nop
|
||||||
|
* sub sp, sp, 8 --> nop (CONFIG_32BIT)
|
||||||
*
|
*
|
||||||
* 2. For modules:
|
* 2. For modules:
|
||||||
*
|
*
|
||||||
* 2.1 For KBUILD_MCOUNT_RA_ADDRESS and CONFIG_32BIT
|
* 2.1 For KBUILD_MCOUNT_RA_ADDRESS and CONFIG_32BIT
|
||||||
*
|
*
|
||||||
* lui v1, hi_16bit_of_mcount --> b 1f (0x10000005)
|
* lui v1, hi_16bit_of_mcount --> b 1f (0x10000005)
|
||||||
* addiu v1, v1, low_16bit_of_mcount
|
* addiu v1, v1, low_16bit_of_mcount --> nop (CONFIG_32BIT)
|
||||||
* move at, ra
|
* move at, ra
|
||||||
* move $12, ra_address
|
* move $12, ra_address
|
||||||
* jalr v1
|
* jalr v1
|
||||||
|
@ -145,7 +179,7 @@ static int ftrace_modify_code_2(unsigned long ip, unsigned int new_code1,
|
||||||
* 2.2 For the Other situations
|
* 2.2 For the Other situations
|
||||||
*
|
*
|
||||||
* lui v1, hi_16bit_of_mcount --> b 1f (0x10000004)
|
* lui v1, hi_16bit_of_mcount --> b 1f (0x10000004)
|
||||||
* addiu v1, v1, low_16bit_of_mcount
|
* addiu v1, v1, low_16bit_of_mcount --> nop (CONFIG_32BIT)
|
||||||
* move at, ra
|
* move at, ra
|
||||||
* jalr v1
|
* jalr v1
|
||||||
* nop | move $12, ra_address | sub sp, sp, 8
|
* nop | move $12, ra_address | sub sp, sp, 8
|
||||||
|
@ -184,10 +218,14 @@ int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr)
|
||||||
unsigned int new;
|
unsigned int new;
|
||||||
unsigned long ip = rec->ip;
|
unsigned long ip = rec->ip;
|
||||||
|
|
||||||
new = in_kernel_space(ip) ? insn_jal_ftrace_caller :
|
new = in_kernel_space(ip) ? insn_jal_ftrace_caller : insn_la_mcount[0];
|
||||||
insn_lui_v1_hi16_mcount;
|
|
||||||
|
|
||||||
|
#ifdef CONFIG_64BIT
|
||||||
return ftrace_modify_code(ip, new);
|
return ftrace_modify_code(ip, new);
|
||||||
|
#else
|
||||||
|
return ftrace_modify_code_2r(ip, new, in_kernel_space(ip) ?
|
||||||
|
INSN_NOP : insn_la_mcount[1]);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#define FTRACE_CALL_IP ((unsigned long)(&ftrace_call))
|
#define FTRACE_CALL_IP ((unsigned long)(&ftrace_call))
|
||||||
|
|
|
@ -84,6 +84,19 @@ _mcount:
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
PTR_SUBU a0, ra, 8 /* arg1: self address */
|
PTR_SUBU a0, ra, 8 /* arg1: self address */
|
||||||
|
PTR_LA t1, _stext
|
||||||
|
sltu t2, a0, t1 /* t2 = (a0 < _stext) */
|
||||||
|
PTR_LA t1, _etext
|
||||||
|
sltu t3, t1, a0 /* t3 = (a0 > _etext) */
|
||||||
|
or t1, t2, t3
|
||||||
|
beqz t1, ftrace_call
|
||||||
|
nop
|
||||||
|
#if defined(KBUILD_MCOUNT_RA_ADDRESS) && defined(CONFIG_32BIT)
|
||||||
|
PTR_SUBU a0, a0, 16 /* arg1: adjust to module's recorded callsite */
|
||||||
|
#else
|
||||||
|
PTR_SUBU a0, a0, 12
|
||||||
|
#endif
|
||||||
|
|
||||||
.globl ftrace_call
|
.globl ftrace_call
|
||||||
ftrace_call:
|
ftrace_call:
|
||||||
nop /* a placeholder for the call to a real tracing function */
|
nop /* a placeholder for the call to a real tracing function */
|
||||||
|
|
|
@ -150,6 +150,7 @@ int ptrace_setfpregs(struct task_struct *child, __u32 __user *data)
|
||||||
}
|
}
|
||||||
|
|
||||||
__get_user(child->thread.fpu.fcr31, data + 64);
|
__get_user(child->thread.fpu.fcr31, data + 64);
|
||||||
|
child->thread.fpu.fcr31 &= ~FPU_CSR_ALL_X;
|
||||||
|
|
||||||
/* FIR may not be written. */
|
/* FIR may not be written. */
|
||||||
|
|
||||||
|
@ -695,7 +696,7 @@ long arch_ptrace(struct task_struct *child, long request,
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case FPC_CSR:
|
case FPC_CSR:
|
||||||
child->thread.fpu.fcr31 = data;
|
child->thread.fpu.fcr31 = data & ~FPU_CSR_ALL_X;
|
||||||
break;
|
break;
|
||||||
case DSP_BASE ... DSP_BASE + 5: {
|
case DSP_BASE ... DSP_BASE + 5: {
|
||||||
dspreg_t *dregs;
|
dspreg_t *dregs;
|
||||||
|
|
|
@ -77,6 +77,9 @@ int __init rtlx_module_init(void)
|
||||||
dev = device_create(mt_class, NULL, MKDEV(major, i), NULL,
|
dev = device_create(mt_class, NULL, MKDEV(major, i), NULL,
|
||||||
"%s%d", RTLX_MODULE_NAME, i);
|
"%s%d", RTLX_MODULE_NAME, i);
|
||||||
if (IS_ERR(dev)) {
|
if (IS_ERR(dev)) {
|
||||||
|
while (i--)
|
||||||
|
device_destroy(mt_class, MKDEV(major, i));
|
||||||
|
|
||||||
err = PTR_ERR(dev);
|
err = PTR_ERR(dev);
|
||||||
goto out_chrdev;
|
goto out_chrdev;
|
||||||
}
|
}
|
||||||
|
|
|
@ -103,6 +103,9 @@ int __init rtlx_module_init(void)
|
||||||
dev = device_create(mt_class, NULL, MKDEV(major, i), NULL,
|
dev = device_create(mt_class, NULL, MKDEV(major, i), NULL,
|
||||||
"%s%d", RTLX_MODULE_NAME, i);
|
"%s%d", RTLX_MODULE_NAME, i);
|
||||||
if (IS_ERR(dev)) {
|
if (IS_ERR(dev)) {
|
||||||
|
while (i--)
|
||||||
|
device_destroy(mt_class, MKDEV(major, i));
|
||||||
|
|
||||||
err = PTR_ERR(dev);
|
err = PTR_ERR(dev);
|
||||||
goto out_chrdev;
|
goto out_chrdev;
|
||||||
}
|
}
|
||||||
|
|
|
@ -162,7 +162,7 @@ EXPORT(sysn32_call_table)
|
||||||
PTR sys_getpeername
|
PTR sys_getpeername
|
||||||
PTR sys_socketpair
|
PTR sys_socketpair
|
||||||
PTR compat_sys_setsockopt
|
PTR compat_sys_setsockopt
|
||||||
PTR sys_getsockopt
|
PTR compat_sys_getsockopt
|
||||||
PTR __sys_clone /* 6055 */
|
PTR __sys_clone /* 6055 */
|
||||||
PTR __sys_fork
|
PTR __sys_fork
|
||||||
PTR compat_sys_execve
|
PTR compat_sys_execve
|
||||||
|
|
|
@ -288,6 +288,7 @@ struct plat_smp_ops vsmp_smp_ops = {
|
||||||
.prepare_cpus = vsmp_prepare_cpus,
|
.prepare_cpus = vsmp_prepare_cpus,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef CONFIG_PROC_FS
|
||||||
static int proc_cpuinfo_chain_call(struct notifier_block *nfb,
|
static int proc_cpuinfo_chain_call(struct notifier_block *nfb,
|
||||||
unsigned long action_unused, void *data)
|
unsigned long action_unused, void *data)
|
||||||
{
|
{
|
||||||
|
@ -309,3 +310,4 @@ static int __init proc_cpuinfo_notifier_init(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
subsys_initcall(proc_cpuinfo_notifier_init);
|
subsys_initcall(proc_cpuinfo_notifier_init);
|
||||||
|
#endif
|
||||||
|
|
|
@ -690,7 +690,6 @@ static void emulate_load_store_insn(struct pt_regs *regs,
|
||||||
case sdc1_op:
|
case sdc1_op:
|
||||||
die_if_kernel("Unaligned FP access in kernel code", regs);
|
die_if_kernel("Unaligned FP access in kernel code", regs);
|
||||||
BUG_ON(!used_math());
|
BUG_ON(!used_math());
|
||||||
BUG_ON(!is_fpu_owner());
|
|
||||||
|
|
||||||
lose_fpu(1); /* Save FPU state for the emulator. */
|
lose_fpu(1); /* Save FPU state for the emulator. */
|
||||||
res = fpu_emulator_cop1Handler(regs, ¤t->thread.fpu, 1,
|
res = fpu_emulator_cop1Handler(regs, ¤t->thread.fpu, 1,
|
||||||
|
|
|
@ -1827,7 +1827,7 @@ dcopuop:
|
||||||
case -1:
|
case -1:
|
||||||
|
|
||||||
if (cpu_has_mips_4_5_r)
|
if (cpu_has_mips_4_5_r)
|
||||||
cbit = fpucondbit[MIPSInst_RT(ir) >> 2];
|
cbit = fpucondbit[MIPSInst_FD(ir) >> 2];
|
||||||
else
|
else
|
||||||
cbit = FPU_CSR_COND;
|
cbit = FPU_CSR_COND;
|
||||||
if (rv.w)
|
if (rv.w)
|
||||||
|
|
|
@ -429,6 +429,7 @@ static void build_r3000_tlb_refill_handler(void)
|
||||||
(unsigned int)(p - tlb_handler));
|
(unsigned int)(p - tlb_handler));
|
||||||
|
|
||||||
memcpy((void *)ebase, tlb_handler, 0x80);
|
memcpy((void *)ebase, tlb_handler, 0x80);
|
||||||
|
local_flush_icache_range(ebase, ebase + 0x80);
|
||||||
|
|
||||||
dump_handler("r3000_tlb_refill", (u32 *)ebase, 32);
|
dump_handler("r3000_tlb_refill", (u32 *)ebase, 32);
|
||||||
}
|
}
|
||||||
|
@ -1299,6 +1300,7 @@ static void build_r4000_tlb_refill_handler(void)
|
||||||
}
|
}
|
||||||
#ifdef CONFIG_MIPS_HUGE_TLB_SUPPORT
|
#ifdef CONFIG_MIPS_HUGE_TLB_SUPPORT
|
||||||
uasm_l_tlb_huge_update(&l, p);
|
uasm_l_tlb_huge_update(&l, p);
|
||||||
|
UASM_i_LW(&p, K0, 0, K1);
|
||||||
build_huge_update_entries(&p, htlb_info.huge_pte, K1);
|
build_huge_update_entries(&p, htlb_info.huge_pte, K1);
|
||||||
build_huge_tlb_write_entry(&p, &l, &r, K0, tlb_random,
|
build_huge_tlb_write_entry(&p, &l, &r, K0, tlb_random,
|
||||||
htlb_info.restore_scratch);
|
htlb_info.restore_scratch);
|
||||||
|
@ -1415,6 +1417,7 @@ static void build_r4000_tlb_refill_handler(void)
|
||||||
final_len);
|
final_len);
|
||||||
|
|
||||||
memcpy((void *)ebase, final_handler, 0x100);
|
memcpy((void *)ebase, final_handler, 0x100);
|
||||||
|
local_flush_icache_range(ebase, ebase + 0x100);
|
||||||
|
|
||||||
dump_handler("r4000_tlb_refill", (u32 *)ebase, 64);
|
dump_handler("r4000_tlb_refill", (u32 *)ebase, 64);
|
||||||
}
|
}
|
||||||
|
|
|
@ -223,6 +223,7 @@ static struct platform_device rb532_wdt = {
|
||||||
|
|
||||||
static struct plat_serial8250_port rb532_uart_res[] = {
|
static struct plat_serial8250_port rb532_uart_res[] = {
|
||||||
{
|
{
|
||||||
|
.type = PORT_16550A,
|
||||||
.membase = (char *)KSEG1ADDR(REGBASE + UART0BASE),
|
.membase = (char *)KSEG1ADDR(REGBASE + UART0BASE),
|
||||||
.irq = UART0_IRQ,
|
.irq = UART0_IRQ,
|
||||||
.regshift = 2,
|
.regshift = 2,
|
||||||
|
|
|
@ -27,8 +27,14 @@ static struct {
|
||||||
{ .name = "SGI GR2/GR3", .id = 0x7f },
|
{ .name = "SGI GR2/GR3", .id = 0x7f },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void gio_bus_release(struct device *dev)
|
||||||
|
{
|
||||||
|
kfree(dev);
|
||||||
|
}
|
||||||
|
|
||||||
static struct device gio_bus = {
|
static struct device gio_bus = {
|
||||||
.init_name = "gio",
|
.init_name = "gio",
|
||||||
|
.release = &gio_bus_release,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -413,8 +419,10 @@ int __init ip22_gio_init(void)
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = device_register(&gio_bus);
|
ret = device_register(&gio_bus);
|
||||||
if (ret)
|
if (ret) {
|
||||||
|
put_device(&gio_bus);
|
||||||
return ret;
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
ret = bus_register(&gio_bus_type);
|
ret = bus_register(&gio_bus_type);
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
|
|
|
@ -83,6 +83,11 @@ static struct bus_type tx_7segled_subsys = {
|
||||||
.dev_name = "7segled",
|
.dev_name = "7segled",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void tx_7segled_release(struct device *dev)
|
||||||
|
{
|
||||||
|
kfree(dev);
|
||||||
|
}
|
||||||
|
|
||||||
static int __init tx_7segled_init_sysfs(void)
|
static int __init tx_7segled_init_sysfs(void)
|
||||||
{
|
{
|
||||||
int error, i;
|
int error, i;
|
||||||
|
@ -103,11 +108,14 @@ static int __init tx_7segled_init_sysfs(void)
|
||||||
}
|
}
|
||||||
dev->id = i;
|
dev->id = i;
|
||||||
dev->bus = &tx_7segled_subsys;
|
dev->bus = &tx_7segled_subsys;
|
||||||
|
dev->release = &tx_7segled_release;
|
||||||
error = device_register(dev);
|
error = device_register(dev);
|
||||||
if (!error) {
|
if (error) {
|
||||||
device_create_file(dev, &dev_attr_ascii);
|
put_device(dev);
|
||||||
device_create_file(dev, &dev_attr_raw);
|
return error;
|
||||||
}
|
}
|
||||||
|
device_create_file(dev, &dev_attr_ascii);
|
||||||
|
device_create_file(dev, &dev_attr_raw);
|
||||||
}
|
}
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
|
@ -937,6 +937,14 @@ static ssize_t txx9_sram_write(struct file *filp, struct kobject *kobj,
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void txx9_device_release(struct device *dev)
|
||||||
|
{
|
||||||
|
struct txx9_sramc_dev *tdev;
|
||||||
|
|
||||||
|
tdev = container_of(dev, struct txx9_sramc_dev, dev);
|
||||||
|
kfree(tdev);
|
||||||
|
}
|
||||||
|
|
||||||
void __init txx9_sramc_init(struct resource *r)
|
void __init txx9_sramc_init(struct resource *r)
|
||||||
{
|
{
|
||||||
struct txx9_sramc_dev *dev;
|
struct txx9_sramc_dev *dev;
|
||||||
|
@ -951,8 +959,11 @@ void __init txx9_sramc_init(struct resource *r)
|
||||||
return;
|
return;
|
||||||
size = resource_size(r);
|
size = resource_size(r);
|
||||||
dev->base = ioremap(r->start, size);
|
dev->base = ioremap(r->start, size);
|
||||||
if (!dev->base)
|
if (!dev->base) {
|
||||||
goto exit;
|
kfree(dev);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
dev->dev.release = &txx9_device_release;
|
||||||
dev->dev.bus = &txx9_sramc_subsys;
|
dev->dev.bus = &txx9_sramc_subsys;
|
||||||
sysfs_bin_attr_init(&dev->bindata_attr);
|
sysfs_bin_attr_init(&dev->bindata_attr);
|
||||||
dev->bindata_attr.attr.name = "bindata";
|
dev->bindata_attr.attr.name = "bindata";
|
||||||
|
@ -963,17 +974,15 @@ void __init txx9_sramc_init(struct resource *r)
|
||||||
dev->bindata_attr.private = dev;
|
dev->bindata_attr.private = dev;
|
||||||
err = device_register(&dev->dev);
|
err = device_register(&dev->dev);
|
||||||
if (err)
|
if (err)
|
||||||
goto exit;
|
goto exit_put;
|
||||||
err = sysfs_create_bin_file(&dev->dev.kobj, &dev->bindata_attr);
|
err = sysfs_create_bin_file(&dev->dev.kobj, &dev->bindata_attr);
|
||||||
if (err) {
|
if (err) {
|
||||||
device_unregister(&dev->dev);
|
device_unregister(&dev->dev);
|
||||||
goto exit;
|
iounmap(dev->base);
|
||||||
}
|
|
||||||
return;
|
|
||||||
exit:
|
|
||||||
if (dev) {
|
|
||||||
if (dev->base)
|
|
||||||
iounmap(dev->base);
|
|
||||||
kfree(dev);
|
kfree(dev);
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
|
exit_put:
|
||||||
|
put_device(&dev->dev);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue