X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fdevices%2F8254.c;h=e6ddd52fecc7193136cac5d3456f739dd4a76198;hb=f4b430cdef58c5d13260c57f46a077c07c72864e;hp=8e46d8e60b88768dc25120fb39af5edbf8d94351;hpb=d35c92b5c9c5aef7b1e7b5ed500b2beae504ea4e;p=palacios.git diff --git a/palacios/src/devices/8254.c b/palacios/src/devices/8254.c index 8e46d8e..e6ddd52 100644 --- a/palacios/src/devices/8254.c +++ b/palacios/src/devices/8254.c @@ -1,11 +1,18 @@ +/* (c) 2008, Jack Lange */ +/* (c) 2008, The V3VEE Project */ + #include #include #include #include +#include - +#ifndef DEBUG_PIT +#undef PrintDebug +#define PrintDebug(fmt, args...) +#endif @@ -46,9 +53,9 @@ struct channel { ushort_t latched_value; - enum {NOTLATCHED,LATCHED} latch_state; + enum {NOTLATCHED, LATCHED} latch_state; - enum {LSB,MSB} read_state; + enum {LSB, MSB} read_state; uint_t output_pin : 1; uint_t gate_input_pin : 1; @@ -239,7 +246,7 @@ static void pit_update_time(ullong_t cpu_cycles, ullong_t cpu_freq, void * priva if (handle_crystal_tics(dev, &(state->ch_0), oscillations) == 1) { // raise interrupt PrintDebug("8254 PIT: Injecting Timer interrupt to guest\n"); - dev->vm->vm_ops.raise_irq(dev->vm, 0); + v3_raise_irq(dev->vm, 0); } //handle_crystal_tics(dev, &(state->ch_1), oscillations); @@ -321,22 +328,22 @@ static int handle_channel_write(struct channel * ch, char val) { static int handle_channel_read(struct channel * ch, char * val) { - ushort_t *myval; + ushort_t * myval; - if (ch->latch_state==NOTLATCHED) { + if (ch->latch_state == NOTLATCHED) { myval = &(ch->counter); } else { myval = &(ch->latched_value); } - if (ch->read_state==LSB) { + if (ch->read_state == LSB) { *val = ((char*)myval)[0]; // little endian - ch->read_state=MSB; + ch->read_state = MSB; } else { *val = ((char*)myval)[1]; - ch->read_state=LSB; - if (ch->latch_state==LATCHED) { - ch->latch_state=NOTLATCHED; + ch->read_state = LSB; + if (ch->latch_state == LATCHED) { + ch->latch_state = NOTLATCHED; } } @@ -357,9 +364,9 @@ static int handle_channel_cmd(struct channel * ch, struct pit_cmd_word cmd) { switch (cmd.access_mode) { case LATCH_COUNT: - if (ch->latch_state==NOTLATCHED) { - ch->latched_value=ch->counter; - ch->latch_state=LATCHED; + if (ch->latch_state == NOTLATCHED) { + ch->latched_value = ch->counter; + ch->latch_state = LATCHED; } break; case HIBYTE_ONLY: @@ -401,7 +408,7 @@ static int pit_read_channel(ushort_t port, void * dst, uint_t length, struct vm_ char * val = (char *)dst; if (length != 1) { - PrintDebug("8254 PIT: Invalid Read Write length \n"); + PrintError("8254 PIT: Invalid Read Write length \n"); return -1; } @@ -424,7 +431,7 @@ static int pit_read_channel(ushort_t port, void * dst, uint_t length, struct vm_ } break; default: - PrintDebug("8254 PIT: Read from invalid port (%d)\n", port); + PrintError("8254 PIT: Read from invalid port (%d)\n", port); return -1; } @@ -438,7 +445,7 @@ static int pit_write_channel(ushort_t port, void * src, uint_t length, struct vm char val = *(char *)src; if (length != 1) { - PrintDebug("8254 PIT: Invalid Write Length\n"); + PrintError("8254 PIT: Invalid Write Length\n"); return -1; } @@ -462,7 +469,7 @@ static int pit_write_channel(ushort_t port, void * src, uint_t length, struct vm } break; default: - PrintDebug("8254 PIT: Write to invalid port (%d)\n", port); + PrintError("8254 PIT: Write to invalid port (%d)\n", port); return -1; } @@ -479,7 +486,7 @@ static int pit_write_command(ushort_t port, void * src, uint_t length, struct vm PrintDebug("8254 PIT: Write to PIT Command port\n"); PrintDebug("8254 PIT: Writing to channel %d (access_mode = %d, op_mode = %d)\n", cmd->channel, cmd->access_mode, cmd->op_mode); if (length != 1) { - PrintDebug("8254 PIT: Write of Invalid length to command port\n"); + PrintError("8254 PIT: Write of Invalid length to command port\n"); return -1; } @@ -530,9 +537,9 @@ static void init_channel(struct channel * ch) { ch->output_pin = 0; ch->gate_input_pin = 0; - ch->latched_value=0; - ch->latch_state=NOTLATCHED; - ch->read_state=LSB; + ch->latched_value = 0; + ch->latch_state = NOTLATCHED; + ch->read_state = LSB; return; } @@ -548,10 +555,11 @@ static int pit_init(struct vm_device * dev) { dev_hook_io(dev, CHANNEL2_PORT, &pit_read_channel, &pit_write_channel); dev_hook_io(dev, COMMAND_PORT, NULL, &pit_write_command); +#ifdef DEBUG_PIT PrintDebug("8254 PIT: OSC_HZ=%d, reload_val=", OSC_HZ); PrintTraceLL(reload_val); PrintDebug("\n"); - +#endif v3_add_timer(dev->vm, &timer_ops, dev); @@ -567,9 +575,11 @@ static int pit_init(struct vm_device * dev) { init_channel(&(state->ch_1)); init_channel(&(state->ch_2)); +#ifdef DEBUG_PIT PrintDebug("8254 PIT: CPU MHZ=%d -- pit count=", cpu_khz / 1000); PrintTraceLL(state->pit_counter); PrintDebug("\n"); +#endif return 0; }