亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? alpha_tru64_process.cc

?? linux下基于c++的處理器仿真平臺(tái)。具有處理器流水線
?? CC
?? 第 1 頁 / 共 5 頁
字號:
	rad_state.copyIn(xc->mem);	uint64_t uniq_val = attrp->pthid - rad_state->nxm_uniq_offset;	if (attrp->type == Tru64::NXM_TYPE_MANAGER) {	    // DEC pthreads seems to always create one of these (in	    // addition to N application threads), but we don't use it,	    // so don't bother creating it.	    // This is supposed to be a port number.  Make something up.	    *kidp = 99;	    kidp.copyOut(xc->mem);	    return 0;	} else if (attrp->type == Tru64::NXM_TYPE_VP) {	    // A real "virtual processor" kernel thread.  Need to fork	    // this thread on another CPU.	    Tru64::nxm_sched_state *ssp = &rad_state->nxm_ss[thread_index];	    if (ssp->nxm_u.nxm_active != 0)		return (int) Tru64::KERN_NOT_RECEIVER;	    ssp->nxm_u.pth_id = attrp->pthid;	    ssp->nxm_u.nxm_active = uniq_val | 1;	    rad_state.copyOut(xc->mem);	    Addr slot_state_addr = 0x12000 + sizeof(Tru64::nxm_config_info);	    int slot_state_size =		process->numCpus() * sizeof(Tru64::nxm_slot_state_t);	    TypedBufferArg<Tru64::nxm_slot_state_t>		slot_state(slot_state_addr,			   slot_state_size);	    slot_state.copyIn(xc->mem);	    if (slot_state[thread_index] != Tru64::NXM_SLOT_AVAIL) {		cerr << "nxm_thread_createFunc: requested VP slot "		     << thread_index << " not available!" << endl;		fatal("");	    }	    slot_state[thread_index] = Tru64::NXM_SLOT_BOUND;	    slot_state.copyOut(xc->mem);	    // Find a free simulator execution context.	    for (int i = 0; i < process->numCpus(); ++i) {		ExecContext *xc = process->execContexts[i];		if (xc->status() == ExecContext::Unallocated) {		    // inactive context... grab it		    init_exec_context(xc, attrp, uniq_val);		    // This is supposed to be a port number, but we'll try		    // and get away with just sticking the thread index		    // here.		    *kidp = thread_index;		    kidp.copyOut(xc->mem);		    return 0;		}	    }	    // fell out of loop... no available inactive context	    cerr << "nxm_thread_create: no idle contexts available." << endl;	    abort();	} else {	    cerr << "nxm_thread_create: can't handle thread type "		 << attrp->type << endl;	    abort();	}	return 0;    }    /// Thread idle call (like yield()).    static SyscallReturn    nxm_idleFunc(SyscallDesc *desc, int callnum, Process *process,		 ExecContext *xc)    {	return 0;    }    /// Block thread.    static SyscallReturn    nxm_thread_blockFunc(SyscallDesc *desc, int callnum, Process *process,			 ExecContext *xc)    {	uint64_t tid = xc->getSyscallArg(0);	uint64_t secs = xc->getSyscallArg(1);	uint64_t flags = xc->getSyscallArg(2);	uint64_t action = xc->getSyscallArg(3);	uint64_t usecs = xc->getSyscallArg(4);	cout << xc->cpu->name() << ": nxm_thread_block " << tid << " " << secs	     << " " << flags << " " << action << " " << usecs << endl;	return 0;    }    /// block.    static SyscallReturn    nxm_blockFunc(SyscallDesc *desc, int callnum, Process *process,		  ExecContext *xc)    {	Addr uaddr = xc->getSyscallArg(0);	uint64_t val = xc->getSyscallArg(1);	uint64_t secs = xc->getSyscallArg(2);	uint64_t usecs = xc->getSyscallArg(3);	uint64_t flags = xc->getSyscallArg(4);	BaseCPU *cpu = xc->cpu;	cout << cpu->name() << ": nxm_block "	     << hex << uaddr << dec << " " << val	     << " " << secs << " " << usecs	     << " " << flags << endl;	return 0;    }    /// Unblock thread.    static SyscallReturn    nxm_unblockFunc(SyscallDesc *desc, int callnum, Process *process,		    ExecContext *xc)    {	Addr uaddr = xc->getSyscallArg(0);	cout << xc->cpu->name() << ": nxm_unblock "	     << hex << uaddr << dec << endl;	return 0;    }    /// Switch thread priority.    static SyscallReturn    swtch_priFunc(SyscallDesc *desc, int callnum, Process *process,		  ExecContext *xc)    {	// Attempts to switch to another runnable thread (if there is	// one).  Returns false if there are no other threads to run	// (i.e., the thread can reasonably spin-wait) or true if there	// are other threads.	//	// Since we assume at most one "kernel" thread per CPU, it's	// always safe to return false here.	return 0; //false;    }    /// Activate exec context waiting on a channel.  Just activate one    /// by default.    static int    activate_waiting_context(Addr uaddr, Process *process,			     bool activate_all = false)    {	int num_activated = 0;	list<Process::WaitRec>::iterator i = process->waitList.begin();	list<Process::WaitRec>::iterator end = process->waitList.end();	while (i != end && (num_activated == 0 || activate_all)) {	    if (i->waitChan == uaddr) {		// found waiting process: make it active		ExecContext *newCtx = i->waitingContext;		assert(newCtx->status() == ExecContext::Suspended);		newCtx->activate();		// get rid of this record		i = process->waitList.erase(i);		++num_activated;	    } else {		++i;	    }	}	return num_activated;    }    /// M5 hacked-up lock acquire.    static void    m5_lock_mutex(Addr uaddr, Process *process, ExecContext *xc)    {	TypedBufferArg<uint64_t> lockp(uaddr);	lockp.copyIn(xc->mem);	if (*lockp == 0) {	    // lock is free: grab it	    *lockp = 1;	    lockp.copyOut(xc->mem);	} else {	    // lock is busy: disable until free	    process->waitList.push_back(Process::WaitRec(uaddr, xc));	    xc->suspend();	}    }    /// M5 unlock call.    static void    m5_unlock_mutex(Addr uaddr, Process *process, ExecContext *xc)    {	TypedBufferArg<uint64_t> lockp(uaddr);	lockp.copyIn(xc->mem);	assert(*lockp != 0);	// Check for a process waiting on the lock.	int num_waiting = activate_waiting_context(uaddr, process);	// clear lock field if no waiting context is taking over the lock	if (num_waiting == 0) {	    *lockp = 0;	    lockp.copyOut(xc->mem);	}    }    /// Lock acquire syscall handler.    static SyscallReturn    m5_mutex_lockFunc(SyscallDesc *desc, int callnum, Process *process,		      ExecContext *xc)    {	Addr uaddr = xc->getSyscallArg(0);	m5_lock_mutex(uaddr, process, xc);	// Return 0 since we will always return to the user with the lock	// acquired.  We will just keep the context inactive until that is	// true.	return 0;    }    /// Try lock (non-blocking).    static SyscallReturn    m5_mutex_trylockFunc(SyscallDesc *desc, int callnum, Process *process,			 ExecContext *xc)    {	Addr uaddr = xc->getSyscallArg(0);	TypedBufferArg<uint64_t> lockp(uaddr);	lockp.copyIn(xc->mem);	if (*lockp == 0) {	    // lock is free: grab it	    *lockp = 1;	    lockp.copyOut(xc->mem);	    return 0;	} else {	    return 1;	}    }    /// Unlock syscall handler.    static SyscallReturn    m5_mutex_unlockFunc(SyscallDesc *desc, int callnum, Process *process,			ExecContext *xc)    {	Addr uaddr = xc->getSyscallArg(0);	m5_unlock_mutex(uaddr, process, xc);	return 0;    }    /// Signal ocndition.    static SyscallReturn    m5_cond_signalFunc(SyscallDesc *desc, int callnum, Process *process,		       ExecContext *xc)    {	Addr cond_addr = xc->getSyscallArg(0);	// Wake up one process waiting on the condition variable.	activate_waiting_context(cond_addr, process);	return 0;    }    /// Wake up all processes waiting on the condition variable.    static SyscallReturn    m5_cond_broadcastFunc(SyscallDesc *desc, int callnum, Process *process,			  ExecContext *xc)    {	Addr cond_addr = xc->getSyscallArg(0);	activate_waiting_context(cond_addr, process, true);	return 0;    }    /// Wait on a condition.    static SyscallReturn    m5_cond_waitFunc(SyscallDesc *desc, int callnum, Process *process,		     ExecContext *xc)    {	Addr cond_addr = xc->getSyscallArg(0);	Addr lock_addr = xc->getSyscallArg(1);	TypedBufferArg<uint64_t> condp(cond_addr);	TypedBufferArg<uint64_t> lockp(lock_addr);	// user is supposed to acquire lock before entering	lockp.copyIn(xc->mem);	assert(*lockp != 0);	m5_unlock_mutex(lock_addr, process, xc);	process->waitList.push_back(Process::WaitRec(cond_addr, xc));	xc->suspend();	return 0;    }    /// Thread exit.    static SyscallReturn    m5_thread_exitFunc(SyscallDesc *desc, int callnum, Process *process,		       ExecContext *xc)    {	assert(xc->status() == ExecContext::Active);	xc->deallocate();	return 0;    }    /// Array of syscall descriptors for Mach syscalls, indexed by    /// (negated) call number.    static SyscallDesc machSyscallDescs[];    /// Number of syscalls in machSyscallDescs[].    static const int Num_Mach_Syscall_Descs;    /// Max supported Mach syscall number.    static const int Max_Mach_Syscall_Desc;    /// Since negated values are used to identify Mach syscalls, the    /// minimum (signed) valid syscall number is the negated max Mach    /// syscall number.    static const int Min_Syscall_Desc;    /// Do the specified syscall.  Just looks the call number up in    /// the table and invokes the appropriate handler.    static void    doSyscall(int callnum, Process *process, ExecContext *xc)    {	if (callnum < Min_Syscall_Desc || callnum > Max_Syscall_Desc) {	    fatal("Syscall %d out of range\n", callnum);	}	SyscallDesc *desc =	    (callnum < 0) ?	    &machSyscallDescs[-callnum] : &syscallDescs[callnum];	desc->doSyscall(callnum, process, xc);    }    /// Indirect syscall invocation (call #0).    static SyscallReturn    indirectSyscallFunc(SyscallDesc *desc, int callnum, Process *process,			ExecContext *xc)    {	int new_callnum = xc->getSyscallArg(0);	for (int i = 0; i < 5; ++i)	    xc->setSyscallArg(i, xc->getSyscallArg(i+1));	doSyscall(new_callnum, process, xc);	return 0;    }};  // class Tru64// open(2) flags translation tableOpenFlagTransTable Tru64::openFlagTable[] = {#ifdef _MSC_VER  { Tru64::TGT_O_RDONLY,	_O_RDONLY },

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩欧美电影一区| 99精品在线免费| 91精品午夜视频| 午夜成人在线视频| 91精品久久久久久蜜臀| 日av在线不卡| 精品第一国产综合精品aⅴ| 精品午夜久久福利影院| 国产午夜精品一区二区三区嫩草| 国产精品资源站在线| 中文无字幕一区二区三区 | 4438成人网| 人人狠狠综合久久亚洲| 日韩三级免费观看| 国产精一品亚洲二区在线视频| 国产情人综合久久777777| av动漫一区二区| 亚洲一二三四在线| 91精品视频网| 国产mv日韩mv欧美| 亚洲精品网站在线观看| 在线不卡一区二区| 国内精品国产成人国产三级粉色 | 一区二区欧美在线观看| 欧美福利一区二区| 国产精品99久久久久久宅男| 亚洲激情综合网| 日韩欧美黄色影院| 99精品桃花视频在线观看| 亚洲成a人v欧美综合天堂下载 | 亚洲精品少妇30p| 欧美一区二区三区成人| 国产在线精品一区二区| 亚洲精品ww久久久久久p站| 91精品国产黑色紧身裤美女| 成人一二三区视频| 亚洲地区一二三色| 国产欧美日韩在线观看| 宅男在线国产精品| 成人性生交大片免费看视频在线| 亚洲国产一区在线观看| 久久久久久久久久久久久夜| 欧美视频自拍偷拍| 国产成人免费高清| 日韩电影在线一区二区三区| 中文字幕免费一区| 欧美一区二视频| 色综合久久99| 国产福利一区在线| 日本三级韩国三级欧美三级| 亚洲欧洲国产日本综合| 精品理论电影在线观看 | 久久奇米777| 欧美丰满美乳xxx高潮www| 成人18视频在线播放| 全国精品久久少妇| 亚洲小说春色综合另类电影| 国产精品免费aⅴ片在线观看| 日韩午夜精品视频| 欧美午夜精品一区二区蜜桃| voyeur盗摄精品| 国产精品一区二区91| 美女视频黄 久久| 亚洲一二三区视频在线观看| **欧美大码日韩| 国产调教视频一区| 欧美不卡视频一区| 欧美一级欧美一级在线播放| 在线观看视频欧美| 一本一道久久a久久精品综合蜜臀| 国产精品1区2区3区在线观看| 另类调教123区| 秋霞av亚洲一区二区三| 亚洲午夜精品网| 一区二区三区视频在线看| 国产精品久久久久久福利一牛影视| 久久综合九色综合欧美就去吻| 欧美丰满少妇xxxxx高潮对白| 欧美日韩亚洲另类| 欧美日韩免费一区二区三区| 欧美午夜一区二区三区免费大片| 欧美亚州韩日在线看免费版国语版| 色综合久久久网| 欧美丝袜丝交足nylons| 欧美欧美欧美欧美首页| 正在播放一区二区| 精品国产三级电影在线观看| 久久久亚洲精品一区二区三区| 久久久久久久久一| 国产精品久久久一本精品 | 免费久久99精品国产| 日本女人一区二区三区| 欧美aa在线视频| 精品一区二区三区的国产在线播放| 麻豆国产精品官网| 综合自拍亚洲综合图不卡区| 国产精品全国免费观看高清| 久久美女高清视频| 日韩精品一区二区三区三区免费| 337p粉嫩大胆色噜噜噜噜亚洲| 日韩欧美成人一区二区| 日韩欧美久久久| 日韩欧美123| 日韩免费视频线观看| 91精品视频网| 精品少妇一区二区三区 | 91原创在线视频| 99久久精品99国产精品 | 国产精品萝li| 亚洲视频图片小说| 亚洲一二三专区| 午夜视频一区二区三区| 国产综合色在线视频区| 国产精品一区二区三区99| 国产寡妇亲子伦一区二区| 成人av综合在线| 欧美综合一区二区三区| 色就色 综合激情| 精品免费一区二区三区| 国产三级精品三级| 亚洲欧美电影一区二区| 亚洲国产成人av网| 日本一区中文字幕| 国产91露脸合集magnet| 色综合天天综合网国产成人综合天| 不卡一区在线观看| 欧美日韩在线综合| 精品少妇一区二区三区视频免付费| 国产女人aaa级久久久级| 日本一区二区成人在线| 日韩高清中文字幕一区| 国产美女久久久久| 色综合天天综合狠狠| 日韩一区二区三区电影| 久久久久久久综合| 婷婷综合久久一区二区三区| 国产老妇另类xxxxx| 91欧美激情一区二区三区成人| 欧美久久婷婷综合色| 国产偷v国产偷v亚洲高清| 成人免费在线视频观看| 看国产成人h片视频| 成人在线综合网站| 制服丝袜中文字幕亚洲| 国产精品无码永久免费888| 亚洲成人一区在线| 豆国产96在线|亚洲| 欧美蜜桃一区二区三区| 国产精品―色哟哟| 婷婷综合另类小说色区| 久久精品久久精品| 成人av动漫在线| 在线免费一区三区| 亚洲国产精品av| 日本不卡一区二区| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 欧美一区二区三区公司| 亚洲欧美福利一区二区| 国产高清精品久久久久| 久久久亚洲欧洲日产国码αv| 亚洲午夜久久久久久久久电影院| 国产91丝袜在线播放0| 日韩一区二区三区观看| 亚洲一区二区在线视频| 国产高清不卡一区二区| 日韩一区二区三区av| 一区二区三区在线免费观看| 国产精品一区二区在线观看网站 | 美女一区二区视频| 欧美少妇性性性| 亚洲国产aⅴ天堂久久| 9人人澡人人爽人人精品| 久久综合999| 美腿丝袜亚洲三区| 欧美日韩精品一二三区| 亚洲精品精品亚洲| 99久久精品免费看国产免费软件| 久久人人爽人人爽| 麻豆精品视频在线| 久久女同性恋中文字幕| 久草这里只有精品视频| 欧美一级免费大片| 亚欧色一区w666天堂| 欧美在线free| 亚洲综合色噜噜狠狠| 欧美日韩你懂得| 日日摸夜夜添夜夜添亚洲女人| 欧美系列一区二区| 亚洲成av人在线观看| 欧美日韩亚洲综合| 午夜婷婷国产麻豆精品| 国产精品国产a| 懂色一区二区三区免费观看| 久久你懂得1024| 精品一二三四区| 中文字幕一区二区三区四区| 99亚偷拍自图区亚洲| 亚洲欧美激情一区二区| 色综合天天视频在线观看| 亚洲精品久久久蜜桃|