1251767Sgibbs/******************************************************************************
2251767Sgibbs * save_types.h
3251767Sgibbs *
4251767Sgibbs * Copyright (c) 2007 Isaku Yamahata <yamahata at valinux co jp>
5251767Sgibbs *                    VA Linux Systems Japan K.K.
6251767Sgibbs *
7251767Sgibbs * Permission is hereby granted, free of charge, to any person obtaining a copy
8251767Sgibbs * of this software and associated documentation files (the "Software"), to
9251767Sgibbs * deal in the Software without restriction, including without limitation the
10251767Sgibbs * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
11251767Sgibbs * sell copies of the Software, and to permit persons to whom the Software is
12251767Sgibbs * furnished to do so, subject to the following conditions:
13251767Sgibbs *
14251767Sgibbs * The above copyright notice and this permission notice shall be included in
15251767Sgibbs * all copies or substantial portions of the Software.
16251767Sgibbs *
17251767Sgibbs * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18251767Sgibbs * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19251767Sgibbs * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20251767Sgibbs * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21251767Sgibbs * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22251767Sgibbs * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23251767Sgibbs * DEALINGS IN THE SOFTWARE.
24251767Sgibbs */
25251767Sgibbs
26251767Sgibbs#ifndef __XEN_PUBLIC_HVM_SAVE_IA64_H__
27251767Sgibbs#define __XEN_PUBLIC_HVM_SAVE_IA64_H__
28251767Sgibbs
29251767Sgibbs#include "../../hvm/save.h"
30251767Sgibbs#include "../../arch-ia64.h"
31251767Sgibbs
32251767Sgibbs/*
33251767Sgibbs * Save/restore header: general info about the save file.
34251767Sgibbs */
35251767Sgibbs
36251767Sgibbs/* x86 uses 0x54381286 */
37251767Sgibbs#define HVM_FILE_MAGIC   0x343641492f6e6558UL   /* "Xen/IA64" */
38251767Sgibbs#define HVM_FILE_VERSION 0x0000000000000001UL
39251767Sgibbs
40251767Sgibbsstruct hvm_save_header {
41251767Sgibbs    uint64_t magic;             /* Must be HVM_FILE_MAGIC */
42251767Sgibbs    uint64_t version;           /* File format version */
43251767Sgibbs    uint64_t changeset;         /* Version of Xen that saved this file */
44251767Sgibbs    uint64_t cpuid[5];          /* CPUID[0x01][%eax] on the saving machine */
45251767Sgibbs};
46251767Sgibbs
47251767SgibbsDECLARE_HVM_SAVE_TYPE(HEADER, 1, struct hvm_save_header);
48251767Sgibbs
49251767Sgibbs/*
50251767Sgibbs * CPU
51251767Sgibbs */
52251767Sgibbsstruct hvm_hw_ia64_cpu {
53251767Sgibbs    uint64_t    ipsr;
54251767Sgibbs};
55251767SgibbsDECLARE_HVM_SAVE_TYPE(CPU, 2, struct hvm_hw_ia64_cpu);
56251767Sgibbs
57251767Sgibbs/*
58251767Sgibbs * CPU
59251767Sgibbs */
60251767Sgibbsstruct hvm_hw_ia64_vpd {
61251767Sgibbs    struct vpd      vpd;
62251767Sgibbs};
63251767SgibbsDECLARE_HVM_SAVE_TYPE(VPD, 3, struct hvm_hw_ia64_vpd);
64251767Sgibbs
65251767Sgibbs/*
66251767Sgibbs * device dependency
67251767Sgibbs * vacpi => viosapic => vlsapic
68251767Sgibbs */
69251767Sgibbs/*
70251767Sgibbs * vlsapic
71251767Sgibbs */
72251767Sgibbsstruct hvm_hw_ia64_vlsapic {
73251767Sgibbs    uint64_t insvc[4];
74251767Sgibbs    uint64_t vhpi; // ??? should this be saved in vpd
75251767Sgibbs    uint8_t xtp;
76251767Sgibbs    uint8_t pal_init_pending;
77251767Sgibbs    uint8_t pad[2];
78251767Sgibbs};
79251767SgibbsDECLARE_HVM_SAVE_TYPE(VLSAPIC, 4, struct hvm_hw_ia64_vlsapic);
80251767Sgibbs/* set
81251767Sgibbs * unconditionaly set v->arch.irq_new_peding = 1
82251767Sgibbs * unconditionaly set v->arch.irq_new_condition = 0
83251767Sgibbs */
84251767Sgibbs
85251767Sgibbs/*
86251767Sgibbs * vtime
87251767Sgibbs */
88251767Sgibbs/* itc, itm, itv are saved by arch vcpu context */
89251767Sgibbsstruct hvm_hw_ia64_vtime {
90251767Sgibbs    uint64_t itc;
91251767Sgibbs    uint64_t itm;
92251767Sgibbs
93251767Sgibbs    uint64_t last_itc;
94251767Sgibbs    uint64_t pending;
95251767Sgibbs};
96251767SgibbsDECLARE_HVM_SAVE_TYPE(VTIME, 5, struct hvm_hw_ia64_vtime);
97251767Sgibbs/*
98251767Sgibbs * calculate v->vtm.vtm_offset
99251767Sgibbs * ??? Or should vtm_offset be set by leave_hypervisor_tail()?
100251767Sgibbs * start vtm_timer if necessary by vtm_set_itm().
101251767Sgibbs * ??? Or should vtm_timer be set by leave_hypervisor_tail()?
102251767Sgibbs *
103251767Sgibbs * ??? or should be done by schedule_tail()
104251767Sgibbs *        => schedule_tail() should do.
105251767Sgibbs */
106251767Sgibbs
107251767Sgibbs/*
108251767Sgibbs * viosapic
109251767Sgibbs */
110251767Sgibbs#define VIOSAPIC_NUM_PINS     48
111251767Sgibbs
112251767Sgibbs/* To share VT-d code which uses vioapic_redir_entry.
113251767Sgibbs * Although on ia64 this is for vsapic, but we have to vioapic_redir_entry
114251767Sgibbs * instead of viosapic_redir_entry.
115251767Sgibbs */
116251767Sgibbsunion vioapic_redir_entry
117251767Sgibbs{
118251767Sgibbs    uint64_t bits;
119251767Sgibbs    struct {
120251767Sgibbs        uint8_t vector;
121251767Sgibbs
122251767Sgibbs        uint8_t delivery_mode  : 3;
123251767Sgibbs        uint8_t reserve1       : 1;
124251767Sgibbs        uint8_t delivery_status: 1;
125251767Sgibbs        uint8_t polarity       : 1;
126251767Sgibbs        uint8_t reserve2       : 1;
127251767Sgibbs        uint8_t trig_mode      : 1;
128251767Sgibbs
129251767Sgibbs        uint8_t mask           : 1;
130251767Sgibbs        uint8_t reserve3       : 7;
131251767Sgibbs
132251767Sgibbs        uint8_t reserved[3];
133251767Sgibbs        uint16_t dest_id;
134251767Sgibbs    } fields;
135251767Sgibbs};
136251767Sgibbs
137251767Sgibbsstruct hvm_hw_ia64_viosapic {
138251767Sgibbs    uint64_t    irr;
139251767Sgibbs    uint64_t    isr;
140251767Sgibbs    uint32_t    ioregsel;
141251767Sgibbs    uint32_t    pad;
142251767Sgibbs    uint64_t    lowest_vcpu_id;
143251767Sgibbs    uint64_t    base_address;
144251767Sgibbs    union vioapic_redir_entry  redirtbl[VIOSAPIC_NUM_PINS];
145251767Sgibbs};
146251767SgibbsDECLARE_HVM_SAVE_TYPE(VIOSAPIC, 6, struct hvm_hw_ia64_viosapic);
147251767Sgibbs
148251767Sgibbs/*
149251767Sgibbs * vacpi
150251767Sgibbs * PM timer
151251767Sgibbs */
152251767Sgibbsstruct vacpi_regs {
153251767Sgibbs    union {
154251767Sgibbs        struct {
155251767Sgibbs            uint32_t pm1a_sts:16;/* PM1a_EVT_BLK.PM1a_STS: status register */
156251767Sgibbs            uint32_t pm1a_en:16; /* PM1a_EVT_BLK.PM1a_EN: enable register */
157251767Sgibbs        };
158251767Sgibbs        uint32_t evt_blk;
159251767Sgibbs    };
160251767Sgibbs    uint32_t tmr_val;   /* PM_TMR_BLK.TMR_VAL: 32bit free-running counter */
161251767Sgibbs};
162251767Sgibbs
163251767Sgibbsstruct hvm_hw_ia64_vacpi {
164251767Sgibbs    struct vacpi_regs   regs;
165251767Sgibbs};
166251767SgibbsDECLARE_HVM_SAVE_TYPE(VACPI, 7, struct hvm_hw_ia64_vacpi);
167251767Sgibbs/* update last_gtime and setup timer of struct vacpi */
168251767Sgibbs
169251767Sgibbs/*
170251767Sgibbs * opt_feature: identity mapping of region 4, 5 and 7.
171251767Sgibbs * With the c/s 16396:d2935f9c217f of xen-ia64-devel.hg,
172251767Sgibbs * opt_feature hypercall supports only region 4,5,7 identity mappings.
173251767Sgibbs * structure hvm_hw_ia64_identity_mappings only supports them.
174251767Sgibbs * The new structure, struct hvm_hw_ia64_identity_mappings, is created to
175251767Sgibbs * avoid to keep up with change of the xen/ia64 internal structure, struct
176251767Sgibbs * opt_feature.
177251767Sgibbs *
178251767Sgibbs * If it is enhanced in the future, new structure will be created.
179251767Sgibbs */
180251767Sgibbsstruct hvm_hw_ia64_identity_mapping {
181251767Sgibbs    uint64_t on;        /* on/off */
182251767Sgibbs    uint64_t pgprot;    /* The page protection bit mask of the pte. */
183251767Sgibbs    uint64_t key;       /* A protection key. */
184251767Sgibbs};
185251767Sgibbs
186251767Sgibbsstruct hvm_hw_ia64_identity_mappings {
187251767Sgibbs    struct hvm_hw_ia64_identity_mapping im_reg4;/* Region 4 identity mapping */
188251767Sgibbs    struct hvm_hw_ia64_identity_mapping im_reg5;/* Region 5 identity mapping */
189251767Sgibbs    struct hvm_hw_ia64_identity_mapping im_reg7;/* Region 7 identity mapping */
190251767Sgibbs};
191251767SgibbsDECLARE_HVM_SAVE_TYPE(OPT_FEATURE_IDENTITY_MAPPINGS, 8, struct hvm_hw_ia64_identity_mappings);
192251767Sgibbs
193251767Sgibbs/*
194251767Sgibbs * Largest type-code in use
195251767Sgibbs */
196251767Sgibbs#define HVM_SAVE_CODE_MAX       8
197251767Sgibbs
198251767Sgibbs#endif /* __XEN_PUBLIC_HVM_SAVE_IA64_H__ */
199251767Sgibbs
200251767Sgibbs/*
201251767Sgibbs * Local variables:
202251767Sgibbs * mode: C
203251767Sgibbs * c-set-style: "BSD"
204251767Sgibbs * c-basic-offset: 4
205251767Sgibbs * tab-width: 4
206251767Sgibbs * indent-tabs-mode: nil
207251767Sgibbs * End:
208251767Sgibbs */
209