]> Zhao Yanbai Git Server - minix.git/commitdiff
kernel: Extend the sys_statectl() interface. 76/3076/2
authorCristiano Giuffrida <giuffrida@cs.vu.nl>
Sat, 1 Mar 2014 23:40:33 +0000 (00:40 +0100)
committerDavid van Moolenbroek <david@minix3.org>
Wed, 16 Sep 2015 11:01:15 +0000 (11:01 +0000)
Change-Id: Ica37640f61513db9466dacf861a8148e3fb799d5

minix/include/minix/com.h
minix/include/minix/ipc.h
minix/include/minix/syslib.h
minix/kernel/priv.h
minix/kernel/system/do_privctl.c
minix/kernel/system/do_statectl.c
minix/lib/libblockdriver/driver.c
minix/lib/libchardriver/chardriver.c
minix/lib/libi2cdriver/i2cdriver.c
minix/lib/libsys/sys_statectl.c

index fe8267513cb26f4971d5c7d55be0303c70f3bea3..2b2d33bf9e1193a68059ca9d4d21e114e6c0e3b2 100644 (file)
 
 /* Subfunctions for SYS_STATECTL */
 #define SYS_STATE_CLEAR_IPC_REFS    1  /* clear IPC references */
+#define SYS_STATE_SET_STATE_TABLE   2  /* set state map */
 
 /* Subfunctions for SYS_SCHEDCTL */
 #  define SCHEDCTL_FLAG_KERNEL 1       /* mark kernel scheduler and remove 
index 6917bde51643a0f13ccf21bf70e4dd3ba5f32f03..0f056a61d1abd716b840d91ec60d60d4ca2f069c 100644 (file)
@@ -1177,8 +1177,10 @@ _ASSERT_MSG_SIZE(mess_lsys_krn_sys_sprof);
 
 typedef struct {
        int request;
+       void *address;
+       int length;
 
-       uint8_t padding[52];
+       uint8_t padding[44];
 } mess_lsys_krn_sys_statectl;
 _ASSERT_MSG_SIZE(mess_lsys_krn_sys_statectl);
 
index c2ebcf2e441e563124f0584dc513c0befe46a41e..3e4225833b0c8b33b3a15bd475f9dcec3435d118 100644 (file)
@@ -49,7 +49,7 @@ int sys_schedctl(unsigned flags, endpoint_t proc_ep, int priority, int
 int sys_runctl(endpoint_t proc_ep, int action, int flags);
 
 int sys_update(endpoint_t src_ep, endpoint_t dst_ep);
-int sys_statectl(int request);
+int sys_statectl(int request, void* address, int length);
 int sys_privctl(endpoint_t proc_ep, int req, void *p);
 int sys_privquery_mem(endpoint_t proc_ep, phys_bytes physstart,
        phys_bytes physlen);
index 0bdd009491f086daed6687f2638fcb1690d959c7..d38101a6d1ed73f9a86c49fcd7a1b784f8d1d7e7 100644 (file)
@@ -57,6 +57,8 @@ struct priv {
   int s_irq_tab[NR_IRQ];
   vir_bytes s_grant_table;     /* grant table address of process, or 0 */
   int s_grant_entries;         /* no. of entries, or 0 */
+  vir_bytes s_state_table;     /* state table address of process, or 0 */
+  int s_state_entries;         /* no. of entries, or 0 */
 };
 
 /* Guard word for task stacks. */
index 9909cc4169854d6a2c78e3ee8bb4a58f6e3b5373..bcfd1d264612276432497f6579a5a95c695056d9 100644 (file)
@@ -150,6 +150,8 @@ int do_privctl(struct proc * caller, message * m_ptr)
        priv(rp)->s_nr_irq= 0;
        priv(rp)->s_grant_table= 0;
        priv(rp)->s_grant_entries= 0;
+       priv(rp)->s_state_table= 0;
+       priv(rp)->s_state_entries= 0;
 
        /* Override defaults if the caller has supplied a privilege structure. */
        if (m_ptr->m_lsys_krn_sys_privctl.arg_ptr)
index 4118216da1b9407d417e32ecc53832baace4a7ca..d9c9d5296c6d39644ae02dba7687fe08672c350e 100644 (file)
@@ -24,6 +24,11 @@ int do_statectl(struct proc * caller, message * m_ptr)
         */
        clear_ipc_refs(caller, EDEADSRCDST);
        return(OK);
+  case SYS_STATE_SET_STATE_TABLE:
+       /* Set state table for the caller. */
+       priv(caller)->s_state_table = (vir_bytes) m_ptr->m_lsys_krn_sys_statectl.address;
+       priv(caller)->s_state_entries = m_ptr->m_lsys_krn_sys_statectl.length;
+       return(OK);
   default:
        printf("do_statectl: bad request %d\n",
                m_ptr->m_lsys_krn_sys_statectl.request);
index 0c16b9aeba7e16a759a245b0a8bc964b4356ab3e..1ccb090f228fb7c7c89f16dd31db1326762ce472 100644 (file)
@@ -106,7 +106,7 @@ void blockdriver_announce(int type)
    * will not restart statefully, and thus will skip this code.
    */
   if (type == SEF_INIT_RESTART) {
-       if ((r = sys_statectl(SYS_STATE_CLEAR_IPC_REFS)) != OK)
+       if ((r = sys_statectl(SYS_STATE_CLEAR_IPC_REFS, 0, 0)) != OK)
                panic("blockdriver_init: sys_statectl failed: %d", r);
   }
 
index 7a5a3603c71f04b754892c83b5ae82f63b64aae0..d3b443f2f3d2e38b3fc094a97662dcc2245844bf 100644 (file)
@@ -108,7 +108,7 @@ void chardriver_announce(void)
    * For this reason, there may blocked callers when a driver restarts.
    * Ask the kernel to unblock them (if any).
    */
-  if ((r = sys_statectl(SYS_STATE_CLEAR_IPC_REFS)) != OK)
+  if ((r = sys_statectl(SYS_STATE_CLEAR_IPC_REFS, 0, 0)) != OK)
        panic("chardriver_announce: sys_statectl failed: %d", r);
 
   /* Publish a driver up event. */
index df631b225169074e6c40afa3adb61f8d055e6e19..0aca71db3b9438d2e24c932f8d421c153895112b 100644 (file)
@@ -21,7 +21,7 @@ i2cdriver_announce(uint32_t bus)
         * For this reason, there may blocked callers when a driver restarts.
         * Ask the kernel to unblock them (if any).
         */
-       if ((r = sys_statectl(SYS_STATE_CLEAR_IPC_REFS)) != OK) {
+       if ((r = sys_statectl(SYS_STATE_CLEAR_IPC_REFS, 0, 0)) != OK) {
                panic("chardriver_init: sys_statectl failed: %d", r);
        }
 
index 40c9a1e115f6da2514bfde702db3e74aef619a4d..00279c6ad77d74b3e9348b06622295b64220c988 100644 (file)
@@ -1,10 +1,12 @@
 #include "syslib.h"
 
-int sys_statectl(int request)
+int sys_statectl(int request, void* address, int length)
 {
   message m;
 
   m.m_lsys_krn_sys_statectl.request = request;
+  m.m_lsys_krn_sys_statectl.address = address;
+  m.m_lsys_krn_sys_statectl.length = length;
 
   return _kernel_call(SYS_STATECTL, &m);
 }