Change for safe copies, and DEV_REVIVE message including grant id
This commit is contained in:
parent
3bd3c2cee1
commit
4fa6691106
2 changed files with 29 additions and 14 deletions
|
@ -14,7 +14,7 @@ MAKE = exec make
|
||||||
CC = exec cc
|
CC = exec cc
|
||||||
CFLAGS = -I$i
|
CFLAGS = -I$i
|
||||||
LDFLAGS = -i
|
LDFLAGS = -i
|
||||||
LIBS = -lsys -lsysutil
|
LIBS = -lsysutil -lsys
|
||||||
|
|
||||||
OBJ = cmos.o
|
OBJ = cmos.o
|
||||||
LIBDRIVER = $d/libdriver/driver.o
|
LIBDRIVER = $d/libdriver/driver.o
|
||||||
|
|
|
@ -20,11 +20,12 @@
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <ibm/cmos.h>
|
#include <ibm/cmos.h>
|
||||||
#include <ibm/bios.h>
|
#include <ibm/bios.h>
|
||||||
|
#include <minix/safecopies.h>
|
||||||
|
|
||||||
extern int errno; /* error number for PM calls */
|
extern int errno; /* error number for PM calls */
|
||||||
|
|
||||||
FORWARD _PROTOTYPE( int gettime, (int who, int y2kflag, vir_bytes dst_time));
|
FORWARD _PROTOTYPE( int gettime, (int who, int y2kflag, vir_bytes dst_time, int safe));
|
||||||
FORWARD _PROTOTYPE( void reply, (int reply, int replyee, int proc, int s));
|
FORWARD _PROTOTYPE( void reply, (int reply, int replyee, int proc, cp_grant_id_t, int s));
|
||||||
|
|
||||||
FORWARD _PROTOTYPE( int read_register, (int register_address));
|
FORWARD _PROTOTYPE( int read_register, (int register_address));
|
||||||
FORWARD _PROTOTYPE( int get_cmostime, (struct tm *tmp, int y2kflag));
|
FORWARD _PROTOTYPE( int get_cmostime, (struct tm *tmp, int y2kflag));
|
||||||
|
@ -40,9 +41,11 @@ PUBLIC void main(void)
|
||||||
int y2kflag;
|
int y2kflag;
|
||||||
int result;
|
int result;
|
||||||
int suspended = NONE;
|
int suspended = NONE;
|
||||||
|
cp_grant_id_t susp_grant = GRANT_INVALID;
|
||||||
int s;
|
int s;
|
||||||
|
|
||||||
while(TRUE) {
|
while(TRUE) {
|
||||||
|
int safe = 0;
|
||||||
|
|
||||||
/* Get work. */
|
/* Get work. */
|
||||||
if (OK != (s=receive(ANY, &m)))
|
if (OK != (s=receive(ANY, &m)))
|
||||||
|
@ -54,12 +57,15 @@ PUBLIC void main(void)
|
||||||
case DEV_OPEN:
|
case DEV_OPEN:
|
||||||
case DEV_CLOSE:
|
case DEV_CLOSE:
|
||||||
case CANCEL:
|
case CANCEL:
|
||||||
reply(TASK_REPLY, m.m_source, m.IO_ENDPT, OK);
|
reply(TASK_REPLY, m.m_source, m.IO_ENDPT, GRANT_INVALID, OK);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DEV_PING:
|
case DEV_PING:
|
||||||
notify(m.m_source);
|
notify(m.m_source);
|
||||||
break;
|
break;
|
||||||
|
case DEV_IOCTL_S:
|
||||||
|
safe=1;
|
||||||
|
/* Fall through. */
|
||||||
case DEV_IOCTL:
|
case DEV_IOCTL:
|
||||||
|
|
||||||
/* Probably best to SUSPEND the caller, CMOS I/O has nasty timeouts.
|
/* Probably best to SUSPEND the caller, CMOS I/O has nasty timeouts.
|
||||||
|
@ -68,17 +74,18 @@ PUBLIC void main(void)
|
||||||
* requests at a time.
|
* requests at a time.
|
||||||
*/
|
*/
|
||||||
if (suspended != NONE) {
|
if (suspended != NONE) {
|
||||||
reply(TASK_REPLY, m.m_source, m.IO_ENDPT, EBUSY);
|
reply(TASK_REPLY, m.m_source, m.IO_ENDPT, GRANT_INVALID, EBUSY);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
suspended = m.IO_ENDPT;
|
suspended = m.IO_ENDPT;
|
||||||
reply(TASK_REPLY, m.m_source, m.IO_ENDPT, SUSPEND);
|
susp_grant = (cp_grant_id_t) m.IO_GRANT;
|
||||||
|
reply(TASK_REPLY, m.m_source, m.IO_ENDPT, susp_grant, SUSPEND);
|
||||||
|
|
||||||
switch(m.REQUEST) {
|
switch(m.REQUEST) {
|
||||||
case CIOCGETTIME: /* get CMOS time */
|
case CIOCGETTIME: /* get CMOS time */
|
||||||
case CIOCGETTIMEY2K:
|
case CIOCGETTIMEY2K:
|
||||||
y2kflag = (m.REQUEST = CIOCGETTIME) ? 0 : 1;
|
y2kflag = (m.REQUEST == CIOCGETTIME) ? 0 : 1;
|
||||||
result = gettime(m.IO_ENDPT, y2kflag, (vir_bytes) m.ADDRESS);
|
result = gettime(m.IO_ENDPT, y2kflag, (vir_bytes) m.ADDRESS, safe);
|
||||||
break;
|
break;
|
||||||
case CIOCSETTIME:
|
case CIOCSETTIME:
|
||||||
case CIOCSETTIMEY2K:
|
case CIOCSETTIMEY2K:
|
||||||
|
@ -96,9 +103,9 @@ PUBLIC void main(void)
|
||||||
* processes and return the status of reading the CMOS.
|
* processes and return the status of reading the CMOS.
|
||||||
*/
|
*/
|
||||||
if (suspended == NONE)
|
if (suspended == NONE)
|
||||||
reply(DEV_NO_STATUS, m.m_source, NONE, OK);
|
reply(DEV_NO_STATUS, m.m_source, NONE, GRANT_INVALID, OK);
|
||||||
else
|
else
|
||||||
reply(DEV_REVIVE, m.m_source, suspended, result);
|
reply(DEV_REVIVE, m.m_source, suspended, susp_grant, result);
|
||||||
suspended = NONE;
|
suspended = NONE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -107,7 +114,7 @@ PUBLIC void main(void)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
reply(TASK_REPLY, m.m_source, m.IO_ENDPT, EINVAL);
|
reply(TASK_REPLY, m.m_source, m.IO_ENDPT, GRANT_INVALID, EINVAL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -115,7 +122,7 @@ PUBLIC void main(void)
|
||||||
/*===========================================================================*
|
/*===========================================================================*
|
||||||
* reply *
|
* reply *
|
||||||
*===========================================================================*/
|
*===========================================================================*/
|
||||||
PRIVATE void reply(int code, int replyee, int process, int status)
|
PRIVATE void reply(int code, int replyee, int process, cp_grant_id_t grantid, int status)
|
||||||
{
|
{
|
||||||
message m;
|
message m;
|
||||||
int s;
|
int s;
|
||||||
|
@ -123,6 +130,7 @@ PRIVATE void reply(int code, int replyee, int process, int status)
|
||||||
m.m_type = code; /* TASK_REPLY or REVIVE */
|
m.m_type = code; /* TASK_REPLY or REVIVE */
|
||||||
m.REP_STATUS = status; /* result of device operation */
|
m.REP_STATUS = status; /* result of device operation */
|
||||||
m.REP_ENDPT = process; /* which user made the request */
|
m.REP_ENDPT = process; /* which user made the request */
|
||||||
|
m.REP_IO_GRANT = grantid; /* I/O grant on which to unSUSPEND */
|
||||||
if (OK != (s=send(replyee, &m)))
|
if (OK != (s=send(replyee, &m)))
|
||||||
panic("CMOS", "sending reply failed", s);
|
panic("CMOS", "sending reply failed", s);
|
||||||
}
|
}
|
||||||
|
@ -130,7 +138,7 @@ PRIVATE void reply(int code, int replyee, int process, int status)
|
||||||
/*===========================================================================*
|
/*===========================================================================*
|
||||||
* gettime *
|
* gettime *
|
||||||
*===========================================================================*/
|
*===========================================================================*/
|
||||||
PRIVATE int gettime(int who, int y2kflag, vir_bytes dst_time)
|
PRIVATE int gettime(int who, int y2kflag, vir_bytes dst_time, int safe)
|
||||||
{
|
{
|
||||||
unsigned char mach_id, cmos_state;
|
unsigned char mach_id, cmos_state;
|
||||||
struct tm time1;
|
struct tm time1;
|
||||||
|
@ -166,8 +174,15 @@ PRIVATE int gettime(int who, int y2kflag, vir_bytes dst_time)
|
||||||
*/
|
*/
|
||||||
if (get_cmostime(&time1, y2kflag) != 0)
|
if (get_cmostime(&time1, y2kflag) != 0)
|
||||||
return(EFAULT);
|
return(EFAULT);
|
||||||
|
|
||||||
|
/* Copy result back, safely or not. */
|
||||||
|
if(safe) {
|
||||||
|
sys_safecopyto(who, dst_time, 0, (vir_bytes) &time1,
|
||||||
|
sizeof(struct tm), D);
|
||||||
|
} else {
|
||||||
sys_datacopy(SELF, (vir_bytes) &time1,
|
sys_datacopy(SELF, (vir_bytes) &time1,
|
||||||
who, dst_time, sizeof(struct tm));
|
who, dst_time, sizeof(struct tm));
|
||||||
|
}
|
||||||
|
|
||||||
return(OK);
|
return(OK);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue