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

📄 resource.c

📁 GNU Mach 微内核源代码, 基于美国卡内基美隆大学的 Mach 研究项目
💻 C
字号:
/* *	linux/kernel/resource.c * * Copyright (C) 1995	Linus Torvalds *			David Hinds * * Kernel io-region resource management */#include <sys/types.h>#define MACH_INCLUDE#include <linux/sched.h>#include <linux/kernel.h>#include <linux/errno.h>#include <linux/types.h>#include <linux/ioport.h>#define IOTABLE_SIZE 128typedef struct resource_entry_t{  u_long from, num;  const char *name;  struct resource_entry_t *next;} resource_entry_t;static resource_entry_t iolist = { 0, 0, "", NULL };static resource_entry_t iotable[IOTABLE_SIZE];/* * This generates the report for /proc/ioports */#ifndef MACHintget_ioport_list (char *buf){  resource_entry_t *p;  int len = 0;    for (p = iolist.next; (p) && (len < 4000); p = p->next)    len += linux_sprintf (buf+len, "%04lx-%04lx : %s\n",			  p->from, p->from+p->num-1, p->name);  if (p)    len += linux_sprintf (buf+len, "4K limit reached!\n");  return len;}#endif/* * The workhorse function: find where to put a new entry */static resource_entry_t *find_gap (resource_entry_t *root, u_long from, u_long num){  unsigned long flags;  resource_entry_t *p;    if (from > from+num-1)    return NULL;  save_flags (flags);  cli ();  for (p = root; ; p = p->next)    {      if ((p != root) && (p->from+p->num-1 >= from))	{	  p = NULL;	  break;	}      if ((p->next == NULL) || (p->next->from > from+num-1))	break;    }  restore_flags (flags);  return p;}/* * Call this from the device driver to register the ioport region. */voidrequest_region (unsigned int from, unsigned int num, const char *name){  resource_entry_t *p;  int i;    for (i = 0; i < IOTABLE_SIZE; i++)    if (iotable[i].num == 0)      break;  if (i == IOTABLE_SIZE)    printk ("warning: ioport table is full\n");  else    {      p = find_gap (&iolist, from, num);      if (p == NULL)	return;      iotable[i].name = name;      iotable[i].from = from;      iotable[i].num = num;      iotable[i].next = p->next;      p->next = &iotable[i];      return;    }}/*  * Call this when the device driver is unloaded */voidrelease_region (unsigned int from, unsigned int num){  resource_entry_t *p, *q;    for (p = &iolist; ; p = q)    {      q = p->next;      if (q == NULL)	break;      if ((q->from == from) && (q->num == num))	{	  q->num = 0;	  p->next = q->next;	  return;	}    }}/* * Call this to check the ioport region before probing */intcheck_region (unsigned int from, unsigned int num){  return (find_gap (&iolist, from, num) == NULL) ? -LINUX_EBUSY : 0;}/* Called from init/main.c to reserve IO ports. */voidreserve_setup(char *str, int *ints){  int i;    for (i = 1; i < ints[0]; i += 2)    request_region (ints[i], ints[i+1], "reserved");}

⌨️ 快捷键说明

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