Added do_readbios. Added debugging output for unexpected use of unsafe copy
functions.
This commit is contained in:
parent
73e5de6354
commit
6f4091eb8c
7 changed files with 80 additions and 0 deletions
|
@ -180,6 +180,7 @@ PRIVATE void initialize(void)
|
||||||
map(SYS_SAFECOPYFROM, do_safecopy); /* copy with pre-granted permission */
|
map(SYS_SAFECOPYFROM, do_safecopy); /* copy with pre-granted permission */
|
||||||
map(SYS_SAFECOPYTO, do_safecopy); /* copy with pre-granted permission */
|
map(SYS_SAFECOPYTO, do_safecopy); /* copy with pre-granted permission */
|
||||||
map(SYS_VSAFECOPY, do_vsafecopy); /* vectored safecopy */
|
map(SYS_VSAFECOPY, do_vsafecopy); /* vectored safecopy */
|
||||||
|
map(SYS_READBIOS, do_readbios); /* read from BIOS locations */
|
||||||
|
|
||||||
/* Clock functionality. */
|
/* Clock functionality. */
|
||||||
map(SYS_TIMES, do_times); /* get uptime and process times */
|
map(SYS_TIMES, do_times); /* get uptime and process times */
|
||||||
|
|
|
@ -177,6 +177,7 @@ _PROTOTYPE( int do_safecopy, (message *m_ptr) );
|
||||||
_PROTOTYPE( int do_vsafecopy, (message *m_ptr) );
|
_PROTOTYPE( int do_vsafecopy, (message *m_ptr) );
|
||||||
_PROTOTYPE( int do_iopenable, (message *m_ptr) );
|
_PROTOTYPE( int do_iopenable, (message *m_ptr) );
|
||||||
_PROTOTYPE( int do_setgrant, (message *m_ptr) );
|
_PROTOTYPE( int do_setgrant, (message *m_ptr) );
|
||||||
|
_PROTOTYPE( int do_readbios, (message *m_ptr) );
|
||||||
|
|
||||||
#endif /* SYSTEM_H */
|
#endif /* SYSTEM_H */
|
||||||
|
|
||||||
|
|
|
@ -42,6 +42,7 @@ OBJECTS = \
|
||||||
$(SYSTEM)(do_getksig.o) \
|
$(SYSTEM)(do_getksig.o) \
|
||||||
$(SYSTEM)(do_endksig.o) \
|
$(SYSTEM)(do_endksig.o) \
|
||||||
$(SYSTEM)(do_kill.o) \
|
$(SYSTEM)(do_kill.o) \
|
||||||
|
$(SYSTEM)(do_readbios.o) \
|
||||||
$(SYSTEM)(do_sigsend.o) \
|
$(SYSTEM)(do_sigsend.o) \
|
||||||
$(SYSTEM)(do_sigreturn.o) \
|
$(SYSTEM)(do_sigreturn.o) \
|
||||||
$(SYSTEM)(do_abort.o) \
|
$(SYSTEM)(do_abort.o) \
|
||||||
|
@ -138,6 +139,9 @@ $(SYSTEM)(do_getinfo.o): do_getinfo.c
|
||||||
$(SYSTEM)(do_abort.o): do_abort.c
|
$(SYSTEM)(do_abort.o): do_abort.c
|
||||||
$(CC) do_abort.c
|
$(CC) do_abort.c
|
||||||
|
|
||||||
|
$(SYSTEM)(do_readbios.o): do_readbios.c
|
||||||
|
$(CC) do_readbios.c
|
||||||
|
|
||||||
$(SYSTEM)(do_setgrant.o): do_setgrant.c
|
$(SYSTEM)(do_setgrant.o): do_setgrant.c
|
||||||
$(CC) do_setgrant.c
|
$(CC) do_setgrant.c
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,23 @@ register message *m_ptr; /* pointer to request message */
|
||||||
phys_bytes bytes; /* number of bytes to copy */
|
phys_bytes bytes; /* number of bytes to copy */
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
if (m_ptr->m_source != 0 && m_ptr->m_source != 1 &&
|
||||||
|
m_ptr->m_source != 2 && m_ptr->m_source != 3)
|
||||||
|
{
|
||||||
|
static int first=1;
|
||||||
|
if (first)
|
||||||
|
{
|
||||||
|
first= 0;
|
||||||
|
kprintf(
|
||||||
|
"do_copy: got request from %d (source %d, seg %d, destination %d, seg %d)\n",
|
||||||
|
m_ptr->m_source,
|
||||||
|
m_ptr->CP_SRC_ENDPT,
|
||||||
|
m_ptr->CP_SRC_SPACE,
|
||||||
|
m_ptr->CP_DST_ENDPT,
|
||||||
|
m_ptr->CP_DST_SPACE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Dismember the command message. */
|
/* Dismember the command message. */
|
||||||
vir_addr[_SRC_].proc_nr_e = m_ptr->CP_SRC_ENDPT;
|
vir_addr[_SRC_].proc_nr_e = m_ptr->CP_SRC_ENDPT;
|
||||||
vir_addr[_SRC_].segment = m_ptr->CP_SRC_SPACE;
|
vir_addr[_SRC_].segment = m_ptr->CP_SRC_SPACE;
|
||||||
|
|
39
kernel/system/do_readbios.c
Normal file
39
kernel/system/do_readbios.c
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
/* The kernel call implemented in this file:
|
||||||
|
* m_type: SYS_READBIOS
|
||||||
|
*
|
||||||
|
* The parameters for this kernel call are:
|
||||||
|
* m2_i1: RDB_SIZE number of bytes to copy
|
||||||
|
* m2_l1: RDB_ADDR absolute address in BIOS area
|
||||||
|
* m2_p1: RDB_BUF buffer address in requesting process
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "../system.h"
|
||||||
|
#include <minix/type.h>
|
||||||
|
|
||||||
|
/*===========================================================================*
|
||||||
|
* do_readbios *
|
||||||
|
*===========================================================================*/
|
||||||
|
PUBLIC int do_readbios(m_ptr)
|
||||||
|
register message *m_ptr; /* pointer to request message */
|
||||||
|
{
|
||||||
|
int proc_nr;
|
||||||
|
struct proc *p;
|
||||||
|
phys_bytes address, phys_buf, phys_bios;
|
||||||
|
vir_bytes buf;
|
||||||
|
size_t size;
|
||||||
|
|
||||||
|
address = m_ptr->RDB_ADDR;
|
||||||
|
buf = (vir_bytes)m_ptr->RDB_BUF;
|
||||||
|
size = m_ptr->RDB_SIZE;
|
||||||
|
|
||||||
|
okendpt(m_ptr->m_source, &proc_nr);
|
||||||
|
p = proc_addr(proc_nr);
|
||||||
|
phys_buf = umap_local(p, D, buf, size);
|
||||||
|
if (phys_buf == 0)
|
||||||
|
return EFAULT;
|
||||||
|
phys_bios = umap_bios(p, address, size);
|
||||||
|
if (phys_bios == 0)
|
||||||
|
return EPERM;
|
||||||
|
phys_copy(phys_bios, phys_buf, size);
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -28,6 +28,16 @@ register message *m_ptr; /* pointer to request message */
|
||||||
phys_bytes phys_buf;
|
phys_bytes phys_buf;
|
||||||
int req_type, req_dir;
|
int req_type, req_dir;
|
||||||
|
|
||||||
|
if ((m_ptr->DIO_REQUEST & _DIO_SAFEMASK) != _DIO_SAFE)
|
||||||
|
{
|
||||||
|
static int first= 1;
|
||||||
|
if (first)
|
||||||
|
{
|
||||||
|
first= 0;
|
||||||
|
kprintf("do_sdevio: for %d\n", m_ptr->m_source);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Check if process endpoint is OK.
|
/* Check if process endpoint is OK.
|
||||||
* A driver may directly provide a pointer to a buffer at the user-process
|
* A driver may directly provide a pointer to a buffer at the user-process
|
||||||
* that initiated the device I/O. Kernel processes, of course, are denied.
|
* that initiated the device I/O. Kernel processes, of course, are denied.
|
||||||
|
|
|
@ -33,6 +33,14 @@ register message *m_ptr; /* pointer to request message */
|
||||||
int i,s;
|
int i,s;
|
||||||
struct vir_cp_req *req;
|
struct vir_cp_req *req;
|
||||||
|
|
||||||
|
{ static int first=1;
|
||||||
|
if (first)
|
||||||
|
{
|
||||||
|
first= 0;
|
||||||
|
kprintf("do_vcopy: got request from %d\n", m_ptr->m_source);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Check if request vector size is ok. */
|
/* Check if request vector size is ok. */
|
||||||
nr_req = (unsigned) m_ptr->VCP_VEC_SIZE;
|
nr_req = (unsigned) m_ptr->VCP_VEC_SIZE;
|
||||||
if (nr_req > VCOPY_VEC_SIZE) return(EINVAL);
|
if (nr_req > VCOPY_VEC_SIZE) return(EINVAL);
|
||||||
|
|
Loading…
Reference in a new issue