blob: ccbc22d6f7f77e41834c353eaebf5469f083c882 [file] [log] [blame] [edit]
#include <parlib.h>
#include <ros/mman.h>
#include <ros/resource.h>
#include <ros/procdata.h>
#include <ros/event.h>
#include <ros/bcq.h>
#include <arch/arch.h>
#include <stdio.h>
#include <vcore.h>
#include <mcs.h>
#include <timing.h>
#include <rassert.h>
#include <event.h>
#include <uthread.h>
void ghetto_vcore_entry(void);
struct schedule_ops ghetto_sched_ops = {
.sched_entry = ghetto_vcore_entry,
};
struct schedule_ops *sched_ops = &ghetto_sched_ops;
/* All MCP syscalls will spin instead of blocking */
static void __ros_syscall_spinon(struct syscall *sysc)
{
while (!(atomic_read(&sysc->flags) & (SC_DONE | SC_PROGRESS)))
cpu_relax();
}
int main(int argc, char** argv)
{
uint32_t vcoreid;
int nr_vcores;
if (argc < 2)
nr_vcores = max_vcores();
else
nr_vcores = atoi(argv[1]);
/* Inits a thread for us, though we won't use it. Just a hack to get into
* _M mode. Note this requests one vcore for us */
struct uthread dummy = {0};
uthread_lib_init(&dummy);
/* Reset the blockon to be the spinner... This is really shitty. Any
* blocking calls after we become an MCP and before this will fail. This is
* just mhello showing its warts due to trying to work outside uthread.c */
ros_syscall_blockon = __ros_syscall_spinon;
vcore_request(nr_vcores - 1); /* since we already have 1 */
while (1)
sys_halt_core(0);
return 0;
}
void ghetto_vcore_entry(void)
{
if (vcore_id() == 0)
run_current_uthread();
while (1)
sys_halt_core(0);
}