33 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
35 #include <linux/kvm_host.h>
36 #include <linux/slab.h>
44 #define mod_64(x, y) ((x) - (y) * div64_u64(x, y))
46 #define mod_64(x, y) ((x) % (y))
49 #define RW_STATE_LSB 1
50 #define RW_STATE_MSB 2
51 #define RW_STATE_WORD0 3
52 #define RW_STATE_WORD1 4
100 remaining = hrtimer_get_remaining(&ps->
timer);
101 elapsed = ps->
period - ktime_to_ns(remaining);
129 counter = (c->
count - d) & 0xffff;
154 out = (d >= c->
count);
157 out = (d < c->
count);
167 out = (d == c->
count);
214 if (atomic_dec_if_positive(&ps->
pending) > 0)
221 struct hrtimer *timer;
224 if (vcpu->vcpu_id || !pit)
229 if (hrtimer_cancel(timer))
230 hrtimer_start_expires(timer, HRTIMER_MODE_ABS);
237 kthread_flush_work(&pit->
expired);
243 struct kvm *kvm = pit->
kvm;
244 struct kvm_vcpu *vcpu;
263 if (atomic_read(&kvm->arch.vapics_in_nmi_mode) > 0)
264 kvm_for_each_vcpu(i, vcpu, kvm)
268 static enum hrtimer_restart
pit_timer_fn(
struct hrtimer *data)
280 return HRTIMER_RESTART;
282 return HRTIMER_NORESTART;
294 struct kvm *kvm = pit->
kvm;
296 if (atomic_read(&ps->
reinject) == reinject)
308 kvm_set_apicv_inhibit(kvm, APICV_INHIBIT_REASON_PIT_REINJ);
314 kvm_clear_apicv_inhibit(kvm, APICV_INHIBIT_REASON_PIT_REINJ);
319 atomic_set(&ps->
reinject, reinject);
325 struct kvm *kvm = pit->
kvm;
329 ps->
flags & KVM_PIT_FLAGS_HPET_LEGACY)
332 interval = mul_u64_u32_div(val, NSEC_PER_SEC,
KVM_PIT_FREQ);
334 pr_debug(
"create pit timer, interval is %llu nsec\n", interval);
337 hrtimer_cancel(&ps->
timer);
338 kthread_flush_work(&pit->
expired);
352 if (ps->
period < min_period) {
355 "i8254 timer period limited to %lld ns\n",
361 hrtimer_start(&ps->
timer, ktime_add_ns(ktime_get(), interval),
369 pr_debug(
"load_count val is %u, channel is %d\n", val, channel);
404 int hpet_legacy_start)
410 if (hpet_legacy_start) {
412 WARN_ON(channel != 0);
440 gpa_t addr,
int len,
const void *data)
446 u32 val = *(u32 *) data;
453 mutex_lock(&pit_state->
lock);
456 pr_debug(
"write addr is 0x%x, len is %d, val is 0x%x\n",
457 (
unsigned int)addr, len, val);
463 for (channel = 0; channel < 3; channel++) {
464 if (val & (2 << channel)) {
481 s->
mode = (val >> 1) & 7;
509 mutex_unlock(&pit_state->
lock);
515 gpa_t addr,
int len,
void *data)
530 mutex_lock(&pit_state->
lock);
560 ret = (
count >> 8) & 0xff;
569 ret = (
count >> 8) & 0xff;
575 if (len >
sizeof(ret))
577 memcpy(data, (
char *)&ret, len);
579 mutex_unlock(&pit_state->
lock);
585 gpa_t addr,
int len,
const void *data)
589 u32 val = *(u32 *) data;
593 mutex_lock(&pit_state->
lock);
595 pit_state->
flags |= KVM_PIT_FLAGS_SPEAKER_DATA_ON;
597 pit_state->
flags &= ~KVM_PIT_FLAGS_SPEAKER_DATA_ON;
599 mutex_unlock(&pit_state->
lock);
605 gpa_t addr,
int len,
void *data)
609 unsigned int refresh_clock;
615 refresh_clock = ((
unsigned int)ktime_to_ns(ktime_get()) >> 14) & 1;
617 mutex_lock(&pit_state->
lock);
618 ret = (!!(pit_state->
flags & KVM_PIT_FLAGS_SPEAKER_DATA_ON) << 1) |
620 (refresh_clock << 4);
621 if (len >
sizeof(ret))
623 memcpy(data, (
char *)&ret, len);
624 mutex_unlock(&pit_state->
lock);
634 for (i = 0; i < 3; i++) {
670 pit = kzalloc(
sizeof(
struct kvm_pit), GFP_KERNEL_ACCOUNT);
680 pid = get_pid(task_tgid(current));
681 pid_nr = pid_vnr(pid);
684 pit->
worker = kthread_create_worker(0,
"kvm-pit/%d", pid_nr);
693 hrtimer_init(&pit_state->
timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
704 mutex_lock(&kvm->slots_lock);
709 goto fail_register_pit;
711 if (
flags & KVM_PIT_SPEAKER_DUMMY) {
717 goto fail_register_speaker;
719 mutex_unlock(&kvm->slots_lock);
723 fail_register_speaker:
726 mutex_unlock(&kvm->slots_lock);
728 kthread_destroy_worker(pit->
worker);
741 mutex_lock(&
kvm->slots_lock);
744 mutex_unlock(&
kvm->slots_lock);
747 kthread_destroy_worker(pit->
worker);
struct kvm_pit * kvm_create_pit(struct kvm *kvm, u32 flags)
static int speaker_ioport_read(struct kvm_vcpu *vcpu, struct kvm_io_device *this, gpa_t addr, int len, void *data)
void kvm_pit_load_count(struct kvm_pit *pit, int channel, u32 val, int hpet_legacy_start)
static void kvm_pit_reset(struct kvm_pit *pit)
static struct kvm_pit * dev_to_pit(struct kvm_io_device *dev)
void kvm_pit_set_reinject(struct kvm_pit *pit, bool reinject)
void kvm_free_pit(struct kvm *kvm)
static struct kvm_pit * pit_state_to_pit(struct kvm_kpit_state *ps)
static void pit_set_gate(struct kvm_pit *pit, int channel, u32 val)
void __kvm_migrate_pit_timer(struct kvm_vcpu *vcpu)
static void pit_latch_count(struct kvm_pit *pit, int channel)
static int pit_ioport_read(struct kvm_vcpu *vcpu, struct kvm_io_device *this, gpa_t addr, int len, void *data)
static int pit_get_gate(struct kvm_pit *pit, int channel)
static void pit_load_count(struct kvm_pit *pit, int channel, u32 val)
static enum hrtimer_restart pit_timer_fn(struct hrtimer *data)
static const struct kvm_io_device_ops speaker_dev_ops
static int speaker_ioport_write(struct kvm_vcpu *vcpu, struct kvm_io_device *this, gpa_t addr, int len, const void *data)
static void create_pit_timer(struct kvm_pit *pit, u32 val, int is_period)
static void pit_latch_status(struct kvm_pit *pit, int channel)
static int pit_ioport_write(struct kvm_vcpu *vcpu, struct kvm_io_device *this, gpa_t addr, int len, const void *data)
static int pit_get_count(struct kvm_pit *pit, int channel)
static void kvm_pit_ack_irq(struct kvm_irq_ack_notifier *kian)
static void pit_do_work(struct kthread_work *work)
static int pit_in_range(gpa_t addr)
static struct kvm_pit * speaker_to_pit(struct kvm_io_device *dev)
static s64 __kpit_elapsed(struct kvm_pit *pit)
static const struct kvm_io_device_ops pit_dev_ops
static int pit_get_out(struct kvm_pit *pit, int channel)
static void pit_mask_notifer(struct kvm_irq_mask_notifier *kimn, bool mask)
static void kvm_pit_reset_reinject(struct kvm_pit *pit)
static s64 kpit_elapsed(struct kvm_pit *pit, struct kvm_kpit_channel_state *c, int channel)
static void destroy_pit_timer(struct kvm_pit *pit)
#define KVM_PIT_BASE_ADDRESS
#define KVM_PIT_CHANNEL_MASK
#define KVM_SPEAKER_BASE_ADDRESS
#define KVM_PIT_MEM_LENGTH
static int ioapic_in_kernel(struct kvm *kvm)
static void kvm_iodevice_init(struct kvm_io_device *dev, const struct kvm_io_device_ops *ops)
void kvm_apic_nmi_wd_deliver(struct kvm_vcpu *vcpu)
int kvm_request_irq_source_id(struct kvm *kvm)
void kvm_register_irq_mask_notifier(struct kvm *kvm, int irq, struct kvm_irq_mask_notifier *kimn)
void kvm_unregister_irq_mask_notifier(struct kvm *kvm, int irq, struct kvm_irq_mask_notifier *kimn)
void kvm_free_irq_source_id(struct kvm *kvm, int irq_source_id)
int kvm_set_irq(struct kvm *kvm, int irq_source_id, u32 irq, int level, bool line_status)
int kvm_io_bus_register_dev(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr, int len, struct kvm_io_device *dev)
int kvm_io_bus_unregister_dev(struct kvm *kvm, enum kvm_bus bus_idx, struct kvm_io_device *dev)
int(* read)(struct kvm_vcpu *vcpu, struct kvm_io_device *this, gpa_t addr, int len, void *val)
struct kvm_kpit_channel_state channels[3]
struct kvm_irq_ack_notifier irq_ack_notifier
struct kthread_work expired
struct kvm_irq_mask_notifier mask_notifier
struct kthread_worker * worker
struct kvm_kpit_state pit_state
struct kvm_io_device speaker_dev
unsigned int min_timer_period_us