Annotation of prex-old/sys/kern/system.c, Revision 1.1
1.1 ! nbrk 1: /*-
! 2: * Copyright (c) 2005-2007, Kohsuke Ohtani
! 3: * All rights reserved.
! 4: *
! 5: * Redistribution and use in source and binary forms, with or without
! 6: * modification, are permitted provided that the following conditions
! 7: * are met:
! 8: * 1. Redistributions of source code must retain the above copyright
! 9: * notice, this list of conditions and the following disclaimer.
! 10: * 2. Redistributions in binary form must reproduce the above copyright
! 11: * notice, this list of conditions and the following disclaimer in the
! 12: * documentation and/or other materials provided with the distribution.
! 13: * 3. Neither the name of the author nor the names of any co-contributors
! 14: * may be used to endorse or promote products derived from this software
! 15: * without specific prior written permission.
! 16: *
! 17: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
! 18: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
! 19: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
! 20: * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
! 21: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
! 22: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
! 23: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 24: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 25: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 26: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 27: * SUCH DAMAGE.
! 28: */
! 29:
! 30: /*
! 31: * system.c - system services
! 32: */
! 33:
! 34: #include <kernel.h>
! 35: #include <thread.h>
! 36: #include <sched.h>
! 37: #include <task.h>
! 38: #include <irq.h>
! 39: #include <page.h>
! 40: #include <kmem.h>
! 41: #include <vm.h>
! 42: #include <device.h>
! 43: #include <system.h>
! 44:
! 45: /*
! 46: * kernel information.
! 47: */
! 48: static const struct info_kernel kern_info = KERNEL_INFO(kern_info);
! 49:
! 50: /*
! 51: * Logging system call.
! 52: *
! 53: * Write a message to the logging device.
! 54: * The log function is available only when kernel is built with
! 55: * debug option.
! 56: */
! 57: int
! 58: sys_log(const char *str)
! 59: {
! 60: #ifdef DEBUG
! 61: char buf[MSGBUFSZ];
! 62: size_t len;
! 63:
! 64: if (umem_strnlen(str, MSGBUFSZ, &len))
! 65: return EFAULT;
! 66: if (len >= MSGBUFSZ)
! 67: return EINVAL;
! 68: if (umem_copyin((void *)str, buf, len + 1))
! 69: return EFAULT;
! 70: printk(buf);
! 71: return 0;
! 72: #else
! 73: return ENOSYS;
! 74: #endif
! 75: }
! 76:
! 77: /*
! 78: * Panic system call.
! 79: *
! 80: * Kernel behavior for sys_panic() is different for its debug option.
! 81: * - Debug build
! 82: * Show a panic message and stop the entire system.
! 83: * - Release build
! 84: * Terminate the task which called sys_panic().
! 85: */
! 86: int
! 87: sys_panic(const char *str)
! 88: {
! 89: #ifdef DEBUG
! 90: irq_lock();
! 91: printk("\nUser mode panic: task:%s thread:%x\n",
! 92: cur_task()->name ? cur_task()->name : "no name", cur_thread);
! 93:
! 94: sys_log(str);
! 95: printk("\n");
! 96:
! 97: sched_lock();
! 98: irq_unlock();
! 99: BREAKPOINT();
! 100:
! 101: for (;;);
! 102: #else
! 103: task_terminate(cur_task());
! 104: #endif
! 105: /* NOTREACHED */
! 106: return 0;
! 107: }
! 108:
! 109: /*
! 110: * Get system information
! 111: */
! 112: int
! 113: sys_info(int type, void *buf)
! 114: {
! 115: int err = 0;
! 116: struct info_memory imem;
! 117: struct info_timer itmr;
! 118: struct info_thread ithr;
! 119: struct info_device idev;
! 120:
! 121: if (buf == NULL || !user_area(buf))
! 122: return EFAULT;
! 123:
! 124: switch (type) {
! 125: case INFO_KERNEL:
! 126: err = umem_copyout((void *)&kern_info, buf,
! 127: sizeof(kern_info));
! 128: break;
! 129:
! 130: case INFO_MEMORY:
! 131: page_info(&imem.total, &imem.free);
! 132: kmem_info(&imem.kernel);
! 133: err = umem_copyout(&imem, buf, sizeof(imem));
! 134: break;
! 135:
! 136: case INFO_THREAD:
! 137: if (umem_copyin(buf, &ithr, sizeof(ithr)))
! 138: return EFAULT;
! 139: if ((err = thread_info(&ithr)))
! 140: return err;
! 141: ithr.cookie++;
! 142: err = umem_copyout(&ithr, buf, sizeof(ithr));
! 143: break;
! 144:
! 145: case INFO_DEVICE:
! 146: if (umem_copyin(buf, &idev, sizeof(idev)))
! 147: return EFAULT;
! 148: if ((err = device_info(&idev)))
! 149: return err;
! 150: idev.cookie++;
! 151: err = umem_copyout(&idev, buf, sizeof(idev));
! 152: break;
! 153:
! 154: case INFO_TIMER:
! 155: timer_info(&itmr);
! 156: err = umem_copyout(&itmr, buf, sizeof(itmr));
! 157: break;
! 158:
! 159: default:
! 160: err = EINVAL;
! 161: }
! 162: return err;
! 163: }
! 164:
! 165: /*
! 166: * Get system time - return ticks from OS boot.
! 167: */
! 168: int
! 169: sys_time(u_long *ticks)
! 170: {
! 171: u_long t;
! 172:
! 173: t = timer_count();
! 174: return umem_copyout(&t, ticks, sizeof(u_long));
! 175: }
! 176:
! 177: /*
! 178: * Kernel debug service.
! 179: */
! 180: int
! 181: sys_debug(int cmd, u_long param)
! 182: {
! 183: #ifdef DEBUG
! 184: int err = EINVAL;
! 185: size_t size;
! 186: char *buf;
! 187:
! 188: /*
! 189: * Check capability for some commands.
! 190: */
! 191: switch (cmd) {
! 192: case DCMD_DUMP:
! 193: if (!task_capable(CAP_DEBUG))
! 194: return EPERM;
! 195: }
! 196:
! 197: switch (cmd) {
! 198: case DCMD_DUMP:
! 199: err = debug_dump(param);
! 200: break;
! 201: case DCMD_LOGSIZE:
! 202: if ((err = log_get(&buf, &size)) == 0)
! 203: err = umem_copyout(&size, (void *)param, sizeof(size));
! 204: break;
! 205: case DCMD_GETLOG:
! 206: if ((err = log_get(&buf, &size)) == 0)
! 207: err = umem_copyout(buf, (void *)param, size);
! 208: break;
! 209: default:
! 210: break;
! 211: }
! 212: return err;
! 213: #else
! 214: return ENOSYS;
! 215: #endif
! 216: }
CVSweb