本文整理汇总了C++中KERNEL_PANIC函数的典型用法代码示例。如果您正苦于以下问题:C++ KERNEL_PANIC函数的具体用法?C++ KERNEL_PANIC怎么用?C++ KERNEL_PANIC使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了KERNEL_PANIC函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: init_startup_thread
void init_startup_thread(uint32_t arg)
{
/* Threads have arguments for functions they run, we don't
need any. Silence the compiler warning by using the argument. */
arg = arg;
kprintf("Mounting filesystems\n");
vfs_mount_all();
kprintf("Initializing networking\n");
network_init();
if(bootargs_get("initprog") == NULL) {
kprintf("No initial program (initprog), dropping to fallback\n");
init_startup_fallback();
}
kprintf("Starting initial program '%s'\n", bootargs_get("initprog"));
/* `process_start` no longer takes an executable as its argument, so we need
to start initprog with `process_spawn`. */
process_id_t pid = process_spawn(bootargs_get("initprog"));
if (pid < 0) {
KERNEL_PANIC("Couldn't fit initial program in process table.\n");
}
process_join(pid);
/* The current process_start() should never return. */
KERNEL_PANIC("Run out of initprog.\n");
}
示例2: tlb_modified_exception
// send terminate signal to process
void tlb_modified_exception(void) {
tlb_exception_state_t tlb_es;
_tlb_get_exception_state(&tlb_es);
pagetable_t *current_pagetable;
current_pagetable = thread_get_current_thread_entry()->pagetable;
if (current_pagetable == NULL) {
KERNEL_PANIC("Pagetable is non-existing");
}
uint32_t i;
for (i = 0; i < current_pagetable->valid_count; i++) {
tlb_entry_t *entry = ¤t_pagetable->entries[i];
// find addr fra pagetable og put i tlb.
if (entry->VPN2 == tlb_es.badvpn2) {
/* Checks if address is odd( see vm.c)
* and thereafter checks validbit */
if (ADDR_IS_ON_ODD_PAGE(entry->VPN2)){
KERNEL_ASSERT(entry->D1);
} else {
KERNEL_ASSERT(entry->D0);
}
return;
}
}
KERNEL_PANIC("Unhandled TLB modified exception");
}
示例3: interrupt_init
/** Initializes interrupt handling. Allocates interrupt stacks for
* each processor, initializes the interrupt vectors and initializes
* the registered interrupt handler table.
*
* @param num_cpus Number of CPUs in the system
*/
void interrupt_init(int num_cpus) {
int i;
uint32_t *iv_area1 = (uint32_t *)INTERRUPT_VECTOR_ADDRESS1;
uint32_t *iv_area2 = (uint32_t *)INTERRUPT_VECTOR_ADDRESS2;
uint32_t *iv_area3 = (uint32_t *)INTERRUPT_VECTOR_ADDRESS3;
uint32_t ret;
if (num_cpus < 1 || num_cpus > CONFIG_MAX_CPUS)
KERNEL_PANIC("Too few or many CPUs found");
/* Allocate interrupt stacks for each processor */
for(i = 0; i < num_cpus; i++) {
ret = (uint32_t)kmalloc(PAGE_SIZE);
if (ret == 0)
KERNEL_PANIC("Unable to allocate interrupt stacks");
interrupt_stacks[i] = ret+PAGE_SIZE-4;
}
/* Copy the interrupt vector code to its positions.All vectors
* will contain the same code.
*/
for(i = 0 ; i < INTERRUPT_VECTOR_LENGTH ; i++) {
iv_area1[i] = ((uint32_t *) &_cswitch_vector_code)[i];
iv_area2[i] = ((uint32_t *) &_cswitch_vector_code)[i];
iv_area3[i] = ((uint32_t *) &_cswitch_vector_code)[i];
}
/* Initialize the handler table to empty */
for (i=0; i<CONFIG_MAX_DEVICES; i++) {
interrupt_handlers[i].device = NULL;
interrupt_handlers[i].irq = 0;
interrupt_handlers[i].handler = NULL;
}
}
示例4: KERNEL_PANIC
/**
* Allocates permanent memory for the kernel in unmapped memory. Call
* of this function after virtual memory has been initialized will
* cause kernel panic. Panics if memory can't be allocated.
*
* @param bytes The number of bytes to be allocated.
*
* @return The start address of the reseved memory address.
*/
void *kmalloc(int bytes)
{
uint32_t res;
/* Panic if VM is initialized */
if (free_area_start == 0xffffffff){
KERNEL_PANIC("Attempting to use kmalloc after vm init\n");
}
if (free_area_start == 0) {
KERNEL_PANIC("Attempting to use kmalloc before initialization\n");
}
/* bytes == 0 may be useful for aligning memory so it is allowed */
if (bytes < 0)
KERNEL_PANIC("Attempting to kmalloc negative amount of bytes\n");
if (free_area_start + bytes > memory_end)
KERNEL_PANIC("Out of memory\n");
res = free_area_start;
free_area_start += bytes;
/* Check that the start of free area is aligned on a word
boundary */
if (free_area_start & 0x03) {
free_area_start += 4;
free_area_start &= 0xfffffffc;
}
return (void *)res;
}
示例5: interrupt_register
/** Registers an interrupt handler for one or more interrupts
* (IRQs). When registered, a \texttt{handler(device)} function call
* will be made if any of the interrupts in \texttt{irq} occured.
*
* @param irq Mask of interrupts this handler wants to handle
* @param handler The interrupt handling function
* @param device The device registered for the interrupt, will be
* given as a parameter for handler
*/
void interrupt_register(uint32_t irq,
void (*handler)(device_t *),
device_t *device)
{
int i = 0;
/* Check that IRQ mask is sane */
if ((irq & ~(uint32_t)INTERRUPT_MASK_ALL)!= 0) {
kprintf("Unsupported IRQ mask:%.8x\n", irq);
KERNEL_PANIC("interrupt_register");
}
/* No need for spinlock, this should not be called after other CPUs
* are enabled.
*/
while (interrupt_handlers[i].device != NULL && i < CONFIG_MAX_DEVICES) i++;
if (i >= CONFIG_MAX_DEVICES)
KERNEL_PANIC("Interrupt handler table is full");
interrupt_handlers[i].device = device;
interrupt_handlers[i].irq = irq;
interrupt_handlers[i].handler = handler;
}
示例6: disk_next_request
/**
* Gets one request from request queue and puts the disk in
* work. Assumes that interrupts are disabled and device spinlock is
* held. Also assumes that the device is idle.
*
* @param gbd pointer to the general block device.
*/
static void disk_next_request(gbd_t *gbd) {
disk_real_device_t *real_dev = gbd->device->real_device;
disk_io_area_t *io = (disk_io_area_t *)gbd->device->io_address;
volatile gbd_request_t *req;
KERNEL_ASSERT(!(DISK_STATUS_RBUSY(io->status) ||
DISK_STATUS_WBUSY(io->status)));
KERNEL_ASSERT(real_dev->request_served == NULL);
req = real_dev->request_queue;
if(req == NULL) {
/* There were no requests. */
return;
}
real_dev->request_queue = req->next;
req->next = NULL;
real_dev->request_served = req;
io->tsector = req->block;
io->dmaaddr = (uint32_t)req->buf;
if(req->operation == GBD_OPERATION_READ) {
io->command = DISK_COMMAND_READ;
} else if(req->operation == GBD_OPERATION_WRITE) {
io->command = DISK_COMMAND_WRITE;
} else {
KERNEL_PANIC("disk_next_request: Unknown gbd operation.");
}
if(DISK_STATUS_ERRORS(io->status)) {
kprintf("disk error: 0x%8.8x\n", DISK_STATUS_ERRORS(io->status));
KERNEL_PANIC("disk error occured");
}
}
示例7: KERNEL_PANIC
/**
* Initializes interrupt driven tty driver. Memory is reserved for
* data structures and tty interrupt handler is registerded.
*
* @param desc Pointer to a YAMS device descriptor data structure.
*
* @return Pointer to tty's device_t structure.
*/
device_t *tty_init(io_descriptor_t *desc) {
device_t *dev;
gcd_t *gcd;
tty_real_device_t *tty_rd;
uint32_t irq_mask;
static int num_of_inits = 0;
dev = (device_t*)stalloc(sizeof(device_t));
if(dev == NULL)
KERNEL_PANIC("Could not reserve memory for tty driver.");
gcd = (gcd_t*)stalloc(sizeof(gcd_t));
if(gcd == NULL)
KERNEL_PANIC("Could not reserve memory for tty driver.");
dev->generic_device = gcd;
dev->io_address = desc->io_area_base;
dev->type = desc->type;
gcd->device = dev;
gcd->write = tty_write;
gcd->read = tty_read;
tty_rd = (tty_real_device_t*)stalloc(sizeof(tty_real_device_t));
if(tty_rd == NULL)
KERNEL_PANIC("Could not reserve memory for tty driver.");
dev->real_device = tty_rd;
if (num_of_inits == 0) {
/* First tty driver will share the device with the polling TTY.
* That is, we use the same spinlock with it. (The spinlock is
* kprintf's because that is the only proper way to access the
* polling tty.) */
tty_rd->slock = &kprintf_slock;
} else {
tty_rd->slock = (spinlock_t*)stalloc(sizeof(spinlock_t));
if(tty_rd->slock == NULL)
KERNEL_PANIC("Could not reserve memory for tty driver spinlock.");
spinlock_reset(tty_rd->slock);
}
num_of_inits++;
tty_rd->write_head = 0;
tty_rd->write_count = 0;
tty_rd->read_head = 0;
tty_rd->read_count = 0;
irq_mask = 1 << (desc->irq + 10);
interrupt_register(irq_mask, tty_interrupt_handle, dev);
return dev;
}
示例8: thread_goto_userland
void thread_goto_userland(context_t *usercontext)
{
/* Call platform-specific */
_context_enter_userland(usercontext);
KERNEL_PANIC("Userland entering returned for unknown reason.");
}
示例9: init_startup_thread
void init_startup_thread(uint32_t arg)
{
/* Threads have arguments for functions they run, we don't
need any. Silence the compiler warning by using the argument. */
arg = arg;
process_id_t pid;
kprintf("Mounting filesystems\n");
vfs_mount_all();
kprintf("Initializing networking\n");
network_init();
if(bootargs_get("initprog") == NULL) {
kprintf("No initial program (initprog), dropping to fallback\n");
init_startup_fallback();
}
kprintf("Starting initial program '%s'\n", bootargs_get("initprog"));
pid = process_spawn(bootargs_get("initprog"));
if (pid < 0)
KERNEL_PANIC("Couldn't fit initial program in process table.\n");
process_join(pid);
halt_kernel();
}
示例10: tlb_common_exception
void tlb_common_exception(void) {
tlb_exception_state_t tlb_es;
_tlb_get_exception_state(&tlb_es);
pagetable_t *current_pagetable;
current_pagetable = thread_get_current_thread_entry()->pagetable;
if (current_pagetable == NULL) {
KERNEL_PANIC("Pagetable is non-existing");
}
uint32_t i;
for (i = 0; i < current_pagetable->valid_count; i++) {
tlb_entry_t *entry = ¤t_pagetable->entries[i];
// find addr fra pagetable og put i tlb.
if (entry->VPN2 == tlb_es.badvpn2) {
KERNEL_ASSERT(entry->VPN2 == tlb_es.badvaddr >> 13);
/* Checks if address is odd( see vm.c)
* and thereafter checks validbit */
if (ADDR_IS_ON_ODD_PAGE(tlb_es.badvaddr)){
KERNEL_ASSERT(entry->V1);
} else {
KERNEL_ASSERT(entry->V0);
}
// Inserting into a random entry of the tlb.
_tlb_write_random(¤t_pagetable->entries[i]);
return;
}
}
示例11: KERNEL_PANIC
/**
* Initialize disk device driver. Reserves memory for data structures
* and register driver to the interrupt handler.
*
* @param desc Pointer to the YAMS IO device descriptor of the disk
*
* @return Pointer to the device structure of the disk
*/
device_t *disk_init(io_descriptor_t *desc) {
device_t *dev;
gbd_t *gbd;
disk_real_device_t *real_dev;
uint32_t irq_mask;
dev = (device_t*)stalloc(sizeof(device_t));
gbd = (gbd_t*)stalloc(sizeof(gbd_t));
real_dev = (disk_real_device_t*)stalloc(sizeof(disk_real_device_t));
if (dev == NULL || gbd == NULL || real_dev == NULL)
KERNEL_PANIC("Could not allocate memory for disk driver.");
dev->generic_device = gbd;
dev->real_device = real_dev;
dev->descriptor = desc;
dev->io_address = desc->io_area_base;
dev->type = desc->type;
gbd->device = dev;
gbd->read_block = disk_read_block;
gbd->write_block = disk_write_block;
gbd->block_size = disk_block_size;
gbd->total_blocks = disk_total_blocks;
spinlock_reset(&real_dev->slock);
real_dev->request_queue = NULL;
real_dev->request_served = NULL;
irq_mask = 1 << (desc->irq + 10);
interrupt_register(irq_mask, disk_interrupt_handle, dev);
return dev;
}
示例12: syscall_handle
/**
* Handle system calls. Interrupts are enabled when this function is
* called.
*
* @param user_context The userland context (CPU registers as they
* where when system call instruction was called in userland)
*/
void syscall_handle(context_t *user_context)
{
/* When a syscall is executed in userland, register a0 contains
* the number of the syscall. Registers a1, a2 and a3 contain the
* arguments of the syscall. The userland code expects that after
* returning from the syscall instruction the return value of the
* syscall is found in register v0. Before entering this function
* the userland context has been saved to user_context and after
* returning from this function the userland context will be
* restored from user_context.
*/
switch(user_context->cpu_regs[MIPS_REGISTER_A0]) {
case SYSCALL_HALT:
halt_kernel();
break;
case SYSCALL_READ:
user_context->cpu_regs[MIPS_REGISTER_V0] =
read(user_context->cpu_regs[MIPS_REGISTER_A1]
,(void*)user_context->cpu_regs[MIPS_REGISTER_A2]
,user_context->cpu_regs[MIPS_REGISTER_A3]);
break;
case SYSCALL_WRITE:
// TODO
user_context->cpu_regs[MIPS_REGISTER_V0] =
write(user_context->cpu_regs[MIPS_REGISTER_A1]
,(void*)user_context->cpu_regs[MIPS_REGISTER_A2]
,user_context->cpu_regs[MIPS_REGISTER_A3]);
break;
default:
KERNEL_PANIC("Unhandled system call\n");
}
/* Move to next instruction after system call */
user_context->pc += 4;
}
示例13: syscall_handle
/**
* Handle system calls. Interrupts are enabled when this function is
* called.
*
* @param user_context The userland context (CPU registers as they
* where when system call instruction was called in userland)
*/
void syscall_handle(context_t *user_context)
{
/* When a syscall is executed in userland, register a0 contains
* the number of the syscall. Registers a1, a2 and a3 contain the
* arguments of the syscall. The userland code expects that after
* returning from the syscall instruction the return value of the
* syscall is found in register v0. Before entering this function
* the userland context has been saved to user_context and after
* returning from this function the userland context will be
* restored from user_context.
*/
int retval;
switch(user_context->cpu_regs[MIPS_REGISTER_A0]) {
case SYSCALL_HALT:
halt_kernel();
break;
case SYSCALL_EXEC:
retval = (int) process_spawn((char*) user_context->cpu_regs[MIPS_REGISTER_A1]);
user_context->cpu_regs[MIPS_REGISTER_V0] = retval;
break;
case SYSCALL_EXIT:
/* Resources are cleaned up in process_finish(...) */
process_finish(user_context->cpu_regs[MIPS_REGISTER_A1]);
break;
case SYSCALL_JOIN:
retval = process_join(user_context->cpu_regs[MIPS_REGISTER_A1]);
user_context->cpu_regs[MIPS_REGISTER_V0] = retval;
break;
case SYSCALL_READ:
{
int fhandle = user_context->cpu_regs[MIPS_REGISTER_A1];
int buffer = user_context->cpu_regs[MIPS_REGISTER_A2];
int length = user_context->cpu_regs[MIPS_REGISTER_A3];
int retval = syscall_read(fhandle, (void *)buffer, length);
user_context->cpu_regs[MIPS_REGISTER_V0] = retval;
}
break;
case SYSCALL_WRITE:
{
int fhandle = user_context->cpu_regs[MIPS_REGISTER_A1];
int buffer = user_context->cpu_regs[MIPS_REGISTER_A2];
int length = user_context->cpu_regs[MIPS_REGISTER_A3];
int retval = syscall_write(fhandle, (void *)buffer, length);
user_context->cpu_regs[MIPS_REGISTER_V0] = retval;
}
break;
default:
KERNEL_PANIC("Unhandled system call\n");
}
/* Move to next instruction after system call */
user_context->pc += 4;
}
示例14: thread_goto_userland
void thread_goto_userland(context_t *usercontext)
{
/* Set userland bit and enable interrupts before entering userland. */
usercontext->status = usercontext->status | USERLAND_ENABLE_BIT;
usercontext->status = usercontext->status | INTERRUPT_MASK_ALL;
usercontext->status = usercontext->status | INTERRUPT_MASK_MASTER;
_cswitch_to_userland(usercontext);
KERNEL_PANIC("Userland entering returned for unknown reason.");
}
示例15: syscall_read
uint32_t syscall_read(uint32_t fd, char* s, int len)
{
int count = 0;
gcd_t *gcd;
if (fd != FILEHANDLE_STDIN) {
KERNEL_PANIC("Can only read() from standard input.");
}
gcd = process_get_current_process_entry()->fds[0];
count = gcd->read(gcd, s, len);
return count;
}