Beispiel #1
0
/*
 * Function for a thread that runs an arbitrary userlevel program by
 * name.
 *
 * Note: this cannot pass arguments to the program. You may wish to 
 * change it so it can, because that will make testing much easier
 * in the future.
 *
 * It copies the program name because runprogram destroys the copy
 * it gets by passing it to vfs_open(). 
 */
static
void
cmd_progthread(void *ptr, unsigned long nargs)
{
	char **args = ptr;
	char progname[128];
	int result;

	//KASSERT(nargs >= 1);

	if (nargs > 2) {
		kprintf("Warning: argument passing from menu not supported\n");
	}

	/* Hope we fit. */
	KASSERT(strlen(args[0]) < sizeof(progname));

	strcpy(progname, args[0]);


	result = runprogram(progname);

	if (result) {
		kprintf("Running program %s failed: %s\n", args[0],
			strerror(result));
		return;
	}

	sys___exit(0);

	/* NOTREACHED: runprogram only returns on error. */
}
/*
 * Function called when user-level code hits a fatal fault.
 */
static
void
kill_curthread(vaddr_t epc, unsigned code, vaddr_t vaddr)
{
	int sig = 0;

	KASSERT(code < NTRAPCODES);
	switch (code) {
	    case EX_IRQ:
	    case EX_IBE:
	    case EX_DBE:
	    case EX_SYS:
		/* should not be seen */
		KASSERT(0);
		sig = SIGABRT;
		break;
	    case EX_MOD:
	    case EX_TLBL:
	    case EX_TLBS:
		sig = SIGSEGV;
		break;
	    case EX_ADEL:
	    case EX_ADES:
		sig = SIGBUS;
		break;
	    case EX_BP:
		sig = SIGTRAP;
		break;
	    case EX_RI:
		sig = SIGILL;
		break;
	    case EX_CPU:
		sig = SIGSEGV;
		break;
	    case EX_OVF:
		sig = SIGFPE;
		break;
	}

	/*
	 * You will probably want to change this.
	 */

	sys___exit(0);

	kprintf("Fatal user mode trap %u sig %d (%s, epc 0x%x, vaddr 0x%x)\n",
		code, sig, trapcodenames[code], epc, vaddr);
	panic("I don't know how to handle this\n");
}
/*
 * Function for a thread that runs an arbitrary userlevel program by
 * name.
 *
 * Note: this cannot pass arguments to the program. You may wish to 
 * change it so it can, because that will make testing much easier
 * in the future.
 *
 * It copies the program name because runprogram destroys the copy
 * it gets by passing it to vfs_open(). 
 */
static
void
cmd_progthread(void *ptr, unsigned long nargs)
{
	char **args = ptr,*ar[25];
	char *progname;
	int result;

	KASSERT(nargs >= 1);

	/*if (nargs > 2) {
		kprintf("Warning: argument passing from menu not supported\n");
	}*/

	if(nargs==1)
		args[1]=NULL;
	else
		args[nargs]=NULL;

	/* Hope we fit. */
	//KASSERT(strlen(args[0]) < sizeof(progname));
	progname=kstrdup(args[0]);
	//strcpy(progname, args[0]);
	for(int i=0;i<(int)nargs;i++)
		ar[i]=kstrdup(args[i]);

	result = runprogram(progname,nargs,ar);
	if (result) {
		kprintf("Running program %s failed: %s\n", args[0],
			strerror(result));
		sys___exit(1);
		return;
	}
	sys___exit(0);
	/* NOTREACHED: runprogram only returns on error. */
}