*/
typedef enum {NOT_RUNNING, PENDING, RUNNING} channel_run_state_t;
typedef enum {NOT_WAITING, WAITING_LOBYTE, WAITING_HIBYTE} channel_access_state_t;
-typedef enum {LATCH_COUNT, LOBYTE_ONLY, HIBYTE_ONLY, LOBYTE_HIBYTE} channel_access_mode_t;
-typedef enum {IRQ_ON_TERM_CNT, ONE_SHOT, RATE_GEN, SQR_WAVE, SW_STROBE, HW_STROBE} channel_op_mode_t;
+typedef enum {LATCH_COUNT = 0, LOBYTE_ONLY = 1, HIBYTE_ONLY = 2, LOBYTE_HIBYTE = 3} channel_access_mode_t;
+typedef enum {IRQ_ON_TERM_CNT = 0, ONE_SHOT = 1, RATE_GEN = 2, SQR_WAVE = 3, SW_STROBE = 4, HW_STROBE = 5} channel_op_mode_t;
struct channel {
} else {
ushort_t reload_val = ch->reload_value;
- if (ch->op_mode == SW_STROBE) {
+ if ((ch->op_mode == SW_STROBE) || (ch->op_mode == IRQ_ON_TERM_CNT)) {
reload_val = 0xffff;
}
return -1;
}
- if (cmd->op_mode == 0) {
- V3_Print("SETTING PIT MODE TO 0!!!!!\n");
- v3_print_guest_state(core);
- }
-
switch (cmd->channel) {
case 0:
if (handle_channel_cmd(&(state->ch_0), *cmd) == -1) {
return 0;
}
-#ifdef V3_CONFIG_KEYED_STREAMS
-static int pit_checkpoint(struct vm_device *dev, v3_keyed_stream_t stream)
-{
- struct pit *p = (struct pit *) (dev->private_data);
-
- v3_keyed_stream_key_t ks;
+#ifdef V3_CONFIG_CHECKPOINT
+static int pit_save(struct v3_chkpt_ctx * ctx, void * private_data) {
+ struct pit * pit_state = (struct pit *)private_data;
- ks = v3_keyed_stream_open_key(stream,dev->name);
-
- if (!ks) {
- return -1;
- }
-
- STD_SAVE(stream,ks,p->pit_counter);
- STD_SAVE(stream,ks,p->pit_reload);
- STD_SAVE(stream,ks,p->ch_0);
- STD_SAVE(stream,ks,p->ch_1);
- STD_SAVE(stream,ks,p->ch_2);
- STD_SAVE(stream,ks,p->speaker);
-
- v3_keyed_stream_close_key(stream,ks);
+ V3_CHKPT_STD_SAVE(ctx, pit_state->pit_counter);
+ V3_CHKPT_STD_SAVE(ctx, pit_state->pit_reload);
+ V3_CHKPT_STD_SAVE(ctx, pit_state->ch_0);
+ V3_CHKPT_STD_SAVE(ctx, pit_state->ch_1);
+ V3_CHKPT_STD_SAVE(ctx, pit_state->ch_2);
+ V3_CHKPT_STD_SAVE(ctx, pit_state->speaker);
return 0;
-
-
}
-static int pit_restore(struct vm_device *dev, v3_keyed_stream_t stream)
-{
- struct pit *p = (struct pit *) (dev->private_data);
-
- v3_keyed_stream_key_t ks;
-
- ks = v3_keyed_stream_open_key(stream,dev->name);
+static int pit_load(struct v3_chkpt_ctx * ctx, void * private_data) {
+ struct pit * pit_state = (struct pit *)private_data;
- if (!ks) {
- return -1;
- }
+ V3_CHKPT_STD_LOAD(ctx, pit_state->pit_counter);
+ V3_CHKPT_STD_LOAD(ctx, pit_state->pit_reload);
+ V3_CHKPT_STD_LOAD(ctx, pit_state->ch_0);
+ V3_CHKPT_STD_LOAD(ctx, pit_state->ch_1);
+ V3_CHKPT_STD_LOAD(ctx, pit_state->ch_2);
+ V3_CHKPT_STD_LOAD(ctx, pit_state->speaker);
- STD_LOAD(stream,ks,p->pit_counter);
- STD_LOAD(stream,ks,p->pit_reload);
- STD_LOAD(stream,ks,p->ch_0);
- STD_LOAD(stream,ks,p->ch_1);
- STD_LOAD(stream,ks,p->ch_2);
- STD_LOAD(stream,ks,p->speaker);
-
- v3_keyed_stream_close_key(stream,ks);
-
return 0;
-
-
}
#endif
static struct v3_device_ops dev_ops = {
.free = (int (*)(void *))pit_free,
-#ifdef V3_CONFIG_KEYED_STREAMS
- .checkpoint = pit_checkpoint,
- .restore = pit_restore,
+#ifdef V3_CONFIG_CHECKPOINT
+ .save = pit_save,
+ .load = pit_load,
#endif
};