XINU
rdsinit.c
Go to the documentation of this file.
1 
7 /* rdsinit.c - rdsinit */
8 
9 #include <xinu.h>
10 
12 
13 /*------------------------------------------------------------------------
14  * rdsinit - Initialize the remote disk system device
15  *------------------------------------------------------------------------
16  */
18  struct dentry *devptr /* Entry in device switch table */
19 )
20 {
21  struct rdscblk *rdptr; /* Ptr to device contol block */
22  struct rdbuff *bptr; /* Ptr to buffer in memory */
23  /* used to form linked list */
24  struct rdbuff *pptr; /* Ptr to previous buff on list */
25  struct rdbuff *buffend; /* Last address in buffer memory*/
26  uint32 size; /* Total size of memory needed */
27  /* buffers */
28 
29  /* Obtain address of control block */
30 
31  rdptr = &rdstab[devptr->dvminor];
32 
33  /* Set control block to unused */
34 
35  rdptr->rd_state = RD_FREE;
36 
37  /* Create the resprocess and leave it suspended. */
38  /* Note: the process cannot be resumed because */
39  /* device initialization occurs before interrupts */
40  /* are enabled. */
41 
43  "rdsproc", 1, rdptr);
44  if (rdptr->rd_comproc == SYSERR)
45  {
46  panic("Cannot create remote disk process");
47  }
48  rdptr->rd_comruns = FALSE;
49 
50  rdptr->rd_id[0] = NULLCH;
51 
52  /* Set initial message sequence number */
53 
54  rdptr->rd_seq = 1;
55 
56  /* Initialize request queue and cache to empty */
57 
58  rdptr->rd_rhnext = (struct rdbuff *)&rdptr->rd_rtnext;
59  rdptr->rd_rhprev = (struct rdbuff *)NULL;
60 
61  rdptr->rd_rtnext = (struct rdbuff *)NULL;
62  rdptr->rd_rtprev = (struct rdbuff *)&rdptr->rd_rhnext;
63 
64  rdptr->rd_chnext = (struct rdbuff *)&rdptr->rd_ctnext;
65  rdptr->rd_chprev = (struct rdbuff *)NULL;
66 
67  rdptr->rd_ctnext = (struct rdbuff *)NULL;
68  rdptr->rd_ctprev = (struct rdbuff *)&rdptr->rd_chnext;
69 
70  /* Allocate memory for a set of buffers (actually request */
71  /* blocks and link them to form the initial free list */
72 
73  size = sizeof(struct rdbuff) * RD_BUFFS;
74 
75  bptr = (struct rdbuff *)getmem(size);
76  rdptr->rd_free = bptr;
77 
78  if ((int32)bptr == SYSERR)
79  {
80  panic("Cannot allocate memory for remote disk buffers");
81  }
82 
83  pptr = (struct rdbuff *)NULL; /* To avoid a compiler warning */
84  buffend = (struct rdbuff *)((char *)bptr + size);
85  while (bptr < buffend)
86  { /* walk through memory */
87  pptr = bptr;
88  bptr = (struct rdbuff *)(sizeof(struct rdbuff) + (char *)bptr);
89  pptr->rd_status = RD_INVALID; /* Buffer is empty */
90  pptr->rd_next = bptr; /* Point to next buffer */
91  }
92  pptr->rd_next = (struct rdbuff *)NULL; /* Last buffer on list */
93 
94  /* Create the request list and available buffer semaphores */
95 
96  rdptr->rd_availsem = semcreate(RD_BUFFS);
97  rdptr->rd_reqsem = semcreate(0);
98 
99  /* Set the server IP address, server port, and local port */
100 
101  if (dot2ip(RD_SERVER_IP, &rdptr->rd_ser_ip) == SYSERR)
102  {
103  panic("invalid IP address for remote disk server");
104  }
105 
106  /* Set the port numbers */
107 
108  rdptr->rd_ser_port = RD_SERVER_PORT;
109  rdptr->rd_loc_port = RD_LOC_PORT + devptr->dvminor;
110 
111  /* Specify that the server port is not yet registered */
112 
113  rdptr->rd_registered = FALSE;
114 
115  return OK;
116 }
#define NULL
連結リスト用のNULLポインタ
Definition: kernel.h:68
#define RD_FREE
Definition: rdisksys.h:36
uint16 rd_loc_port
Definition: rdisksys.h:95
uint32 rd_ser_ip
Definition: rdisksys.h:93
#define RD_SERVER_IP
Definition: rdisksys.h:14
sid32 rd_reqsem
Definition: rdisksys.h:92
sid32 semcreate(int32)
未使用セマフォを割り当て、そのセマフォへのインデックス(セマフォID)を返す。
Definition: semcreate.c:22
#define RD_SERVER_PORT
Definition: rdisksys.h:18
int32 dvminor
Definition: conf.h:8
全てのシステムヘッダファイルをインクルードする。
#define SYSERR
処理が失敗した場合
Definition: kernel.h:79
bool8 rd_registered
Definition: rdisksys.h:96
struct rdbuff * rd_rtnext
Definition: rdisksys.h:75
int32 rd_status
Definition: rdisksys.h:62
#define OK
処理が成功した場合
Definition: kernel.h:77
sid32 rd_availsem
Definition: rdisksys.h:91
pid32 rd_comproc
Definition: rdisksys.h:89
Definition: conf.h:6
bool8 rd_comruns
Definition: rdisksys.h:90
struct rdbuff * rd_chprev
Definition: rdisksys.h:81
uint16 rd_ser_port
Definition: rdisksys.h:94
struct rdbuff * rd_free
Definition: rdisksys.h:87
struct rdscblk rdstab[Nrds]
Definition: rdsinit.c:11
#define FALSE
Boolean False(0)
Definition: kernel.h:63
struct rdbuff * rd_rhnext
Definition: rdisksys.h:73
#define RD_STACK
Definition: rdisksys.h:31
struct rdbuff * rd_rhprev
Definition: rdisksys.h:74
#define RD_BUFFS
Definition: rdisksys.h:30
#define RD_LOC_PORT
Definition: rdisksys.h:22
int int32
符号あり32ビット整数(int)
Definition: kernel.h:11
struct rdbuff * rd_next
Definition: rdisksys.h:56
#define Nrds
Definition: conf.h:65
void rdsprocess(struct rdscblk *)
Definition: rdsprocess.c:12
pid32 create(void *, uint32, pri16, char *, uint32,...)
関数の実行を開始するプロセスを作成する。
Definition: create.c:55
devcall rdsinit(struct dentry *devptr)
Definition: rdsinit.c:17
void panic(char *)
Panic状態に陥った旨のメッセージを表示し、全てのプロセスを停止させる。
Definition: panic.c:12
struct rdbuff * rd_rtprev
Definition: rdisksys.h:76
int32 rd_seq
Definition: rdisksys.h:71
#define RD_PRIO
Definition: rdisksys.h:32
struct rdbuff * rd_ctnext
Definition: rdisksys.h:82
struct rdbuff * rd_ctprev
Definition: rdisksys.h:83
struct rdbuff * rd_chnext
Definition: rdisksys.h:80
int32 rd_state
Definition: rdisksys.h:69
char rd_id[RD_IDLEN]
Definition: rdisksys.h:70
unsigned int uint32
符号なし32ビット整数(unsigned int)
Definition: kernel.h:15
int32 devcall
デバイスコール関数 返り値の型
Definition: kernel.h:49
uint32 dot2ip(char *, uint32 *)
Definition: dot2ip.c:9
#define NULLCH
NULL文字(NULL終端)
Definition: kernel.h:70
#define RD_INVALID
Definition: rdisksys.h:49
char * getmem(uint32)
ヒープ領域を割り当て、最下位のワードアドレスを返す。
Definition: getmem.c:25