aboutsummaryrefslogtreecommitdiffstats
path: root/tools/libxc/xc_core.h
blob: 10cbfca597915a5a3e6ce861fcf7abe82565eaf3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
/*
 * Copyright (c) 2006 Isaku Yamahata <yamahata at valinux co jp>
 *                    VA Linux Systems Japan K.K.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 *
 */

#ifndef XC_CORE_H
#define XC_CORE_H

#include "xen/version.h"
#include "xg_private.h"
#include "xen/libelf/elfstructs.h"

/* section names */
#define XEN_DUMPCORE_SEC_NOTE                   ".note.Xen"
#define XEN_DUMPCORE_SEC_PRSTATUS               ".xen_prstatus"
#define XEN_DUMPCORE_SEC_SHARED_INFO            ".xen_shared_info"
#define XEN_DUMPCORE_SEC_P2M                    ".xen_p2m"
#define XEN_DUMPCORE_SEC_PFN                    ".xen_pfn"
#define XEN_DUMPCORE_SEC_PAGES                  ".xen_pages"

/* elf note name */
#define XEN_DUMPCORE_ELFNOTE_NAME               "Xen"
/* note numbers are defined in xen/elfnote.h */

struct elfnote {
    uint32_t    namesz; /* Elf_Note note; */
    uint32_t    descsz;
    uint32_t    type;
    char        name[4]; /* sizeof("Xen") = 4
                          * Fotunately this is 64bit aligned so that
                          * we can use same structore for both 32/64bit
                          */
};

struct xen_dumpcore_elfnote_none_desc {
    /* nothing */
};

struct xen_dumpcore_elfnote_header_desc {
    uint64_t    xch_magic;
    uint64_t    xch_nr_vcpus;
    uint64_t    xch_nr_pages;
    uint64_t    xch_page_size;
};

struct xen_dumpcore_elfnote_xen_version_desc {
    uint64_t                    major_version;
    uint64_t                    minor_version;
    xen_extraversion_t          extra_version;
    xen_compile_info_t          compile_info;
    xen_capabilities_info_t     capabilities;
    xen_changeset_info_t        changeset;
    xen_platform_parameters_t   platform_parameters;
    uint64_t                    pagesize;
};

#define XEN_DUMPCORE_FORMAT_VERSION(major, minor)  \
    ((major) << 32) | ((minor) & 0xffffffff)
#define XEN_DUMPCORE_FORMAT_MAJOR(version)      ((major) >> 32)
#define XEN_DUMPCORE_FORMAT_MINOR(version)      ((minor) & 0xffffffff)

#define XEN_DUMPCORE_FORMAT_MAJOR_CURRENT       ((uint64_t)0)
#define XEN_DUMPCORE_FORMAT_MINOR_CURRENT       ((uint64_t)1)
#define XEN_DUMPCORE_FORMAT_VERSION_CURRENT                         \
    XEN_DUMPCORE_FORMAT_VERSION(XEN_DUMPCORE_FORMAT_MAJOR_CURRENT,  \
                                XEN_DUMPCORE_FORMAT_MINOR_CURRENT)

struct xen_dumpcore_elfnote_format_version_desc {
    uint64_t    version;
};


struct xen_dumpcore_elfnote_none {
    struct elfnote                              elfnote;
    struct xen_dumpcore_elfnote_none_desc       none;
};

struct xen_dumpcore_elfnote_header {
    struct elfnote                              elfnote;
    struct xen_dumpcore_elfnote_header_desc     header;
};

struct xen_dumpcore_elfnote_xen_version {
    struct elfnote                                     elfnote;
    struct xen_dumpcore_elfnote_xen_version_desc        xen_version;
};

struct xen_dumpcore_elfnote_format_version {
    struct elfnote                                      elfnote;
    struct xen_dumpcore_elfnote_format_version_desc     format_version;
};

#define XC_CORE_INVALID_PFN     (~(uint64_t)0)
#define XC_CORE_INVALID_GMFN    (~(uint64_t)0)
struct xen_dumpcore_p2m {
    uint64_t    pfn;
    uint64_t    gmfn;
};


struct xc_core_strtab;
struct xc_core_section_headers;

Elf64_Shdr*
xc_core_shdr_get(xc_interface *xch,
                 struct xc_core_section_headers *sheaders);
int
xc_core_shdr_set(xc_interface *xch,
                 Elf64_Shdr *shdr,
                 struct xc_core_strtab *strtab,
                 const char *name, uint32_t type,
                 uint64_t offset, uint64_t size,
                 uint64_t addralign, uint64_t entsize);

struct xc_core_memory_map {
    uint64_t    addr;
    uint64_t    size;
};
typedef struct xc_core_memory_map xc_core_memory_map_t;
int xc_core_arch_auto_translated_physmap(const xc_dominfo_t *info);
struct xc_core_arch_context;
int xc_core_arch_memory_map_get(xc_interface *xch,
                                struct xc_core_arch_context *arch_ctxt,
                                xc_dominfo_t *info, shared_info_any_t *live_shinfo,
                                xc_core_memory_map_t **mapp,
                                unsigned int *nr_entries);
int xc_core_arch_map_p2m(xc_interface *xch, unsigned int guest_width,
                         xc_dominfo_t *info, shared_info_any_t *live_shinfo,
                         xen_pfn_t **live_p2m, unsigned long *pfnp);

int xc_core_arch_map_p2m_writable(xc_interface *xch, unsigned int guest_width,
                                  xc_dominfo_t *info,
                                  shared_info_any_t *live_shinfo,
                                  xen_pfn_t **live_p2m, unsigned long *pfnp);


#if defined (__i386__) || defined (__x86_64__)
# include "xc_core_x86.h"
#elif defined (__arm__) || defined(__aarch64__)
# include "xc_core_arm.h"
#else
# error "unsupported architecture"
#endif

#ifndef ELF_CORE_EFLAGS
# define ELF_CORE_EFLAGS 0
#endif

#endif /* XC_CORE_H */

/*
 * Local variables:
 * mode: C
 * c-file-style: "BSD"
 * c-basic-offset: 4
 * tab-width: 4
 * indent-tabs-mode: nil
 * End:
 */