X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fdevices%2Fserial.c;h=7468493bc38204842736461dab40c08abed09a69;hb=8c767ddb04d3ac42d080d9f9f5f40196d6f8f217;hp=d41bc8d85166349bb7e9febbd420df0e64b8c49b;hpb=f9bb3db89469169bb5775dc031d89e570c6fed70;p=palacios.git diff --git a/palacios/src/devices/serial.c b/palacios/src/devices/serial.c index d41bc8d..7468493 100644 --- a/palacios/src/devices/serial.c +++ b/palacios/src/devices/serial.c @@ -1,5 +1,21 @@ -/* Northwestern University */ -/* (c) 2008, Jack Lange */ +/* + * This file is part of the Palacios Virtual Machine Monitor developed + * by the V3VEE Project with funding from the United States National + * Science Foundation and the Department of Energy. + * + * The V3VEE Project is a joint project between Northwestern University + * and the University of New Mexico. You can find out more at + * http://www.v3vee.org + * + * Copyright (c) 2008, Jack Lange + * Copyright (c) 2008, The V3VEE Project + * All rights reserved. + * + * Author: Jack Lange + * + * This is free software. You are permitted to use, + * redistribute, and modify it as specified in the file "V3VEE_LICENSE". + */ #include #include @@ -145,8 +161,8 @@ struct serial_buffer { char buffer[SERIAL_BUF_LEN]; }; -int queue_data(struct serial_buffer * buf, char data) { - int next_loc = (buf->head + 1) % SERIAL_BUF_LEN; +static int queue_data(struct serial_buffer * buf, char data) { + uint_t next_loc = (buf->head + 1) % SERIAL_BUF_LEN; if (next_loc == buf->tail) { return -1; @@ -158,8 +174,8 @@ int queue_data(struct serial_buffer * buf, char data) { return 0; } -int dequeue_data(struct serial_buffer * buf, char * data) { - int next_tail = (buf->tail + 1) % SERIAL_BUF_LEN; +static int dequeue_data(struct serial_buffer * buf, char * data) { + uint_t next_tail = (buf->tail + 1) % SERIAL_BUF_LEN; if (buf->head == buf->tail) { return -1; @@ -194,7 +210,7 @@ struct serial_state { }; -int write_data_port(ushort_t port, void * src, uint_t length, struct vm_device * dev) { +static int write_data_port(ushort_t port, void * src, uint_t length, struct vm_device * dev) { struct serial_state * state = (struct serial_state *)dev->private_data; char * val = (char *)src; PrintDebug("Write to Data Port 0x%x (val=%x)\n", port, *(char*)src); @@ -227,7 +243,7 @@ int write_data_port(ushort_t port, void * src, uint_t length, struct vm_device * -int read_data_port(ushort_t port, void * dst, uint_t length, struct vm_device * dev) { +static int read_data_port(ushort_t port, void * dst, uint_t length, struct vm_device * dev) { struct serial_state * state = (struct serial_state *)dev->private_data; char * val = (char *)dst; PrintDebug("Read from Data Port 0x%x\n", port); @@ -260,20 +276,20 @@ int read_data_port(ushort_t port, void * dst, uint_t length, struct vm_device * -int handle_ier_write(struct serial_port * com, struct irq_enable_reg * ier) { +static int handle_ier_write(struct serial_port * com, struct irq_enable_reg * ier) { return -1; } -int write_ctrl_port(ushort_t port, void * src, uint_t length, struct vm_device * dev) { +static int write_ctrl_port(ushort_t port, void * src, uint_t length, struct vm_device * dev) { struct serial_state * state = (struct serial_state *)dev->private_data; char * val = (char *)src; PrintDebug("Write to Control Port (val=%x)\n", *(char *)src); if (length != 1) { - PrintDebug("Invalid Write length to control port\n", port, port); + PrintDebug("Invalid Write length to control port %d\n", port); return -1; } @@ -327,7 +343,7 @@ int write_ctrl_port(ushort_t port, void * src, uint_t length, struct vm_device * -int read_ctrl_port(ushort_t port, void * dst, uint_t length, struct vm_device * dev) { +static int read_ctrl_port(ushort_t port, void * dst, uint_t length, struct vm_device * dev) { struct serial_state * state = (struct serial_state *)dev->private_data; char * val = (char *)dst; PrintDebug("Read from Control Port\n"); @@ -398,13 +414,13 @@ int read_ctrl_port(ushort_t port, void * dst, uint_t length, struct vm_device * } -int write_status_port(ushort_t port, void * src, uint_t length, struct vm_device * dev) { +static int write_status_port(ushort_t port, void * src, uint_t length, struct vm_device * dev) { PrintDebug("Write to Status Port 0x%x (val=%x)\n", port, *(char *)src); return -1; } -int read_status_port(ushort_t port, void * dst, uint_t length, struct vm_device * dev) { +static int read_status_port(ushort_t port, void * dst, uint_t length, struct vm_device * dev) { struct serial_state * state = (struct serial_state *)dev->private_data; char * val = (char *)dst; PrintDebug("Read from Status Port 0x%x\n", port); @@ -474,7 +490,7 @@ static int init_serial_port(struct serial_port * com) { return 0; } -int serial_init(struct vm_device * dev) { +static int serial_init(struct vm_device * dev) { struct serial_state * state = (struct serial_state *)dev->private_data; @@ -483,84 +499,84 @@ int serial_init(struct vm_device * dev) { init_serial_port(&(state->com3)); init_serial_port(&(state->com4)); - dev_hook_io(dev, COM1_DATA_PORT, &read_data_port, &write_data_port); - dev_hook_io(dev, COM1_IRQ_ENABLE_PORT, &read_ctrl_port, &write_ctrl_port); - dev_hook_io(dev, COM1_FIFO_CTRL_PORT, &read_ctrl_port, &write_ctrl_port); - dev_hook_io(dev, COM1_LINE_CTRL_PORT, &read_ctrl_port, &write_ctrl_port); - dev_hook_io(dev, COM1_MODEM_CTRL_PORT, &read_ctrl_port, &write_ctrl_port); - dev_hook_io(dev, COM1_LINE_STATUS_PORT, &read_status_port, &write_status_port); - dev_hook_io(dev, COM1_MODEM_STATUS_PORT, &read_status_port, &write_status_port); - dev_hook_io(dev, COM1_SCRATCH_PORT, &read_ctrl_port, &write_ctrl_port); - - dev_hook_io(dev, COM2_DATA_PORT, &read_data_port, &write_data_port); - dev_hook_io(dev, COM2_IRQ_ENABLE_PORT, &read_ctrl_port, &write_ctrl_port); - dev_hook_io(dev, COM2_FIFO_CTRL_PORT, &read_ctrl_port, &write_ctrl_port); - dev_hook_io(dev, COM2_LINE_CTRL_PORT, &read_ctrl_port, &write_ctrl_port); - dev_hook_io(dev, COM2_MODEM_CTRL_PORT, &read_ctrl_port, &write_ctrl_port); - dev_hook_io(dev, COM2_LINE_STATUS_PORT, &read_status_port, &write_status_port); - dev_hook_io(dev, COM2_MODEM_STATUS_PORT, &read_status_port, &write_status_port); - dev_hook_io(dev, COM2_SCRATCH_PORT, &read_ctrl_port, &write_ctrl_port); - - dev_hook_io(dev, COM3_DATA_PORT, &read_data_port, &write_data_port); - dev_hook_io(dev, COM3_IRQ_ENABLE_PORT, &read_ctrl_port, &write_ctrl_port); - dev_hook_io(dev, COM3_FIFO_CTRL_PORT, &read_ctrl_port, &write_ctrl_port); - dev_hook_io(dev, COM3_LINE_CTRL_PORT, &read_ctrl_port, &write_ctrl_port); - dev_hook_io(dev, COM3_MODEM_CTRL_PORT, &read_ctrl_port, &write_ctrl_port); - dev_hook_io(dev, COM3_LINE_STATUS_PORT, &read_status_port, &write_status_port); - dev_hook_io(dev, COM3_MODEM_STATUS_PORT, &read_status_port, &write_status_port); - dev_hook_io(dev, COM3_SCRATCH_PORT, &read_ctrl_port, &write_ctrl_port); - - dev_hook_io(dev, COM4_DATA_PORT, &read_data_port, &write_data_port); - dev_hook_io(dev, COM4_IRQ_ENABLE_PORT, &read_ctrl_port, &write_ctrl_port); - dev_hook_io(dev, COM4_FIFO_CTRL_PORT, &read_ctrl_port, &write_ctrl_port); - dev_hook_io(dev, COM4_LINE_CTRL_PORT, &read_ctrl_port, &write_ctrl_port); - dev_hook_io(dev, COM4_MODEM_CTRL_PORT, &read_ctrl_port, &write_ctrl_port); - dev_hook_io(dev, COM4_LINE_STATUS_PORT, &read_status_port, &write_status_port); - dev_hook_io(dev, COM4_MODEM_STATUS_PORT, &read_status_port, &write_status_port); - dev_hook_io(dev, COM4_SCRATCH_PORT, &read_ctrl_port, &write_ctrl_port); + v3_dev_hook_io(dev, COM1_DATA_PORT, &read_data_port, &write_data_port); + v3_dev_hook_io(dev, COM1_IRQ_ENABLE_PORT, &read_ctrl_port, &write_ctrl_port); + v3_dev_hook_io(dev, COM1_FIFO_CTRL_PORT, &read_ctrl_port, &write_ctrl_port); + v3_dev_hook_io(dev, COM1_LINE_CTRL_PORT, &read_ctrl_port, &write_ctrl_port); + v3_dev_hook_io(dev, COM1_MODEM_CTRL_PORT, &read_ctrl_port, &write_ctrl_port); + v3_dev_hook_io(dev, COM1_LINE_STATUS_PORT, &read_status_port, &write_status_port); + v3_dev_hook_io(dev, COM1_MODEM_STATUS_PORT, &read_status_port, &write_status_port); + v3_dev_hook_io(dev, COM1_SCRATCH_PORT, &read_ctrl_port, &write_ctrl_port); + + v3_dev_hook_io(dev, COM2_DATA_PORT, &read_data_port, &write_data_port); + v3_dev_hook_io(dev, COM2_IRQ_ENABLE_PORT, &read_ctrl_port, &write_ctrl_port); + v3_dev_hook_io(dev, COM2_FIFO_CTRL_PORT, &read_ctrl_port, &write_ctrl_port); + v3_dev_hook_io(dev, COM2_LINE_CTRL_PORT, &read_ctrl_port, &write_ctrl_port); + v3_dev_hook_io(dev, COM2_MODEM_CTRL_PORT, &read_ctrl_port, &write_ctrl_port); + v3_dev_hook_io(dev, COM2_LINE_STATUS_PORT, &read_status_port, &write_status_port); + v3_dev_hook_io(dev, COM2_MODEM_STATUS_PORT, &read_status_port, &write_status_port); + v3_dev_hook_io(dev, COM2_SCRATCH_PORT, &read_ctrl_port, &write_ctrl_port); + + v3_dev_hook_io(dev, COM3_DATA_PORT, &read_data_port, &write_data_port); + v3_dev_hook_io(dev, COM3_IRQ_ENABLE_PORT, &read_ctrl_port, &write_ctrl_port); + v3_dev_hook_io(dev, COM3_FIFO_CTRL_PORT, &read_ctrl_port, &write_ctrl_port); + v3_dev_hook_io(dev, COM3_LINE_CTRL_PORT, &read_ctrl_port, &write_ctrl_port); + v3_dev_hook_io(dev, COM3_MODEM_CTRL_PORT, &read_ctrl_port, &write_ctrl_port); + v3_dev_hook_io(dev, COM3_LINE_STATUS_PORT, &read_status_port, &write_status_port); + v3_dev_hook_io(dev, COM3_MODEM_STATUS_PORT, &read_status_port, &write_status_port); + v3_dev_hook_io(dev, COM3_SCRATCH_PORT, &read_ctrl_port, &write_ctrl_port); + + v3_dev_hook_io(dev, COM4_DATA_PORT, &read_data_port, &write_data_port); + v3_dev_hook_io(dev, COM4_IRQ_ENABLE_PORT, &read_ctrl_port, &write_ctrl_port); + v3_dev_hook_io(dev, COM4_FIFO_CTRL_PORT, &read_ctrl_port, &write_ctrl_port); + v3_dev_hook_io(dev, COM4_LINE_CTRL_PORT, &read_ctrl_port, &write_ctrl_port); + v3_dev_hook_io(dev, COM4_MODEM_CTRL_PORT, &read_ctrl_port, &write_ctrl_port); + v3_dev_hook_io(dev, COM4_LINE_STATUS_PORT, &read_status_port, &write_status_port); + v3_dev_hook_io(dev, COM4_MODEM_STATUS_PORT, &read_status_port, &write_status_port); + v3_dev_hook_io(dev, COM4_SCRATCH_PORT, &read_ctrl_port, &write_ctrl_port); return 0; } -int serial_deinit(struct vm_device * dev) { - - - dev_unhook_io(dev, COM1_DATA_PORT); - dev_unhook_io(dev, COM1_IRQ_ENABLE_PORT); - dev_unhook_io(dev, COM1_FIFO_CTRL_PORT); - dev_unhook_io(dev, COM1_LINE_CTRL_PORT); - dev_unhook_io(dev, COM1_MODEM_CTRL_PORT); - dev_unhook_io(dev, COM1_LINE_STATUS_PORT); - dev_unhook_io(dev, COM1_MODEM_STATUS_PORT); - dev_unhook_io(dev, COM1_SCRATCH_PORT); - - dev_unhook_io(dev, COM2_DATA_PORT); - dev_unhook_io(dev, COM2_IRQ_ENABLE_PORT); - dev_unhook_io(dev, COM2_FIFO_CTRL_PORT); - dev_unhook_io(dev, COM2_LINE_CTRL_PORT); - dev_unhook_io(dev, COM2_MODEM_CTRL_PORT); - dev_unhook_io(dev, COM2_LINE_STATUS_PORT); - dev_unhook_io(dev, COM2_MODEM_STATUS_PORT); - dev_unhook_io(dev, COM2_SCRATCH_PORT); - - dev_unhook_io(dev, COM3_DATA_PORT); - dev_unhook_io(dev, COM3_IRQ_ENABLE_PORT); - dev_unhook_io(dev, COM3_FIFO_CTRL_PORT); - dev_unhook_io(dev, COM3_LINE_CTRL_PORT); - dev_unhook_io(dev, COM3_MODEM_CTRL_PORT); - dev_unhook_io(dev, COM3_LINE_STATUS_PORT); - dev_unhook_io(dev, COM3_MODEM_STATUS_PORT); - dev_unhook_io(dev, COM3_SCRATCH_PORT); - - dev_unhook_io(dev, COM4_DATA_PORT); - dev_unhook_io(dev, COM4_IRQ_ENABLE_PORT); - dev_unhook_io(dev, COM4_FIFO_CTRL_PORT); - dev_unhook_io(dev, COM4_LINE_CTRL_PORT); - dev_unhook_io(dev, COM4_MODEM_CTRL_PORT); - dev_unhook_io(dev, COM4_LINE_STATUS_PORT); - dev_unhook_io(dev, COM4_MODEM_STATUS_PORT); - dev_unhook_io(dev, COM4_SCRATCH_PORT); +static int serial_deinit(struct vm_device * dev) { + + + v3_dev_unhook_io(dev, COM1_DATA_PORT); + v3_dev_unhook_io(dev, COM1_IRQ_ENABLE_PORT); + v3_dev_unhook_io(dev, COM1_FIFO_CTRL_PORT); + v3_dev_unhook_io(dev, COM1_LINE_CTRL_PORT); + v3_dev_unhook_io(dev, COM1_MODEM_CTRL_PORT); + v3_dev_unhook_io(dev, COM1_LINE_STATUS_PORT); + v3_dev_unhook_io(dev, COM1_MODEM_STATUS_PORT); + v3_dev_unhook_io(dev, COM1_SCRATCH_PORT); + + v3_dev_unhook_io(dev, COM2_DATA_PORT); + v3_dev_unhook_io(dev, COM2_IRQ_ENABLE_PORT); + v3_dev_unhook_io(dev, COM2_FIFO_CTRL_PORT); + v3_dev_unhook_io(dev, COM2_LINE_CTRL_PORT); + v3_dev_unhook_io(dev, COM2_MODEM_CTRL_PORT); + v3_dev_unhook_io(dev, COM2_LINE_STATUS_PORT); + v3_dev_unhook_io(dev, COM2_MODEM_STATUS_PORT); + v3_dev_unhook_io(dev, COM2_SCRATCH_PORT); + + v3_dev_unhook_io(dev, COM3_DATA_PORT); + v3_dev_unhook_io(dev, COM3_IRQ_ENABLE_PORT); + v3_dev_unhook_io(dev, COM3_FIFO_CTRL_PORT); + v3_dev_unhook_io(dev, COM3_LINE_CTRL_PORT); + v3_dev_unhook_io(dev, COM3_MODEM_CTRL_PORT); + v3_dev_unhook_io(dev, COM3_LINE_STATUS_PORT); + v3_dev_unhook_io(dev, COM3_MODEM_STATUS_PORT); + v3_dev_unhook_io(dev, COM3_SCRATCH_PORT); + + v3_dev_unhook_io(dev, COM4_DATA_PORT); + v3_dev_unhook_io(dev, COM4_IRQ_ENABLE_PORT); + v3_dev_unhook_io(dev, COM4_FIFO_CTRL_PORT); + v3_dev_unhook_io(dev, COM4_LINE_CTRL_PORT); + v3_dev_unhook_io(dev, COM4_MODEM_CTRL_PORT); + v3_dev_unhook_io(dev, COM4_LINE_STATUS_PORT); + v3_dev_unhook_io(dev, COM4_MODEM_STATUS_PORT); + v3_dev_unhook_io(dev, COM4_SCRATCH_PORT); return 0; } @@ -576,12 +592,12 @@ static struct vm_device_ops dev_ops = { }; -struct vm_device * create_serial(int num_ports) { +struct vm_device * v3_create_serial(int num_ports) { struct serial_state * state = NULL; state = (struct serial_state *)V3_Malloc(sizeof(struct serial_state)); V3_ASSERT(state != NULL); - struct vm_device * device = create_device("Serial UART", &dev_ops, state); + struct vm_device * device = v3_create_device("Serial UART", &dev_ops, state); return device; }