|
|
|
@ -1,6 +1,6 @@
|
|
|
|
|
--- a/arch/mips/Kconfig
|
|
|
|
|
+++ b/arch/mips/Kconfig
|
|
|
|
|
@@ -1871,6 +1871,28 @@
|
|
|
|
|
@@ -1871,6 +1871,28 @@ config MIPS_VPE_LOADER
|
|
|
|
|
Includes a loader for loading an elf relocatable object
|
|
|
|
|
onto another VPE and running it.
|
|
|
|
|
|
|
|
|
@ -110,7 +110,7 @@
|
|
|
|
|
/* TCStatus fields (per TC) */
|
|
|
|
|
#define TCSTATUS_TASID (_ULCAST_(0xff))
|
|
|
|
|
#define TCSTATUS_IXMT_SHIFT 10
|
|
|
|
|
@@ -350,6 +390,14 @@
|
|
|
|
|
@@ -350,6 +390,14 @@ do { \
|
|
|
|
|
#define write_vpe_c0_vpecontrol(val) mttc0(1, 1, val)
|
|
|
|
|
#define read_vpe_c0_vpeconf0() mftc0(1, 2)
|
|
|
|
|
#define write_vpe_c0_vpeconf0(val) mttc0(1, 2, val)
|
|
|
|
@ -125,7 +125,7 @@
|
|
|
|
|
#define read_vpe_c0_count() mftc0(9, 0)
|
|
|
|
|
#define write_vpe_c0_count(val) mttc0(9, 0, val)
|
|
|
|
|
#define read_vpe_c0_status() mftc0(12, 0)
|
|
|
|
|
@@ -381,6 +429,12 @@
|
|
|
|
|
@@ -381,6 +429,12 @@ do { \
|
|
|
|
|
#define write_tc_c0_tchalt(val) mttc0(2, 4, val)
|
|
|
|
|
#define read_tc_c0_tccontext() mftc0(2, 5)
|
|
|
|
|
#define write_tc_c0_tccontext(val) mttc0(2, 5, val)
|
|
|
|
@ -140,7 +140,7 @@
|
|
|
|
|
#define read_tc_gpr_sp() mftgpr(29)
|
|
|
|
|
--- a/arch/mips/kernel/Makefile
|
|
|
|
|
+++ b/arch/mips/kernel/Makefile
|
|
|
|
|
@@ -85,7 +85,8 @@
|
|
|
|
|
@@ -85,7 +85,8 @@ obj-$(CONFIG_MIPS32_O32) += binfmt_elfo3
|
|
|
|
|
|
|
|
|
|
obj-$(CONFIG_KGDB) += kgdb.o
|
|
|
|
|
obj-$(CONFIG_PROC_FS) += proc.o
|
|
|
|
@ -254,7 +254,7 @@
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Dump new MIPS MT state for the core. Does not leave TCs halted.
|
|
|
|
|
@@ -78,18 +148,18 @@
|
|
|
|
|
@@ -78,18 +148,18 @@ void mips_mt_regdump(unsigned long mvpct
|
|
|
|
|
if ((read_tc_c0_tcbind() & TCBIND_CURVPE) == i) {
|
|
|
|
|
printk(" VPE %d\n", i);
|
|
|
|
|
printk(" VPEControl : %08lx\n",
|
|
|
|
@ -280,7 +280,7 @@
|
|
|
|
|
break; /* Next VPE */
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@@ -287,6 +357,9 @@
|
|
|
|
|
@@ -287,6 +357,9 @@ void mips_mt_set_cpuoptions(void)
|
|
|
|
|
printk("Mapped %ld ITC cells starting at 0x%08x\n",
|
|
|
|
|
((itcblkgrn & 0x7fe00000) >> 20), itc_base);
|
|
|
|
|
}
|
|
|
|
@ -300,7 +300,7 @@
|
|
|
|
|
#include <asm/bootinfo.h>
|
|
|
|
|
#include <asm/cpu.h>
|
|
|
|
|
#include <asm/cpu-features.h>
|
|
|
|
|
@@ -110,3 +111,19 @@
|
|
|
|
|
@@ -110,3 +111,19 @@ const struct seq_operations cpuinfo_op =
|
|
|
|
|
.stop = c_stop,
|
|
|
|
|
.show = show_cpuinfo,
|
|
|
|
|
};
|
|
|
|
@ -322,7 +322,7 @@
|
|
|
|
|
+}
|
|
|
|
|
--- a/arch/mips/kernel/smtc.c
|
|
|
|
|
+++ b/arch/mips/kernel/smtc.c
|
|
|
|
|
@@ -1334,6 +1334,13 @@
|
|
|
|
|
@@ -1334,6 +1334,13 @@ void smtc_get_new_mmu_context(struct mm_
|
|
|
|
|
asid = asid_cache(cpu);
|
|
|
|
|
|
|
|
|
|
do {
|
|
|
|
@ -338,7 +338,7 @@
|
|
|
|
|
flush_icache_all();
|
|
|
|
|
--- a/arch/mips/kernel/vpe.c
|
|
|
|
|
+++ b/arch/mips/kernel/vpe.c
|
|
|
|
|
@@ -76,6 +76,58 @@
|
|
|
|
|
@@ -76,6 +76,58 @@ static struct kspd_notifications kspd_ev
|
|
|
|
|
static int kspd_events_reqd;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
@ -397,7 +397,7 @@
|
|
|
|
|
/* grab the likely amount of memory we will need. */
|
|
|
|
|
#ifdef CONFIG_MIPS_VPE_LOADER_TOM
|
|
|
|
|
#define P_SIZE (2 * 1024 * 1024)
|
|
|
|
|
@@ -268,6 +320,13 @@
|
|
|
|
|
@@ -268,6 +320,13 @@ static void *alloc_progmem(unsigned long
|
|
|
|
|
void *addr;
|
|
|
|
|
|
|
|
|
|
#ifdef CONFIG_MIPS_VPE_LOADER_TOM
|
|
|
|
@ -411,7 +411,7 @@
|
|
|
|
|
/*
|
|
|
|
|
* This means you must tell Linux to use less memory than you
|
|
|
|
|
* physically have, for example by passing a mem= boot argument.
|
|
|
|
|
@@ -746,6 +805,12 @@
|
|
|
|
|
@@ -746,6 +805,12 @@ static int vpe_run(struct vpe * v)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Write the address we want it to start running from in the TCPC register. */
|
|
|
|
@ -424,7 +424,7 @@
|
|
|
|
|
write_tc_c0_tcrestart((unsigned long)v->__start);
|
|
|
|
|
write_tc_c0_tccontext((unsigned long)0);
|
|
|
|
|
|
|
|
|
|
@@ -759,6 +824,20 @@
|
|
|
|
|
@@ -759,6 +824,20 @@ static int vpe_run(struct vpe * v)
|
|
|
|
|
|
|
|
|
|
write_tc_c0_tchalt(read_tc_c0_tchalt() & ~TCHALT_H);
|
|
|
|
|
|
|
|
|
@ -445,7 +445,7 @@
|
|
|
|
|
/*
|
|
|
|
|
* The sde-kit passes 'memsize' to __start in $a3, so set something
|
|
|
|
|
* here... Or set $a3 to zero and define DFLT_STACK_SIZE and
|
|
|
|
|
@@ -833,6 +912,9 @@
|
|
|
|
|
@@ -833,6 +912,9 @@ static int find_vpe_symbols(struct vpe *
|
|
|
|
|
if ( (v->__start == 0) || (v->shared_ptr == NULL))
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
@ -455,7 +455,7 @@
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -994,6 +1076,15 @@
|
|
|
|
|
@@ -994,6 +1076,15 @@ static int vpe_elfload(struct vpe * v)
|
|
|
|
|
(unsigned long)v->load_addr + v->len);
|
|
|
|
|
|
|
|
|
|
if ((find_vpe_symbols(v, sechdrs, symindex, strtab, &mod)) < 0) {
|
|
|
|
@ -471,7 +471,7 @@
|
|
|
|
|
if (v->__start == 0) {
|
|
|
|
|
printk(KERN_WARNING "VPE loader: program does not contain "
|
|
|
|
|
"a __start symbol\n");
|
|
|
|
|
@@ -1064,6 +1155,9 @@
|
|
|
|
|
@@ -1064,6 +1155,9 @@ static int vpe_open(struct inode *inode,
|
|
|
|
|
struct vpe_notifications *not;
|
|
|
|
|
struct vpe *v;
|
|
|
|
|
int ret;
|
|
|
|
@ -481,7 +481,7 @@
|
|
|
|
|
|
|
|
|
|
if (minor != iminor(inode)) {
|
|
|
|
|
/* assume only 1 device at the moment. */
|
|
|
|
|
@@ -1089,7 +1183,12 @@
|
|
|
|
|
@@ -1089,7 +1183,12 @@ static int vpe_open(struct inode *inode,
|
|
|
|
|
release_progmem(v->load_addr);
|
|
|
|
|
cleanup_tc(get_tc(tclimit));
|
|
|
|
|
}
|
|
|
|
@ -495,7 +495,7 @@
|
|
|
|
|
/* this of-course trashes what was there before... */
|
|
|
|
|
v->pbuffer = vmalloc(P_SIZE);
|
|
|
|
|
if (!v->pbuffer) {
|
|
|
|
|
@@ -1097,11 +1196,14 @@
|
|
|
|
|
@@ -1097,11 +1196,14 @@ static int vpe_open(struct inode *inode,
|
|
|
|
|
return -ENOMEM;
|
|
|
|
|
}
|
|
|
|
|
v->plen = P_SIZE;
|
|
|
|
@ -510,7 +510,7 @@
|
|
|
|
|
|
|
|
|
|
#ifdef CONFIG_MIPS_APSP_KSPD
|
|
|
|
|
/* get kspd to tell us when a syscall_exit happens */
|
|
|
|
|
@@ -1349,6 +1451,133 @@
|
|
|
|
|
@@ -1349,6 +1451,133 @@ static void kspd_sp_exit( int sp_id)
|
|
|
|
|
cleanup_tc(get_tc(sp_id));
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
@ -644,7 +644,7 @@
|
|
|
|
|
|
|
|
|
|
static ssize_t store_kill(struct device *dev, struct device_attribute *attr,
|
|
|
|
|
const char *buf, size_t len)
|
|
|
|
|
@@ -1430,6 +1659,18 @@
|
|
|
|
|
@@ -1430,6 +1659,18 @@ static int __init vpe_module_init(void)
|
|
|
|
|
printk("VPE loader: not a MIPS MT capable processor\n");
|
|
|
|
|
return -ENODEV;
|
|
|
|
|
}
|
|
|
|
@ -663,7 +663,7 @@
|
|
|
|
|
|
|
|
|
|
if (vpelimit == 0) {
|
|
|
|
|
printk(KERN_WARNING "No VPEs reserved for AP/SP, not "
|
|
|
|
|
@@ -1474,10 +1715,12 @@
|
|
|
|
|
@@ -1474,10 +1715,12 @@ static int __init vpe_module_init(void)
|
|
|
|
|
mtflags = dmt();
|
|
|
|
|
vpflags = dvpe();
|
|
|
|
|
|
|
|
|
@ -677,7 +677,7 @@
|
|
|
|
|
|
|
|
|
|
val = read_c0_mvpconf0();
|
|
|
|
|
hw_tcs = (val & MVPCONF0_PTC) + 1;
|
|
|
|
|
@@ -1489,6 +1732,7 @@
|
|
|
|
|
@@ -1489,6 +1732,7 @@ static int __init vpe_module_init(void)
|
|
|
|
|
* reschedule send IPIs or similar we might hang.
|
|
|
|
|
*/
|
|
|
|
|
clear_c0_mvpcontrol(MVPCONTROL_VPC);
|
|
|
|
@ -685,7 +685,7 @@
|
|
|
|
|
evpe(vpflags);
|
|
|
|
|
emt(mtflags);
|
|
|
|
|
local_irq_restore(flags);
|
|
|
|
|
@@ -1514,6 +1758,7 @@
|
|
|
|
|
@@ -1514,6 +1758,7 @@ static int __init vpe_module_init(void)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
v->ntcs = hw_tcs - tclimit;
|
|
|
|
@ -693,7 +693,7 @@
|
|
|
|
|
|
|
|
|
|
/* add the tc to the list of this vpe's tc's. */
|
|
|
|
|
list_add(&t->tc, &v->tc);
|
|
|
|
|
@@ -1582,6 +1827,7 @@
|
|
|
|
|
@@ -1582,6 +1827,7 @@ static int __init vpe_module_init(void)
|
|
|
|
|
out_reenable:
|
|
|
|
|
/* release config state */
|
|
|
|
|
clear_c0_mvpcontrol(MVPCONTROL_VPC);
|
|
|
|
|