⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vpt.h

📁 xen 3.2.2 源码
💻 H
字号:
/* * vpt.h: Virtual Platform Timer definitions * * Copyright (c) 2004, Intel Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., 59 Temple * Place - Suite 330, Boston, MA 02111-1307 USA. */#ifndef __ASM_X86_HVM_VPT_H__#define __ASM_X86_HVM_VPT_H__#include <xen/config.h>#include <xen/init.h>#include <xen/lib.h>#include <xen/time.h>#include <xen/errno.h>#include <xen/time.h>#include <xen/timer.h>#include <xen/list.h>#include <asm/hvm/vpic.h>#include <asm/hvm/irq.h>#include <public/hvm/save.h>struct HPETState;struct HPET_timer_fn_info {    struct HPETState *hs;    unsigned int tn;};struct hpet_registers {    /* Memory-mapped, software visible registers */    uint64_t capability;        /* capabilities */    uint64_t config;            /* configuration */    uint64_t isr;               /* interrupt status reg */    uint64_t mc64;              /* main counter */    struct {                    /* timers */        uint64_t config;        /* configuration/cap */        uint64_t cmp;           /* comparator */        uint64_t fsb;           /* FSB route, not supported now */    } timers[HPET_TIMER_NUM];    /* Hidden register state */    uint64_t period[HPET_TIMER_NUM]; /* Last value written to comparator */};typedef struct HPETState {    struct hpet_registers hpet;    struct vcpu *vcpu;    uint64_t tsc_freq;    uint64_t hpet_to_ns_scale; /* hpet ticks to ns (multiplied by 2^10) */    uint64_t hpet_to_ns_limit; /* max hpet ticks convertable to ns      */    uint64_t mc_offset;    struct timer timers[HPET_TIMER_NUM];    struct HPET_timer_fn_info timer_fn_info[HPET_TIMER_NUM];     spinlock_t lock;} HPETState;/* * Abstract layer of periodic time, one short time. */typedef void time_cb(struct vcpu *v, void *opaque);struct periodic_time {    struct list_head list;    bool_t on_list;    bool_t one_shot;    bool_t do_not_freeze;    bool_t irq_issued;    bool_t warned_timeout_too_short;#define PTSRC_isa    1 /* ISA time source */#define PTSRC_lapic  2 /* LAPIC time source */    u8 source;                  /* PTSRC_ */    u8 irq;    struct vcpu *vcpu;          /* vcpu timer interrupt delivers to */    u32 pending_intr_nr;        /* pending timer interrupts */    u64 period;                 /* frequency in ns */    u64 period_cycles;          /* frequency in cpu cycles */    s_time_t scheduled;         /* scheduled timer interrupt */    u64 last_plt_gtime;         /* platform time when last IRQ is injected */    struct timer timer;         /* ac_timer */    time_cb *cb;    void *priv;                 /* point back to platform time source */};#define PIT_FREQ 1193181#define PIT_BASE 0x40typedef struct PITState {    /* Hardware state */    struct hvm_hw_pit hw;    /* Last time the counters read zero, for calcuating counter reads */    int64_t count_load_time[3];    /* Channel 0 IRQ handling. */    struct periodic_time pt0;    spinlock_t lock;} PITState;typedef struct RTCState {    /* Hardware state */    struct hvm_hw_rtc hw;    /* RTC's idea of the current time */    struct tm current_tm;    /* second update */    int64_t next_second_time;    struct timer second_timer;    struct timer second_timer2;    struct periodic_time pt;    int32_t time_offset_seconds;    spinlock_t lock;} RTCState;#define FREQUENCE_PMTIMER  3579545  /* Timer should run at 3.579545 MHz */typedef struct PMTState {    struct hvm_hw_pmtimer pm;   /* 32bit timer value */    struct vcpu *vcpu;          /* Keeps sync with this vcpu's guest-time */    uint64_t last_gtime;        /* Last (guest) time we updated the timer */    uint64_t scale;             /* Multiplier to get from tsc to timer ticks */    struct timer timer;         /* To make sure we send SCIs */    spinlock_t lock;} PMTState;struct pl_time {    /* platform time */    struct PITState  vpit;    struct RTCState  vrtc;    struct HPETState vhpet;    struct PMTState  vpmt;};#define ticks_per_sec(v) (v->domain->arch.hvm_domain.tsc_frequency)void pt_save_timer(struct vcpu *v);void pt_restore_timer(struct vcpu *v);void pt_update_irq(struct vcpu *v);void pt_intr_post(struct vcpu *v, struct hvm_intack intack);void pt_reset(struct vcpu *v);void pt_migrate(struct vcpu *v);/* Is given periodic timer active? */#define pt_active(pt) ((pt)->on_list)/* * Create/destroy a periodic (or one-shot!) timer. * The given periodic timer structure must be initialised with zero bytes, * except for the 'source' field which must be initialised with the * correct PTSRC_ value. The initialised timer structure can then be passed * to {create,destroy}_periodic_time() and number of times and in any order. * Note that, for a given periodic timer, invocations of these functions MUST * be serialised. */void create_periodic_time(    struct vcpu *v, struct periodic_time *pt, uint64_t period,    uint8_t irq, char one_shot, time_cb *cb, void *data);void destroy_periodic_time(struct periodic_time *pt);int pv_pit_handler(int port, int data, int write);void pit_init(struct vcpu *v, unsigned long cpu_khz);void pit_stop_channel0_irq(PITState * pit);void pit_deinit(struct domain *d);void rtc_init(struct vcpu *v, int base);void rtc_migrate_timers(struct vcpu *v);void rtc_deinit(struct domain *d);void pmtimer_init(struct vcpu *v);void pmtimer_deinit(struct domain *d);void hpet_migrate_timers(struct vcpu *v);void hpet_init(struct vcpu *v);void hpet_deinit(struct domain *d);#endif /* __ASM_X86_HVM_VPT_H__ */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -