]> Zhao Yanbai Git Server - minix.git/commitdiff
at_wini: removed RO_BIT misfeature, not used any more
authorBen Gras <ben@minix3.org>
Mon, 13 Mar 2006 13:21:13 +0000 (13:21 +0000)
committerBen Gras <ben@minix3.org>
Mon, 13 Mar 2006 13:21:13 +0000 (13:21 +0000)
pm: fixed rebooting by making a copy of the monitor code from the user
    process. this is necessary because that process is dead by the time
    sys_abort() is called.

    also added more info to the "can't reply" panic.

drivers/at_wini/at_wini.c
servers/pm/main.c
servers/pm/misc.c

index 7b8069c58cac7d8f6b6942e52ddcf6f80ab81b87..4273ce55a777f8c7c4a0548c02627014f2d0ea2d 100644 (file)
@@ -681,9 +681,6 @@ message *m_ptr;
        return(EACCES);
 #endif
 
-   /* If it's not an ATAPI device, then don't open with RO_BIT. */
-   if (!(wn->state & ATAPI) && (m_ptr->COUNT & RO_BIT)) return EACCES;
-
   /* Partition the drive if it's being opened for the first time,
    * or being opened after being closed.
    */
index 1e01a013d55ff4ddd6806abf07788f93c05c5264..9d1c0de8953facb97cfd07c5fead752de93a184f 100644 (file)
@@ -89,8 +89,9 @@ PUBLIC int main()
                if ((rmp->mp_flags & (REPLY | ONSWAP | IN_USE | ZOMBIE)) ==
                   (REPLY | IN_USE)) {
                        if ((s=send(rmp->mp_endpoint, &rmp->mp_reply)) != OK) {
-                               panic(__FILE__,"PM can't reply to",
-                                       rmp->mp_endpoint);
+                               printf("PM can't reply to %d (%s)\n",
+                                       rmp->mp_endpoint, rmp->mp_name);
+                               panic(__FILE__, "PM can't reply", NO_NUM);
                        }
                        rmp->mp_flags &= ~REPLY;
                }
index b71adfa95a57aaa7de208ed21475980de1add7a8..2a5d99e1be8952860e84097392e1aa35c85678ea 100644 (file)
@@ -171,7 +171,7 @@ PUBLIC int do_getprocnr()
  *===========================================================================*/
 PUBLIC int do_reboot()
 {
-  char monitor_code[32*sizeof(char *)];                
+  char monitor_code[256];              
   vir_bytes code_addr;
   int code_size;
   int abort_flag;
@@ -183,7 +183,14 @@ PUBLIC int do_reboot()
   abort_flag = (unsigned) m_in.reboot_flag;
   if (abort_flag >= RBT_INVALID) return(EINVAL); 
   if (RBT_MONITOR == abort_flag) {
-       code_addr = (vir_bytes) m_in.reboot_code;
+       int r;
+       if(m_in.reboot_strlen >= sizeof(monitor_code))
+               return EINVAL;
+       if((r = sys_datacopy(who_e, (vir_bytes) m_in.reboot_code,
+               SELF, (vir_bytes) monitor_code, m_in.reboot_strlen)) != OK)
+               return r;
+       code_addr = (vir_bytes) monitor_code;
+       monitor_code[m_in.reboot_strlen] = '\0';
        code_size = m_in.reboot_strlen + 1;
   }
 
@@ -203,7 +210,8 @@ PUBLIC int do_reboot()
   /* Ask the kernel to abort. All system services, including the PM, will 
    * get a HARD_STOP notification. Await the notification in the main loop.
    */
-  sys_abort(abort_flag, who_e, code_addr, code_size);
+  sys_abort(abort_flag, PM_PROC_NR, code_addr, code_size);
+  printf("sys_abort called\n");
   return(SUSPEND);                     /* don't reply to caller */
 }