mirror of
https://github.com/opnsense/src.git
synced 2026-05-28 04:12:45 -04:00
Compile fixes for xen build.
MFC after: 1 month.
This commit is contained in:
parent
ad8ea5a8b2
commit
f0c468df71
15 changed files with 223 additions and 166 deletions
|
|
@ -276,7 +276,6 @@ xc_attach(device_t dev)
|
|||
NULL, SHUTDOWN_PRI_DEFAULT)) == NULL)
|
||||
printf("xencons: shutdown event registration failed!\n");
|
||||
|
||||
TRACE_EXIT;
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
|
@ -368,7 +367,6 @@ xcopen(struct cdev *dev, int flag, int mode, struct thread *td)
|
|||
if (sc == NULL)
|
||||
return (ENXIO);
|
||||
|
||||
TRACE_ENTER;
|
||||
tp = dev->si_tty;
|
||||
s = spltty();
|
||||
if (!ISTTYOPEN(tp)) {
|
||||
|
|
@ -390,7 +388,6 @@ xcopen(struct cdev *dev, int flag, int mode, struct thread *td)
|
|||
xen_console_up = 1;
|
||||
|
||||
error = (*linesw[tp->t_line]->l_open)(dev, tp);
|
||||
TRACE_EXIT;
|
||||
return error;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -119,7 +119,6 @@ xencons_ring_init(void)
|
|||
"xencons", xencons_handle_input, NULL,
|
||||
INTR_TYPE_MISC | INTR_MPSAFE, NULL);
|
||||
if (err) {
|
||||
XENPRINTF("XEN console request irq failed %i\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -7,23 +7,41 @@
|
|||
#ifndef _XEN_OS_H_
|
||||
#define _XEN_OS_H_
|
||||
#include <machine/param.h>
|
||||
|
||||
#ifdef PAE
|
||||
#define CONFIG_X86_PAE
|
||||
#endif
|
||||
|
||||
#if defined(XEN) && !defined(__XEN_INTERFACE_VERSION__)
|
||||
/*
|
||||
* Can update to a more recent version when we implement
|
||||
* the hypercall page
|
||||
*/
|
||||
#define __XEN_INTERFACE_VERSION__ 0x00030204
|
||||
#endif
|
||||
|
||||
#include <xen/interface/xen.h>
|
||||
|
||||
/* Force a proper event-channel callback from Xen. */
|
||||
void force_evtchn_callback(void);
|
||||
|
||||
#define likely(x) __builtin_expect((x),1)
|
||||
#define unlikely(x) __builtin_expect((x),0)
|
||||
|
||||
#ifndef vtophys
|
||||
#include <vm/vm.h>
|
||||
#include <vm/vm_param.h>
|
||||
#include <vm/pmap.h>
|
||||
#endif
|
||||
|
||||
#ifdef SMP
|
||||
#include <sys/time.h> /* XXX for pcpu.h */
|
||||
#include <sys/pcpu.h> /* XXX for PCPU_GET */
|
||||
extern int gdt_set;
|
||||
extern int gdtset;
|
||||
static inline int
|
||||
smp_processor_id(void)
|
||||
{
|
||||
if (likely(gdt_set))
|
||||
if (likely(gdtset))
|
||||
return PCPU_GET(cpuid);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -92,9 +110,6 @@ extern int preemptable;
|
|||
* the enable bit is set, there may be pending events to be handled.
|
||||
* We may therefore call into do_hypervisor_callback() directly.
|
||||
*/
|
||||
#define likely(x) __builtin_expect((x),1)
|
||||
#define unlikely(x) __builtin_expect((x),0)
|
||||
|
||||
|
||||
|
||||
#define __cli() \
|
||||
|
|
|
|||
|
|
@ -35,12 +35,9 @@
|
|||
|
||||
#ifndef _XEN_XENPMAP_H_
|
||||
#define _XEN_XENPMAP_H_
|
||||
void xen_invlpg(vm_offset_t);
|
||||
void xen_load_cr3(vm_paddr_t);
|
||||
void _xen_queue_pt_update(vm_paddr_t, vm_paddr_t, char *, int);
|
||||
void xen_pt_switch(vm_paddr_t);
|
||||
void xen_set_ldt(vm_paddr_t, unsigned long);
|
||||
void xen_tlb_flush(void);
|
||||
void xen_pgdpt_pin(vm_paddr_t);
|
||||
void xen_pgd_pin(vm_paddr_t);
|
||||
void xen_pgd_unpin(vm_paddr_t);
|
||||
|
|
|
|||
|
|
@ -110,6 +110,7 @@ __FBSDID("$FreeBSD$");
|
|||
#define ACQUIRED 2
|
||||
#define ACQUIRE_PENDING 3
|
||||
|
||||
struct mtx clock_lock;
|
||||
#define RTC_LOCK_INIT \
|
||||
mtx_init(&clock_lock, "clk", NULL, MTX_SPIN | MTX_NOPROFILE)
|
||||
#define RTC_LOCK mtx_lock_spin(&clock_lock)
|
||||
|
|
@ -126,12 +127,9 @@ static int independent_wallclock;
|
|||
static int xen_disable_rtc_set;
|
||||
static u_long cached_gtm; /* cached quotient for TSC -> microseconds */
|
||||
static u_long cyc2ns_scale;
|
||||
static u_char timer2_state = RELEASED;
|
||||
static struct timespec shadow_tv;
|
||||
static uint32_t shadow_tv_version; /* XXX: lazy locking */
|
||||
static uint64_t processed_system_time; /* stime (ns) at last processing. */
|
||||
static struct mtx clock_lock;
|
||||
static int rtc_reg;
|
||||
|
||||
static const u_char daysinmonth[] = {31,28,31,30,31,30,31,31,30,31,30,31};
|
||||
|
||||
|
|
@ -456,12 +454,6 @@ DELAY(int n)
|
|||
}
|
||||
|
||||
|
||||
int
|
||||
sysbeep(int pitch, int period)
|
||||
{
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Restore all the timers non-atomically (XXX: should be atomically).
|
||||
*
|
||||
|
|
@ -529,21 +521,6 @@ startrtclock()
|
|||
* RTC support routines
|
||||
*/
|
||||
|
||||
int
|
||||
rtcin(reg)
|
||||
int reg;
|
||||
{
|
||||
u_char val;
|
||||
|
||||
RTC_LOCK;
|
||||
outb(IO_RTC, reg);
|
||||
inb(0x84);
|
||||
val = inb(IO_RTC + 1);
|
||||
inb(0x84);
|
||||
RTC_UNLOCK;
|
||||
return (val);
|
||||
}
|
||||
|
||||
|
||||
static __inline int
|
||||
readrtc(int port)
|
||||
|
|
@ -551,21 +528,6 @@ readrtc(int port)
|
|||
return(bcd2bin(rtcin(port)));
|
||||
}
|
||||
|
||||
void
|
||||
writertc(int reg, u_char val)
|
||||
{
|
||||
|
||||
RTC_LOCK;
|
||||
if (rtc_reg != reg) {
|
||||
inb(0x84);
|
||||
outb(IO_RTC, reg);
|
||||
rtc_reg = reg;
|
||||
inb(0x84);
|
||||
}
|
||||
outb(IO_RTC + 1, val);
|
||||
inb(0x84);
|
||||
RTC_UNLOCK;
|
||||
}
|
||||
|
||||
#ifdef XEN_PRIVILEGED_GUEST
|
||||
|
||||
|
|
@ -718,7 +680,6 @@ inittodr(time_t base)
|
|||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Write system time back to RTC
|
||||
*/
|
||||
|
|
@ -781,75 +742,8 @@ resettodr()
|
|||
writertc(RTC_STATUSB, RTCSB_24HR);
|
||||
rtcin(RTC_INTR);
|
||||
}
|
||||
#else
|
||||
/*
|
||||
* Initialize the time of day register, based on the time base which is, e.g.
|
||||
* from a filesystem.
|
||||
*/
|
||||
void
|
||||
inittodr(time_t base)
|
||||
{
|
||||
int s, y;
|
||||
struct timespec ts;
|
||||
|
||||
s = splclock();
|
||||
if (base) {
|
||||
ts.tv_sec = base;
|
||||
ts.tv_nsec = 0;
|
||||
tc_setclock(&ts);
|
||||
}
|
||||
|
||||
y = time_second - shadow_tv.tv_sec;
|
||||
if (y <= -2 || y >= 2) {
|
||||
/* badly off, adjust it */
|
||||
ts.tv_sec = shadow_tv.tv_sec;
|
||||
ts.tv_nsec = shadow_tv.tv_nsec * 1000000000; /* :-/ */
|
||||
tc_setclock(&ts);
|
||||
}
|
||||
splx(s);
|
||||
}
|
||||
|
||||
/*
|
||||
* Write system time back to RTC. Not supported for guest domains.
|
||||
*/
|
||||
void
|
||||
resettodr()
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
int
|
||||
acquire_timer2(int mode)
|
||||
{
|
||||
|
||||
if (timer2_state != RELEASED)
|
||||
return (-1);
|
||||
timer2_state = ACQUIRED;
|
||||
|
||||
/*
|
||||
* This access to the timer registers is as atomic as possible
|
||||
* because it is a single instruction. We could do better if we
|
||||
* knew the rate. Use of splclock() limits glitches to 10-100us,
|
||||
* and this is probably good enough for timer2, so we aren't as
|
||||
* careful with it as with timer0.
|
||||
*/
|
||||
outb(TIMER_MODE, TIMER_SEL2 | (mode & 0x3f));
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
release_timer2()
|
||||
{
|
||||
|
||||
if (timer2_state != ACQUIRED)
|
||||
return (-1);
|
||||
timer2_state = RELEASED;
|
||||
outb(TIMER_MODE, TIMER_SEL2 | TIMER_SQWAVE | TIMER_16BIT);
|
||||
return (0);
|
||||
}
|
||||
|
||||
static struct vcpu_set_periodic_timer xen_set_periodic_tick;
|
||||
|
||||
/*
|
||||
|
|
@ -974,3 +868,27 @@ idle_block(void)
|
|||
PANIC_IF(HYPERVISOR_set_timer_op(processed_system_time + NS_PER_TICK) != 0);
|
||||
HYPERVISOR_sched_op(SCHEDOP_block, 0);
|
||||
}
|
||||
|
||||
int
|
||||
timer_spkr_acquire(void)
|
||||
{
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
timer_spkr_release(void)
|
||||
{
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
void
|
||||
timer_spkr_setfreq(int freq)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -159,6 +159,10 @@ IdlePDPT: .long 0 /* phys addr of kernel PDPT */
|
|||
.globl KPTphys
|
||||
#endif
|
||||
KPTphys: .long 0 /* phys addr of kernel page tables */
|
||||
#ifdef SMP
|
||||
.globl gdtset
|
||||
#endif
|
||||
gdtset: .long 0 /* GDT is valid */
|
||||
|
||||
.globl proc0kstack
|
||||
proc0uarea: .long 0 /* address of proc 0 uarea (unused)*/
|
||||
|
|
|
|||
|
|
@ -184,6 +184,9 @@ __FBSDID("$FreeBSD$");
|
|||
#define PV_STAT(x) do { } while (0)
|
||||
#endif
|
||||
|
||||
#define pa_index(pa) ((pa) >> PDRSHIFT)
|
||||
#define pa_to_pvh(pa) (&pv_table[pa_index(pa)])
|
||||
|
||||
/*
|
||||
* Get PDEs and PTEs for user/kernel address space
|
||||
*/
|
||||
|
|
@ -223,6 +226,7 @@ static uma_zone_t pdptzone;
|
|||
* Data for the pv entry allocation mechanism
|
||||
*/
|
||||
static int pv_entry_count = 0, pv_entry_max = 0, pv_entry_high_water = 0;
|
||||
static struct md_page *pv_table;
|
||||
static int shpgperproc = PMAP_SHPGPERPROC;
|
||||
|
||||
struct pv_chunk *pv_chunkbase; /* KVA block for pv_chunks */
|
||||
|
|
@ -270,6 +274,16 @@ SYSCTL_INT(_debug, OID_AUTO, PMAP1unchanged, CTLFLAG_RD,
|
|||
"Number of times pmap_pte_quick didn't change PMAP1");
|
||||
static struct mtx PMAP2mutex;
|
||||
|
||||
SYSCTL_NODE(_vm, OID_AUTO, pmap, CTLFLAG_RD, 0, "VM/pmap parameters");
|
||||
static int pg_ps_enabled;
|
||||
SYSCTL_INT(_vm_pmap, OID_AUTO, pg_ps_enabled, CTLFLAG_RD, &pg_ps_enabled, 0,
|
||||
"Are large page mappings enabled?");
|
||||
|
||||
SYSCTL_INT(_vm_pmap, OID_AUTO, pv_entry_max, CTLFLAG_RD, &pv_entry_max, 0,
|
||||
"Max number of PV entries");
|
||||
SYSCTL_INT(_vm_pmap, OID_AUTO, shpgperproc, CTLFLAG_RD, &shpgperproc, 0,
|
||||
"Page share factor per proc");
|
||||
|
||||
static void free_pv_entry(pmap_t pmap, pv_entry_t pv);
|
||||
static pv_entry_t get_pv_entry(pmap_t locked_pmap, int try);
|
||||
|
||||
|
|
@ -294,6 +308,8 @@ static void pmap_pte_release(pt_entry_t *pte);
|
|||
static int pmap_unuse_pt(pmap_t, vm_offset_t, vm_page_t *);
|
||||
static vm_offset_t pmap_kmem_choose(vm_offset_t addr);
|
||||
static boolean_t pmap_is_prefaultable_locked(pmap_t pmap, vm_offset_t addr);
|
||||
static void pmap_kenter_attr(vm_offset_t va, vm_paddr_t pa, int mode);
|
||||
|
||||
|
||||
#if defined(PAE) && !defined(XEN)
|
||||
static void *pmap_pdpt_allocf(uma_zone_t zone, int bytes, u_int8_t *flags, int wait);
|
||||
|
|
@ -671,8 +687,25 @@ pmap_ptelist_init(vm_offset_t *head, void *base, int npages)
|
|||
void
|
||||
pmap_init(void)
|
||||
{
|
||||
vm_page_t mpte;
|
||||
vm_size_t s;
|
||||
int i, pv_npg;
|
||||
|
||||
|
||||
/*
|
||||
* Initialize the vm page array entries for the kernel pmap's
|
||||
* page table pages.
|
||||
*/
|
||||
for (i = 0; i < nkpt; i++) {
|
||||
mpte = PHYS_TO_VM_PAGE(PTD[i + KPTDI] & PG_FRAME);
|
||||
KASSERT(mpte >= vm_page_array &&
|
||||
mpte < &vm_page_array[vm_page_array_size],
|
||||
("pmap_init: page table page is out of range"));
|
||||
mpte->pindex = i + KPTDI;
|
||||
mpte->phys_addr = PTD[i + KPTDI] & PG_FRAME;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize the address space (zone) for the pv entries. Set a
|
||||
* high water mark so that the system can recover from excessive
|
||||
* numbers of pv entries.
|
||||
|
|
@ -683,6 +716,26 @@ pmap_init(void)
|
|||
pv_entry_max = roundup(pv_entry_max, _NPCPV);
|
||||
pv_entry_high_water = 9 * (pv_entry_max / 10);
|
||||
|
||||
/*
|
||||
* Are large page mappings enabled?
|
||||
*/
|
||||
TUNABLE_INT_FETCH("vm.pmap.pg_ps_enabled", &pg_ps_enabled);
|
||||
|
||||
/*
|
||||
* Calculate the size of the pv head table for superpages.
|
||||
*/
|
||||
for (i = 0; phys_avail[i + 1]; i += 2);
|
||||
pv_npg = round_4mpage(phys_avail[(i - 2) + 1]) / NBPDR;
|
||||
|
||||
/*
|
||||
* Allocate memory for the pv head table for superpages.
|
||||
*/
|
||||
s = (vm_size_t)(pv_npg * sizeof(struct md_page));
|
||||
s = round_page(s);
|
||||
pv_table = (struct md_page *)kmem_alloc(kernel_map, s);
|
||||
for (i = 0; i < pv_npg; i++)
|
||||
TAILQ_INIT(&pv_table[i].pv_list);
|
||||
|
||||
pv_maxchunks = MAX(pv_entry_max / _NPCPV, maxproc);
|
||||
pv_chunkbase = (struct pv_chunk *)kmem_alloc_nofault(kernel_map,
|
||||
PAGE_SIZE * pv_maxchunks);
|
||||
|
|
@ -698,12 +751,6 @@ pmap_init(void)
|
|||
}
|
||||
|
||||
|
||||
SYSCTL_NODE(_vm, OID_AUTO, pmap, CTLFLAG_RD, 0, "VM/pmap parameters");
|
||||
SYSCTL_INT(_vm_pmap, OID_AUTO, pv_entry_max, CTLFLAG_RD, &pv_entry_max, 0,
|
||||
"Max number of PV entries");
|
||||
SYSCTL_INT(_vm_pmap, OID_AUTO, shpgperproc, CTLFLAG_RD, &shpgperproc, 0,
|
||||
"Page share factor per proc");
|
||||
|
||||
/***************************************************
|
||||
* Low level helper routines.....
|
||||
***************************************************/
|
||||
|
|
@ -1171,13 +1218,13 @@ pmap_extract_and_hold(pmap_t pmap, vm_offset_t va, vm_prot_t prot)
|
|||
* Add a wired page to the kva.
|
||||
* Note: not SMP coherent.
|
||||
*/
|
||||
PMAP_INLINE void
|
||||
void
|
||||
pmap_kenter(vm_offset_t va, vm_paddr_t pa)
|
||||
{
|
||||
PT_SET_MA(va, xpmap_ptom(pa)| PG_RW | PG_V | pgeflag);
|
||||
}
|
||||
|
||||
PMAP_INLINE void
|
||||
void
|
||||
pmap_kenter_ma(vm_offset_t va, vm_paddr_t ma)
|
||||
{
|
||||
pt_entry_t *pte;
|
||||
|
|
@ -1187,7 +1234,7 @@ pmap_kenter_ma(vm_offset_t va, vm_paddr_t ma)
|
|||
}
|
||||
|
||||
|
||||
PMAP_INLINE void
|
||||
static __inline void
|
||||
pmap_kenter_attr(vm_offset_t va, vm_paddr_t pa, int mode)
|
||||
{
|
||||
PT_SET_MA(va, pa | PG_RW | PG_V | pgeflag | pmap_cache_bits(mode, 0));
|
||||
|
|
@ -2859,6 +2906,7 @@ pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot)
|
|||
PMAP_UNLOCK(pmap);
|
||||
}
|
||||
|
||||
#ifdef notyet
|
||||
void
|
||||
pmap_enter_quick_range(pmap_t pmap, vm_offset_t *addrs, vm_page_t *pages, vm_prot_t *prots, int count)
|
||||
{
|
||||
|
|
@ -2886,6 +2934,7 @@ pmap_enter_quick_range(pmap_t pmap, vm_offset_t *addrs, vm_page_t *pages, vm_pro
|
|||
|
||||
PMAP_UNLOCK(pmap);
|
||||
}
|
||||
#endif
|
||||
|
||||
static vm_page_t
|
||||
pmap_enter_quick_locked(multicall_entry_t **mclpp, int *count, pmap_t pmap, vm_offset_t va, vm_page_t m,
|
||||
|
|
@ -3412,6 +3461,25 @@ pmap_page_wired_mappings(vm_page_t m)
|
|||
return (count);
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns TRUE if the given page is mapped individually or as part of
|
||||
* a 4mpage. Otherwise, returns FALSE.
|
||||
*/
|
||||
boolean_t
|
||||
pmap_page_is_mapped(vm_page_t m)
|
||||
{
|
||||
struct md_page *pvh;
|
||||
|
||||
if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) != 0)
|
||||
return (FALSE);
|
||||
mtx_assert(&vm_page_queue_mtx, MA_OWNED);
|
||||
if (TAILQ_EMPTY(&m->md.pv_list)) {
|
||||
pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m));
|
||||
return (!TAILQ_EMPTY(&pvh->pv_list));
|
||||
} else
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
/*
|
||||
* Remove all pages from specified address space
|
||||
* this aids process exit speeds. Also, this code
|
||||
|
|
@ -4005,19 +4073,30 @@ pmap_activate(struct thread *td)
|
|||
critical_exit();
|
||||
}
|
||||
|
||||
vm_offset_t
|
||||
pmap_addr_hint(vm_object_t obj, vm_offset_t addr, vm_size_t size)
|
||||
/*
|
||||
* Increase the starting virtual address of the given mapping if a
|
||||
* different alignment might result in more superpage mappings.
|
||||
*/
|
||||
void
|
||||
pmap_align_superpage(vm_object_t object, vm_ooffset_t offset,
|
||||
vm_offset_t *addr, vm_size_t size)
|
||||
{
|
||||
vm_offset_t superpage_offset;
|
||||
|
||||
if ((obj == NULL) || (size < NBPDR) || (obj->type != OBJT_DEVICE)) {
|
||||
return addr;
|
||||
}
|
||||
|
||||
addr = (addr + PDRMASK) & ~PDRMASK;
|
||||
return addr;
|
||||
if (size < NBPDR)
|
||||
return;
|
||||
if (object != NULL && (object->flags & OBJ_COLORED) != 0)
|
||||
offset += ptoa(object->pg_color);
|
||||
superpage_offset = offset & PDRMASK;
|
||||
if (size - ((NBPDR - superpage_offset) & PDRMASK) < NBPDR ||
|
||||
(*addr & PDRMASK) == superpage_offset)
|
||||
return;
|
||||
if ((*addr & PDRMASK) < superpage_offset)
|
||||
*addr = (*addr & ~PDRMASK) + superpage_offset;
|
||||
else
|
||||
*addr = ((*addr + PDRMASK) & ~PDRMASK) + superpage_offset;
|
||||
}
|
||||
|
||||
|
||||
#if defined(PMAP_DEBUG)
|
||||
pmap_pid_dump(int pid)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -69,6 +69,9 @@ __FBSDID("$FreeBSD$");
|
|||
#include <machine/privatespace.h>
|
||||
#endif
|
||||
|
||||
#include <vm/vm_page.h>
|
||||
|
||||
|
||||
#define IDTVEC(name) __CONCAT(X,name)
|
||||
|
||||
extern inthand_t
|
||||
|
|
@ -78,6 +81,7 @@ IDTVEC(div), IDTVEC(dbg), IDTVEC(nmi), IDTVEC(bpt), IDTVEC(ofl),
|
|||
IDTVEC(page), IDTVEC(mchk), IDTVEC(rsvd), IDTVEC(fpu), IDTVEC(align),
|
||||
IDTVEC(xmm), IDTVEC(lcall_syscall), IDTVEC(int0x80_syscall);
|
||||
|
||||
|
||||
int xendebug_flags;
|
||||
start_info_t *xen_start_info;
|
||||
shared_info_t *HYPERVISOR_shared_info;
|
||||
|
|
@ -85,7 +89,6 @@ xen_pfn_t *xen_machine_phys = machine_to_phys_mapping;
|
|||
xen_pfn_t *xen_phys_machine;
|
||||
int preemptable, init_first;
|
||||
extern unsigned int avail_space;
|
||||
extern int gdt_set;
|
||||
|
||||
void ni_cli(void);
|
||||
void ni_sti(void);
|
||||
|
|
@ -183,6 +186,12 @@ printk(const char *fmt, ...)
|
|||
|
||||
|
||||
#define XPQUEUE_SIZE 128
|
||||
|
||||
struct mmu_log {
|
||||
char *file;
|
||||
int line;
|
||||
};
|
||||
|
||||
#ifdef SMP
|
||||
/* per-cpu queues and indices */
|
||||
static mmu_update_t xpq_queue[MAX_VIRT_CPUS][XPQUEUE_SIZE];
|
||||
|
|
@ -191,11 +200,10 @@ static int xpq_idx[MAX_VIRT_CPUS];
|
|||
#define XPQ_QUEUE xpq_queue[vcpu]
|
||||
#define XPQ_IDX xpq_idx[vcpu]
|
||||
#define SET_VCPU() int vcpu = smp_processor_id()
|
||||
static struct mmu_log xpq_queue_log[MAX_VIRT_CPUS][XPQUEUE_SIZE];
|
||||
|
||||
#define XPQ_QUEUE_LOG xpq_queue_log[vcpu]
|
||||
#else
|
||||
struct mmu_log {
|
||||
char *file;
|
||||
int line;
|
||||
};
|
||||
|
||||
static mmu_update_t xpq_queue[XPQUEUE_SIZE];
|
||||
static struct mmu_log xpq_queue_log[XPQUEUE_SIZE];
|
||||
|
|
@ -204,7 +212,8 @@ static int xpq_idx = 0;
|
|||
#define XPQ_QUEUE xpq_queue
|
||||
#define XPQ_IDX xpq_idx
|
||||
#define SET_VCPU()
|
||||
#endif
|
||||
#endif /* !SMP */
|
||||
|
||||
#define XPQ_IDX_INC atomic_add_int(&XPQ_IDX, 1);
|
||||
|
||||
#if 0
|
||||
|
|
@ -233,7 +242,7 @@ _xen_flush_queue(void)
|
|||
int error, i;
|
||||
/* window of vulnerability here? */
|
||||
|
||||
if (__predict_true(gdt_set))
|
||||
if (__predict_true(gdtset))
|
||||
critical_enter();
|
||||
XPQ_IDX = 0;
|
||||
/* Make sure index is cleared first to avoid double updates. */
|
||||
|
|
@ -241,7 +250,7 @@ _xen_flush_queue(void)
|
|||
_xpq_idx, NULL, DOMID_SELF);
|
||||
|
||||
#if 0
|
||||
if (__predict_true(gdt_set))
|
||||
if (__predict_true(gdtset))
|
||||
for (i = _xpq_idx; i > 0;) {
|
||||
if (i >= 3) {
|
||||
CTR6(KTR_PMAP, "mmu:val: %lx ptr: %lx val: %lx ptr: %lx val: %lx ptr: %lx",
|
||||
|
|
@ -261,7 +270,7 @@ _xen_flush_queue(void)
|
|||
}
|
||||
}
|
||||
#endif
|
||||
if (__predict_true(gdt_set))
|
||||
if (__predict_true(gdtset))
|
||||
critical_exit();
|
||||
if (__predict_false(error < 0)) {
|
||||
for (i = 0; i < _xpq_idx; i++)
|
||||
|
|
@ -291,6 +300,8 @@ xen_increment_idx(void)
|
|||
void
|
||||
xen_check_queue(void)
|
||||
{
|
||||
SET_VCPU();
|
||||
|
||||
KASSERT(XPQ_IDX == 0, ("pending operations XPQ_IDX=%d", XPQ_IDX));
|
||||
}
|
||||
|
||||
|
|
@ -304,10 +315,11 @@ xen_invlpg(vm_offset_t va)
|
|||
}
|
||||
|
||||
void
|
||||
xen_load_cr3(vm_paddr_t val)
|
||||
xen_load_cr3(u_int val)
|
||||
{
|
||||
struct mmuext_op op;
|
||||
|
||||
SET_VCPU();
|
||||
|
||||
KASSERT(XPQ_IDX == 0, ("pending operations XPQ_IDX=%d", XPQ_IDX));
|
||||
op.cmd = MMUEXT_NEW_BASEPTR;
|
||||
op.arg1.mfn = xpmap_ptom(val) >> PAGE_SHIFT;
|
||||
|
|
@ -315,41 +327,67 @@ xen_load_cr3(vm_paddr_t val)
|
|||
}
|
||||
|
||||
void
|
||||
_xen_machphys_update(unsigned long mfn, unsigned long pfn, char *file, int line)
|
||||
xen_restore_flags(u_int eflags)
|
||||
{
|
||||
|
||||
if (__predict_true(gdt_set))
|
||||
critical_enter();
|
||||
__restore_flags(eflags);
|
||||
}
|
||||
|
||||
void
|
||||
xen_save_and_cli(u_int *eflags)
|
||||
{
|
||||
|
||||
__save_and_cli((*eflags));
|
||||
}
|
||||
|
||||
void
|
||||
xen_cli(void)
|
||||
{
|
||||
__cli();
|
||||
}
|
||||
|
||||
void
|
||||
xen_sti(void)
|
||||
{
|
||||
__sti();
|
||||
}
|
||||
|
||||
void
|
||||
_xen_machphys_update(unsigned long mfn, unsigned long pfn, char *file, int line)
|
||||
{
|
||||
SET_VCPU();
|
||||
|
||||
if (__predict_true(gdtset))
|
||||
critical_enter();
|
||||
XPQ_QUEUE[XPQ_IDX].ptr = (mfn << PAGE_SHIFT) | MMU_MACHPHYS_UPDATE;
|
||||
XPQ_QUEUE[XPQ_IDX].val = pfn;
|
||||
#ifdef INVARIANTS
|
||||
xpq_queue_log[XPQ_IDX].file = file;
|
||||
xpq_queue_log[XPQ_IDX].line = line;
|
||||
XPQ_QUEUE_LOG[XPQ_IDX].file = file;
|
||||
XPQ_QUEUE_LOG[XPQ_IDX].line = line;
|
||||
#endif
|
||||
xen_increment_idx();
|
||||
if (__predict_true(gdt_set))
|
||||
if (__predict_true(gdtset))
|
||||
critical_exit();
|
||||
}
|
||||
|
||||
void
|
||||
_xen_queue_pt_update(vm_paddr_t ptr, vm_paddr_t val, char *file, int line)
|
||||
{
|
||||
SET_VCPU();
|
||||
|
||||
if (__predict_true(gdt_set))
|
||||
if (__predict_true(gdtset))
|
||||
mtx_assert(&vm_page_queue_mtx, MA_OWNED);
|
||||
|
||||
if (__predict_true(gdt_set))
|
||||
if (__predict_true(gdtset))
|
||||
critical_enter();
|
||||
SET_VCPU();
|
||||
XPQ_QUEUE[XPQ_IDX].ptr = ((uint64_t)ptr) | MMU_NORMAL_PT_UPDATE;
|
||||
XPQ_QUEUE[XPQ_IDX].val = (uint64_t)val;
|
||||
#ifdef INVARIANTS
|
||||
xpq_queue_log[XPQ_IDX].file = file;
|
||||
xpq_queue_log[XPQ_IDX].line = line;
|
||||
XPQ_QUEUE_LOG[XPQ_IDX].file = file;
|
||||
XPQ_QUEUE_LOG[XPQ_IDX].line = line;
|
||||
#endif
|
||||
xen_increment_idx();
|
||||
if (__predict_true(gdt_set))
|
||||
if (__predict_true(gdtset))
|
||||
critical_exit();
|
||||
}
|
||||
|
||||
|
|
@ -742,7 +780,7 @@ shift_phys_machine(unsigned long *phys_machine, int nr_pages)
|
|||
memset(phys_machine, INVALID_P2M_ENTRY, PAGE_SIZE);
|
||||
|
||||
}
|
||||
#endif
|
||||
#endif /* ADD_ISA_HOLE */
|
||||
|
||||
extern unsigned long physfree;
|
||||
void
|
||||
|
|
@ -880,7 +918,8 @@ initvalues(start_info_t *startinfo)
|
|||
|
||||
PT_SET_MA(IdlePDPTnew, IdlePDPTnewma | PG_V);
|
||||
xen_pt_unpin(IdlePDPTma);
|
||||
#endif
|
||||
#endif /* PAE */
|
||||
|
||||
#ifndef PAE
|
||||
xen_queue_pt_update(IdlePTDma + PTDPTDI*sizeof(vm_paddr_t),
|
||||
pdir_shadow_ma | PG_KERNEL);
|
||||
|
|
@ -995,7 +1034,7 @@ initvalues(start_info_t *startinfo)
|
|||
xpmap_ptom(VTOP(cur_space) | PG_V | PG_A));
|
||||
#endif
|
||||
xen_flush_queue();
|
||||
#endif
|
||||
#endif /* 0 */
|
||||
cur_space += PAGE_SIZE;
|
||||
printk("#6\n");
|
||||
|
||||
|
|
@ -1127,7 +1166,8 @@ setup_shutdown_watcher(void *unused)
|
|||
}
|
||||
|
||||
|
||||
SYSINIT(shutdown, SI_SUB_PSEUDO, SI_ORDER_ANY, setup_shutdown_watcher, NULL)
|
||||
SYSINIT(shutdown, SI_SUB_PSEUDO, SI_ORDER_ANY, setup_shutdown_watcher, NULL);
|
||||
|
||||
#ifdef notyet
|
||||
|
||||
static void
|
||||
|
|
@ -1182,7 +1222,7 @@ xen_suspend(void *ignore)
|
|||
cpu_set(i, prev_online_cpus);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
preempt_disable();
|
||||
|
||||
|
|
@ -1264,7 +1304,7 @@ xen_suspend(void *ignore)
|
|||
return err;
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif /* notyet */
|
||||
/********** CODE WORTH KEEPING ABOVE HERE *****************/
|
||||
|
||||
void xen_failsafe_handler(void);
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@ __FBSDID("$FreeBSD$");
|
|||
#include <machine/xen/hypervisor.h>
|
||||
|
||||
|
||||
|
||||
/* linux helper functions that got sucked in
|
||||
* rename and move XXX
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -42,6 +42,8 @@ __FBSDID("$FreeBSD$");
|
|||
#include <sys/types.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/libkern.h>
|
||||
|
||||
#include <machine/xen/xen-os.h>
|
||||
#include <machine/xen/evtchn.h>
|
||||
#include <xen/gnttab.h>
|
||||
#include <machine/xen/xenbus.h>
|
||||
|
|
|
|||
|
|
@ -43,6 +43,7 @@ __FBSDID("$FreeBSD$");
|
|||
|
||||
|
||||
|
||||
#include <machine/xen/xen-os.h>
|
||||
#include <machine/xen/hypervisor.h>
|
||||
#include <machine/xen/evtchn.h>
|
||||
#include <machine/xen/xenbus.h>
|
||||
|
|
|
|||
|
|
@ -45,6 +45,7 @@ __FBSDID("$FreeBSD$");
|
|||
#include <sys/conf.h>
|
||||
|
||||
|
||||
#include <machine/xen/xen-os.h>
|
||||
#include <machine/xen/hypervisor.h>
|
||||
#include <machine/xen/xenbus.h>
|
||||
#include <machine/xen/hypervisor.h>
|
||||
|
|
|
|||
|
|
@ -54,6 +54,7 @@ __FBSDID("$FreeBSD$");
|
|||
#include <sys/bus.h>
|
||||
#include <sys/sx.h>
|
||||
|
||||
#include <machine/xen/xen-os.h>
|
||||
#include <machine/xen/hypervisor.h>
|
||||
#include <machine/xen/xenbus.h>
|
||||
#include <machine/xen/evtchn.h>
|
||||
|
|
|
|||
|
|
@ -56,6 +56,7 @@ __FBSDID("$FreeBSD$");
|
|||
#include <sys/bus.h>
|
||||
#include <sys/sx.h>
|
||||
|
||||
#include <machine/xen/xen-os.h>
|
||||
#include <machine/xen/hypervisor.h>
|
||||
#include <machine/xen/xenbus.h>
|
||||
#include <machine/xen/evtchn.h>
|
||||
|
|
|
|||
|
|
@ -51,6 +51,7 @@ __FBSDID("$FreeBSD$");
|
|||
#include <sys/proc.h>
|
||||
#include <sys/kthread.h>
|
||||
|
||||
#include <machine/xen/xen-os.h>
|
||||
#include <machine/xen/hypervisor.h>
|
||||
#include <machine/xen/xenbus.h>
|
||||
#include <machine/stdarg.h>
|
||||
|
|
|
|||
Loading…
Reference in a new issue