免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1391 | 回复: 0

freebsd6的I386对微通道支持源代码 [复制链接]

论坛徽章:
0
发表于 2006-05-09 13:55 |显示全部楼层

#include
__FBSDID("$FreeBSD: src/sys/i386/bios/mca_machdep.c,v 1.9 2004/08/31 21:51:51 mdodd Exp $");
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
/* 全局微通道总线标志,0代表没有微通道,1代表有*/
int MCA_system = 0;
/* 由BIOS的15号C0字功能调用后返回的系统配置结构 */
struct sys_config {
u_int16_t count;
u_int8_t model;
u_int8_t submodel;
u_int8_t bios_rev;
u_int8_t feature;
#define FEATURE_MCAISA 0x01 /* 含有微通道和ISA总线*/
#define FEATURE_MCABUS 0x02 /* 含有微通道  */
#define FEATURE_EBDA 0x04 /* 扩充的BIOS数据区被分配*/
#define FEATURE_WAITEV 0x08 /* 支持扩充事件等待*/
#define FEATURE_KBDINT 0x10 /* INT 09H 中断为键盘*/
#define FEATURE_RTC 0x20 /* 实时钟存在*/
#define FEATURE_IC2 0x40 /* 第二中断芯片存在*/
#define FEATURE_DMA3 0x80 /* DMA 通道 3 由磁盘BIOS使用*/
u_int8_t pad[3];
} __packed;
/* 函数原形 */
static void bios_mcabus_present (void *);
SYSINIT(mca_present, SI_SUB_CPU, SI_ORDER_ANY, bios_mcabus_present, NULL);
/* Functions */
static void
bios_mcabus_present(void * dummy)
{
struct vm86frame vmf; /*CPU的寄存器结构,可以32位,16位,8位表示法.见/sys/i386/include/vm86.h*/
struct sys_config * scp;
vm_offset_t  paddr;
bzero(&vmf, sizeof(struct vm86frame));/*分配一段内存(按字节方式,因为寄存器可描述到字节,即8位,如AH,AL等)*/
vmf.vmf_ah = 0xc0;/*准备BIOS中断调用,准备调用的AH寄存器对应结构成员放入C0,*/
if (vm86_intcall(0x15, &vmf)) {/*BIOS中断调用INT 15,我的中断大全丢了,没查到,看下文估计是PS/2鼠标?*/
  /* bootverbose参数在init_main.c主程序中申明.意思是在启动时候是否打印出一些问题细节.文件的申明如下:
  int bootverbose;
  SYSCTL_INT(_debug, OID_AUTO, bootverbose, CTLFLAG_RW, &bootverbose, 0, "");
  该变量位于debug节点下.可以用sysctl debug.bootverbose来显示,由于读写标记为CTLFLAG_RW,说明它可以设置的.
  */
  if (bootverbose) {
   printf("BIOS SDT: INT call failed.\n");
  }
  return;
}
if ((vmf.vmf_ah != 0) && (vmf.vmf_flags & 0x01)) {/*AH寄存器返回值为非0并且标志位的第一位置位,有错误*/
  if (bootverbose) {
   printf("BIOS SDT: Not supported.  Not PS/2?\n");
   printf("BIOS SDT: AH 0x%02x, Flags 0x%04x\n",
    vmf.vmf_ah, vmf.vmf_flags);
  }
  return;
}
paddr = vmf.vmf_es;/*中断调用后返回数据在ES:BX中*/
paddr = (paddr model, scp->submodel, scp->bios_rev);
  printf("BIOS SDT: features 0x%b\n", scp->feature,
   "\20"
   "\01MCA+ISA"
   "\02MCA"
   "\03EBDA"
   "\04WAITEV"
   "\05KBDINT"
   "\06RTC"
   "\07IC2"
   "\08DMA3"
   "\n");
}
MCA_system = ((scp->feature & FEATURE_MCABUS) ? 1 : 0);/*是微通道总线吗?*/
if (MCA_system)
  printf("MicroChannel Architecture System detected.\n");
return;
}
int
mca_bus_nmi (void)
/*
在/sys/i386/isa/nmi.c中对其调用.用于微通道总线不可屏蔽的中断处理程序的一支撑函数
该程序的被调用有个前提,MAC_system=1即机器有微通道总线.
*/
{
int slot;
int retval = 0;
int pos5 = 0;
/* 关闭主板设置寄存器. mca_busreg.h(74)定义了I/O口:#define MCA_MB_SETUP_REG 0x94 */
outb(MCA_MB_SETUP_REG, MCA_MB_SETUP_DIS);
/* 搜寻每个槽位 */
for (slot = 0; slot


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/2681/showart_110214.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP