⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wb.c

📁 skyeye是一个可以模拟嵌入式硬件开发板的系统软件
💻 C
字号:
#include "armdefs.h"/* wb_init * @wb_t	:wb_t to init * @num		:num of entrys * @nb		:num of byte of each entry * * $	-1:error * 		 0:ok * */intmmu_wb_init (wb_t * wb_t, int num, int nb){	int i;	wb_entry_t *entrys, *wb;	entrys = (wb_entry_t *) malloc (sizeof (*entrys) * num);	if (entrys == NULL) {		err_msg ("malloc size %d\n", sizeof (*entrys) * num);		goto entrys_malloc_error;	}	for (wb = entrys, i = 0; i < num; i++, wb++) {		/*chy 2004-06-06, fix bug found by wenye@cs.ucsb.edu */		//wb->data = (ARMword *)malloc(sizeof(ARMword) * nb);		wb->data = (ARMword *) malloc (nb);		if (wb->data == NULL) {			err_msg ("malloc size of %d\n", nb);			goto data_malloc_error;		}	};	wb_t->first = wb_t->last = wb_t->used = 0;	wb_t->num = num;	wb_t->nb = nb;	wb_t->entrys = entrys;	return 0;      data_malloc_error:	while (--i >= 0)		free (entrys[i].data);	free (entrys);      entrys_malloc_error:	return -1;};/* wb_exit * @wb_t :wb_t to exit * */voidmmu_wb_exit (wb_t * wb_t){	int i;	wb_entry_t *wb;	wb = wb_t->entrys;	for (i = 0; i < wb_t->num; i++, wb++) {		free (wb->data);	}	free (wb_t->entrys);};/* wb_write_words :put words in Write Buffer * @state:	ARMul_State * @wb_t:	write buffer * @pa:		physical address * @data:	data ptr * @n		number of word to write * * Note: write buffer merge is not implemented, can be done late * */voidmmu_wb_write_bytes (ARMul_State * state, wb_t * wb_t, ARMword pa,		    ARMbyte * data, int n){	int i;	wb_entry_t *wb;	while (n) {		if (wb_t->num == wb_t->used) {			/*clean the last wb entry */			ARMword t;			wb = &wb_t->entrys[wb_t->last];			t = wb->pa;			for (i = 0; i < wb->nb; i++) {				mem_write_byte (state, t, wb->data[i]);				//t += WORD_SIZE;				t++;			}			wb_t->last++;			if (wb_t->last == wb_t->num)				wb_t->last = 0;			wb_t->used--;		}		wb = &wb_t->entrys[wb_t->first];		i = (n < wb_t->nb) ? n : wb_t->nb;		wb->pa = pa;		//pa += i << WORD_SHT;		pa += i;		wb->nb = i;		//memcpy(wb->data, data, i << WORD_SHT);		memcpy (wb->data, data, i);		data += i;		n -= i;		wb_t->first++;		if (wb_t->first == wb_t->num)			wb_t->first = 0;		wb_t->used++;	};//teawater add for set_dirty fflash cache function 2005.07.18-------------------#ifndef NO_DBCT	if (!skyeye_config.no_dbct) {		tb_setdirty (state, pa, NULL);	}#endif//AJ2D--------------------------------------------------------------------------}/* wb_drain_all * @wb_t wb_t to drain * */voidmmu_wb_drain_all (ARMul_State * state, wb_t * wb_t){	ARMword pa;	wb_entry_t *wb;	int i;	while (wb_t->used) {		wb = &wb_t->entrys[wb_t->last];		pa = wb->pa;		for (i = 0; i < wb->nb; i++) {			mem_write_byte (state, pa, wb->data[i]);			//pa += WORD_SIZE;			pa++;		}		wb_t->last++;		if (wb_t->last == wb_t->num)			wb_t->last = 0;		wb_t->used--;	};}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -