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

📄 mptest.c

📁 sun公司的sparc v8处理器的配置代码。
💻 C
字号:
#include "testmod.h"asm("	.text\n""	.align 4\n""	.global get_pid\n"	"get_sem:\n"	"	set  mpsem, %o1\n""	set  0, %o0\n""	retl\n""	swapa [%o1] 1, %o0 \n""ret_sem:\n""	set 1, %o0 \n""	set mpsem, %o1\n""	retl\n""	st  %o0, [%o1]		\n"		"get_pid:\n""        mov  %asr17, %o0\n""        srl  %o0, 28, %o0\n""        retl\n""        and %o0, 0xf, %o0\n""mread: retl\n""        lda  [%o0] 1, %o0\n""getccfg: set 0xc, %o0\n""         retl\n""         lda [%o0] 2, %o0\n"	"	.data\n""	.align 4\n""	.global mpsem\n""mpsem:	.word 1\n"	);#define MPLOOPS 10volatile int cnt = 0;volatile int pstart[17] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1};volatile int pdone[17] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1};volatile int pindex[17] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1};static int absl(int a, int b){  if (a > b)    return(a-b);  else    return(b-a);}     static void psync(volatile int arr[], int n, int ncpu){  int i, go;  arr[n] = 1;  do {    go = 1;    for (i = 0; i < ncpu; i++)      if (!arr[i]) go = 0;  } while (!go);}int mptest(volatile int *irqmp_ptr){  int id, i, sem, ncpu;  unsigned int ccfg;    ncpu = (((*(irqmp_ptr + 0x10/4)) >> 28) & 0x0f) + 1;  if (ncpu == 1) return(-1);  id = get_pid();  report_subtest(MP_TEST + (id <<4));  ccfg = getccfg();  if (!((ccfg >> 27) & 1)) fail(1);            *(irqmp_ptr + 0x10/4) = (1 << (id+1));      psync(pstart, id, ncpu);  for (pindex[id] = 0; pindex[id] < MPLOOPS; pindex[id]++)  {    do {sem = get_sem();} while (!sem);    for (i = 0; i < ncpu; i++)    {      if (absl(pindex[id], pindex[i]) > 1) fail(2);    }    cnt++;    ret_sem();  }  psync(pdone, id, ncpu);  if (cnt != (MPLOOPS*ncpu)) fail(3);  if ((cnt <= 0) || (cnt > (MPLOOPS*ncpu))) fail(3);  if (id != 0) asm("ta 0");  return(0);}	int mptest_start(volatile int *irqmp_ptr){  int id, i, sem, ncpu;  unsigned int ccfg;    ncpu = (((*(irqmp_ptr + 0x10/4)) >> 28) & 0x0f) + 1;  if (ncpu == 1) return(-1);  id = get_pid();  if (id == 0) {    *(irqmp_ptr + 0x10/4) = 0x0ffff;  }}int mptest_end(volatile int *irqmp_ptr){  int id, i, sem, ncpu;  unsigned int ccfg;    ncpu = (((*(irqmp_ptr + 0x10/4)) >> 28) & 0x0f) + 1;  if (ncpu == 1) return(-1);  id = get_pid();  report_subtest(MP_TEST + (id << 4));  ccfg = getccfg();  if (!((ccfg >> 27) & 1)) fail(1);            psync(pstart, id, ncpu);  for (pindex[id] = 0; pindex[id] < MPLOOPS; pindex[id]++)  {    do {sem = get_sem();} while (!sem);    for (i = 0; i < ncpu; i++)    {      if (absl(pindex[id], pindex[i]) > 1) fail(2);    }    cnt++;    ret_sem();  }  psync(pdone, id, ncpu);  if (cnt != (MPLOOPS*ncpu)) fail(3);  if ((cnt <= 0) || (cnt > (MPLOOPS*ncpu))) fail(3);  if (id != 0) asm("ta 0");  return(0);}

⌨️ 快捷键说明

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