bitkeeper revision 1.1020 (40debbf6f8HvBW3MU_9c6ljHeGaKeQ)

cleanups.
This commit is contained in:
kaf24@scramble.cl.cam.ac.uk committed 2004-06-27 12:22:14 +00:00
1 parent f6f1621f7e
commit f2744bf1cb
20 files changed
+133 -248

No files matched your search

+8 -6
View File
@@ -6,18 +6,20 @@ OBJS := $(subst pdb-linux.o,,$(OBJS))
OBJS := $(subst pdb-stub.o,,$(OBJS))
endif
# What happens here? We link monitor object files together, starting
# at MONITOR_BASE (a very high address). But bootloader cannot put
# things there, so we initially load at LOAD_BASE. A hacky little
# tool called `elf-reloc' is used to modify segment offsets from
# MONITOR_BASE-relative to LOAD_BASE-relative.
LINK_BASE := 0xFC500000 # Xen is linked here
LOAD_BASE := 0x00100000 # Xen is loaded here
# What happens here? We link object files together, starting at LINK_BASE
# (a very high address). But the bootloader cannot put things there, so we
# initially load at LOAD_BASE. A tool called `elf-reloc' is used to modify
# segment offsets from LINK_BASE-relative to LOAD_BASE-relative.
# (NB. Linux gets round this by turning its image into raw binary, then
# wrapping that with a low-memory bootstrapper.)
default: boot/boot.o $(OBJS)
$(LD) -r -o arch.o $(OBJS)
$(LD) $(LDFLAGS) boot/boot.o $(ALL_OBJS) -o $(TARGET)-syms
objcopy -R .note -R .comment -S $(TARGET)-syms $(TARGET)
$(BASEDIR)/tools/elf-reloc $(MONITOR_BASE) $(LOAD_BASE) $(TARGET)
$(BASEDIR)/tools/elf-reloc $(LINK_BASE) $(LOAD_BASE) $(TARGET)
clean:
rm -f *.o *~ core boot/*.o boot/*~ boot/core
+2 -9
View File
@@ -4,16 +4,9 @@
CC := gcc
LD := ld
# Linker should relocate monitor to this address
MONITOR_BASE := 0xFC500000
# Bootloader should load monitor to this real address
LOAD_BASE := 0x00100000
CFLAGS := -nostdinc -fno-builtin -fno-common -fno-strict-aliasing -O3
CFLAGS += -iwithprefix include -Wall -Werror -DMONITOR_BASE=$(MONITOR_BASE)
CFLAGS += -fomit-frame-pointer -I$(BASEDIR)/include -D__KERNEL__
CFLAGS += -Wno-pointer-arith -Wredundant-decls
CFLAGS += -iwithprefix include -Wall -Werror -fomit-frame-pointer
CFLAGS += -I$(BASEDIR)/include -Wno-pointer-arith -Wredundant-decls
LDFLAGS := -T xen.lds -N
+3 -3
View File
@@ -6,8 +6,8 @@
*/
/*
* The idea for callbacks from monitor -> guest OS
* ===============================================
* The idea for callbacks to guest OSes
* ====================================
*
* First, we require that all callbacks (either via a supplied
* interrupt-descriptor-table, or via the special event or failsafe callbacks
@@ -23,7 +23,7 @@
* If not, we load incorrect SS/ESP values from the TSS (for ring 1 rather
* than the correct ring) and bad things are bound to ensue -- IRET is
* likely to fault, and we may end up killing the domain (no harm can
* come to the hypervisor itself, though).
* come to Xen, though).
*
* When doing a callback, we check if the return CS is in ring 0. If so,
* callback is delayed until next return to ring != 0.
+1 -1
View File
@@ -347,7 +347,7 @@ void *memguard_init(void *heap_start)
PAGE_MASK);
/* Memory guarding is incompatible with super pages. */
for ( i = 0; i < (MAX_MONITOR_ADDRESS >> L2_PAGETABLE_SHIFT); i++ )
for ( i = 0; i < (MAX_XENHEAP_ADDRESS >> L2_PAGETABLE_SHIFT); i++ )
{
l1 = (l1_pgentry_t *)heap_start;
heap_start = (void *)((unsigned long)heap_start + PAGE_SIZE);
+1 -1
View File
@@ -43,7 +43,7 @@ r_base = .
lmsw %ax # into protected mode
jmp flush_instr
flush_instr:
ljmpl $__HYPERVISOR_CS, $(MONITOR_BASE)-__PAGE_OFFSET
ljmpl $__HYPERVISOR_CS, $0x100000 # 1MB
idt_48:
.word 0 # idt limit = 0
+11 -12
View File
@@ -171,14 +171,14 @@ void show_registers(struct pt_regs *regs)
spinlock_t die_lock = SPIN_LOCK_UNLOCKED;
void die(const char * str, struct pt_regs * regs, long err)
void die(const char *str, struct pt_regs * regs, long err)
{
unsigned long flags;
spin_lock_irqsave(&die_lock, flags);
printk("%s: %04lx,%04lx\n", str, err >> 16, err & 0xffff);
show_registers(regs);
spin_unlock_irqrestore(&die_lock, flags);
panic("HYPERVISOR DEATH!!\n");
panic("Fatal crash within Xen.\n");
}
@@ -192,7 +192,7 @@ static inline void do_trap(int trapnr, char *str,
unsigned long fixup;
if (!(regs->xcs & 3))
goto fault_in_hypervisor;
goto xen_fault;
ti = current->thread.traps + trapnr;
gtb->flags = use_error_code ? GTBF_TRAP : GTBF_TRAP_NOCODE;
@@ -203,7 +203,7 @@ static inline void do_trap(int trapnr, char *str,
p->shared_info->vcpu_data[0].evtchn_upcall_mask = 1;
return;
fault_in_hypervisor:
xen_fault:
if ( likely((fixup = search_exception_table(regs->eip)) != 0) )
{
@@ -338,7 +338,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs, long error_code)
return; /* Returns TRUE if fault was handled. */
if ( unlikely(!(regs->xcs & 3)) )
goto fault_in_hypervisor;
goto xen_fault;
ti = p->thread.traps + 14;
gtb->flags = GTBF_TRAP_CR2; /* page fault pushes %cr2 */
@@ -350,7 +350,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs, long error_code)
p->shared_info->vcpu_data[0].evtchn_upcall_mask = 1;
return;
fault_in_hypervisor:
xen_fault:
if ( likely((fixup = search_exception_table(regs->eip)) != 0) )
{
@@ -589,11 +589,10 @@ asmlinkage void do_debug(struct pt_regs *regs, long error_code)
/* Clear TF just for absolute sanity. */
regs->eflags &= ~EF_TF;
/*
* Basically, we ignore watchpoints when they trigger in
* the hypervisor. This may happen when a buffer is passed
* to us which previously had a watchpoint set on it.
* No need to bump EIP; the only faulting trap is an
* instruction breakpoint, which can't happen to us.
* We ignore watchpoints when they trigger within Xen. This may happen
* when a buffer is passed to us which previously had a watchpoint set
* on it. No need to bump EIP; the only faulting trap is an instruction
* breakpoint, which can't happen to us.
*/
return;
}
@@ -717,7 +716,7 @@ void __init trap_init(void)
set_intr_gate(18,&machine_check);
set_intr_gate(19,&simd_coprocessor_error);
/* Only ring 1 can access monitor services. */
/* Only ring 1 can access Xen services. */
_set_gate(idt_table+HYPERCALL_VECTOR,14,1,&hypercall);
/* CPU0 uses the master IDT. */
+78 -98
View File
@@ -48,124 +48,123 @@ struct domain *task_list;
struct domain *do_createdomain(domid_t dom_id, unsigned int cpu)
{
char buf[100];
struct domain *p, **pp;
struct domain *d, **pd;
unsigned long flags;
if ( (p = alloc_domain_struct()) == NULL )
if ( (d = alloc_domain_struct()) == NULL )
return NULL;
atomic_set(&p->refcnt, 1);
atomic_set(&p->pausecnt, 0);
atomic_set(&d->refcnt, 1);
atomic_set(&d->pausecnt, 0);
spin_lock_init(&p->mm.shadow_lock);
spin_lock_init(&d->mm.shadow_lock);
p->domain = dom_id;
p->processor = cpu;
p->create_time = NOW();
d->domain = dom_id;
d->processor = cpu;
d->create_time = NOW();
memcpy(&p->thread, &idle0_task.thread, sizeof(p->thread));
memcpy(&d->thread, &idle0_task.thread, sizeof(d->thread));
if ( p->domain != IDLE_DOMAIN_ID )
if ( d->domain != IDLE_DOMAIN_ID )
{
if ( init_event_channels(p) != 0 )
if ( init_event_channels(d) != 0 )
{
free_domain_struct(p);
free_domain_struct(d);
return NULL;
}
/* We use a large intermediate to avoid overflow in sprintf. */
sprintf(buf, "Domain-%u", dom_id);
strncpy(p->name, buf, MAX_DOMAIN_NAME);
p->name[MAX_DOMAIN_NAME-1] = '\0';
strncpy(d->name, buf, MAX_DOMAIN_NAME);
d->name[MAX_DOMAIN_NAME-1] = '\0';
p->addr_limit = USER_DS;
d->addr_limit = USER_DS;
spin_lock_init(&p->page_list_lock);
INIT_LIST_HEAD(&p->page_list);
p->max_pages = p->tot_pages = 0;
spin_lock_init(&d->page_list_lock);
INIT_LIST_HEAD(&d->page_list);
d->max_pages = d->tot_pages = 0;
p->shared_info = (void *)get_free_page();
memset(p->shared_info, 0, PAGE_SIZE);
SHARE_PFN_WITH_DOMAIN(virt_to_page(p->shared_info), p);
machine_to_phys_mapping[virt_to_phys(p->shared_info) >>
d->shared_info = (void *)get_free_page();
memset(d->shared_info, 0, PAGE_SIZE);
SHARE_PFN_WITH_DOMAIN(virt_to_page(d->shared_info), d);
machine_to_phys_mapping[virt_to_phys(d->shared_info) >>
PAGE_SHIFT] = 0x80000000UL; /* debug */
p->mm.perdomain_pt = (l1_pgentry_t *)get_free_page();
memset(p->mm.perdomain_pt, 0, PAGE_SIZE);
machine_to_phys_mapping[virt_to_phys(p->mm.perdomain_pt) >>
d->mm.perdomain_pt = (l1_pgentry_t *)get_free_page();
memset(d->mm.perdomain_pt, 0, PAGE_SIZE);
machine_to_phys_mapping[virt_to_phys(d->mm.perdomain_pt) >>
PAGE_SHIFT] = 0x0fffdeadUL; /* debug */
/* Per-domain PCI-device list. */
spin_lock_init(&p->pcidev_lock);
INIT_LIST_HEAD(&p->pcidev_list);
spin_lock_init(&d->pcidev_lock);
INIT_LIST_HEAD(&d->pcidev_list);
sched_add_domain(p);
sched_add_domain(d);
write_lock_irqsave(&tasklist_lock, flags);
pp = &task_list; /* NB. task_list is maintained in order of dom_id. */
for ( pp = &task_list; *pp != NULL; pp = &(*pp)->next_list )
if ( (*pp)->domain > p->domain )
pd = &task_list; /* NB. task_list is maintained in order of dom_id. */
for ( pd = &task_list; *pd != NULL; pd = &(*pd)->next_list )
if ( (*pd)->domain > d->domain )
break;
p->next_list = *pp;
*pp = p;
p->next_hash = task_hash[TASK_HASH(dom_id)];
task_hash[TASK_HASH(dom_id)] = p;
d->next_list = *pd;
*pd = d;
d->next_hash = task_hash[TASK_HASH(dom_id)];
task_hash[TASK_HASH(dom_id)] = d;
write_unlock_irqrestore(&tasklist_lock, flags);
}
else
{
sprintf(p->name, "Idle-%d", cpu);
sched_add_domain(p);
sprintf(d->name, "Idle-%d", cpu);
sched_add_domain(d);
}
return p;
return d;
}
struct domain *find_domain_by_id(domid_t dom)
{
struct domain *p;
struct domain *d;
unsigned long flags;
read_lock_irqsave(&tasklist_lock, flags);
p = task_hash[TASK_HASH(dom)];
while ( p != NULL )
d = task_hash[TASK_HASH(dom)];
while ( d != NULL )
{
if ( p->domain == dom )
if ( d->domain == dom )
{
if ( unlikely(!get_domain(p)) )
p = NULL;
if ( unlikely(!get_domain(d)) )
d = NULL;
break;
}
p = p->next_hash;
d = d->next_hash;
}
read_unlock_irqrestore(&tasklist_lock, flags);
return p;
return d;
}
/* return the most recent domain created */
/* Return the most recently created domain. */
struct domain *find_last_domain(void)
{
struct domain *p, *plast;
struct domain *d, *dlast;
unsigned long flags;
read_lock_irqsave(&tasklist_lock, flags);
plast = task_list;
p = plast->next_list;
while ( p != NULL )
dlast = task_list;
d = dlast->next_list;
while ( d != NULL )
{
if ( p->create_time > plast->create_time )
plast = p;
p = p->next_list;
if ( d->create_time > dlast->create_time )
dlast = d;
d = d->next_list;
}
if ( !get_domain(plast) )
plast = NULL;
if ( !get_domain(dlast) )
dlast = NULL;
read_unlock_irqrestore(&tasklist_lock, flags);
return plast;
return dlast;
}
@@ -288,50 +287,31 @@ struct pfn_info *alloc_domain_page(struct domain *d)
void free_domain_page(struct pfn_info *page)
{
unsigned long flags;
unsigned long flags;
int drop_dom_ref;
struct domain *d = page->u.domain;
ASSERT(!in_irq());
/* Deallocation of such pages is handled out of band. */
if ( unlikely(IS_XEN_HEAP_FRAME(page)) )
return;
if ( likely(!IS_XEN_HEAP_FRAME(page)) )
{
page->u.cpu_mask = 0;
page->tlbflush_timestamp = tlbflush_clock;
if ( likely(d != NULL) )
{
page->u.cpu_mask = 1 << d->processor;
/* NB. May recursively lock from domain_relinquish_memory(). */
spin_lock_recursive(&d->page_list_lock);
list_del(&page->list);
if ( unlikely(--d->tot_pages == 0) )
{
spin_unlock_recursive(&d->page_list_lock);
put_domain(d); /* Domain 'd' can disappear now. */
}
else
{
spin_unlock_recursive(&d->page_list_lock);
}
}
page->tlbflush_timestamp = tlbflush_clock;
page->u.cpu_mask = 1 << d->processor;
page->count_and_flags = 0;
/* NB. May recursively lock from domain_relinquish_memory(). */
spin_lock_recursive(&d->page_list_lock);
list_del(&page->list);
drop_dom_ref = (--d->tot_pages == 0);
spin_unlock_recursive(&d->page_list_lock);
if ( drop_dom_ref )
put_domain(d);
spin_lock_irqsave(&free_list_lock, flags);
list_add(&page->list, &free_list);
free_pfns++;
spin_unlock_irqrestore(&free_list_lock, flags);
}
else
{
/*
* No need for a TLB flush. Non-domain pages are always co-held by Xen,
* and the Xen reference is not dropped until the domain is dead.
* DOM0 may hold references, but it's trusted so no need to flush.
*/
page->u.cpu_mask = 0;
page->count_and_flags = 0;
free_page((unsigned long)page_to_virt(page));
}
page->count_and_flags = 0;
spin_lock_irqsave(&free_list_lock, flags);
list_add(&page->list, &free_list);
free_pfns++;
spin_unlock_irqrestore(&free_list_lock, flags);
}
@@ -457,7 +437,7 @@ void domain_destruct(struct domain *d)
destroy_event_channels(d);
free_page((unsigned long)d->mm.perdomain_pt);
UNSHARE_PFN(virt_to_page(d->shared_info));
free_page((unsigned long)d->shared_info);
free_domain_struct(d);
}
+3 -3
View File
@@ -217,15 +217,15 @@ void cmain(unsigned long magic, multiboot_info_t *mbi)
heap_start = memguard_init(&_end);
printk("Xen heap size is %luKB\n",
(MAX_MONITOR_ADDRESS-__pa(heap_start))/1024 );
(MAX_XENHEAP_ADDRESS-__pa(heap_start))/1024 );
if ( ((MAX_MONITOR_ADDRESS-__pa(heap_start))/1024) <= 4096 )
if ( ((MAX_XENHEAP_ADDRESS-__pa(heap_start))/1024) <= 4096 )
{
printk("Xen heap size is too small to safely continue!\n");
for ( ; ; ) ;
}
init_page_allocator(__pa(heap_start), MAX_MONITOR_ADDRESS);
init_page_allocator(__pa(heap_start), MAX_XENHEAP_ADDRESS);
/* Initialise the slab allocator. */
kmem_cache_init();
+3 -50
View File
@@ -32,8 +32,8 @@
* TOT_COUNT is the obvious reference count. It counts all uses of a
* physical page frame by a domain, including uses as a page directory,
* a page table, or simple mappings via a PTE. This count prevents a
* domain from releasing a frame back to the hypervisor's free pool when
* it still holds a reference to it.
* domain from releasing a frame back to the free pool when it still holds
* a reference to it.
*
* TYPE_COUNT is more subtle. A frame can be put to one of three
* mutually-exclusive uses: it might be used as a page directory, or a
@@ -83,48 +83,6 @@
* an application-supplied buffer).
*/
/*
* THE FOLLOWING ARE ISSUES IF GUEST OPERATING SYSTEMS BECOME SMP-CAPABLE.
* -----------------------------------------------------------------------
*
* *********
* UPDATE 15/7/02: Interface has changed --updates now specify physical
* address of page-table entry, rather than specifying a virtual address,
* so hypervisor no longer "walks" the page tables. Therefore the
* solution below cannot work. Another possibility is to add a new entry
* to our "struct page" which says to which top-level page table each
* lower-level page table or writeable mapping belongs. If it belongs to more
* than one, we'd probably just flush on all processors running the domain.
* *********
*
* The problem involves creating new page tables which might be mapped
* writeable in the TLB of another processor. As an example, a domain might be
* running in two contexts (ie. on two processors) simultaneously, using the
* same top-level page table in both contexts. Now, if context 1 sends an
* update request [make page P read-only, add a reference to page P as a page
* table], that will succeed if there was only one writeable mapping of P.
* However, that mapping may persist in the TLB of context 2.
*
* Solution: when installing a new page table, we must flush foreign TLBs as
* necessary. Naive solution is to flush on any processor running our domain.
* Cleverer solution is to flush on any processor running same top-level page
* table, but this will sometimes fail (consider two different top-level page
* tables which have a shared lower-level page table).
*
* A better solution: when squashing a write reference, check how many times
* that lowest-level table entry is referenced by ORing refcounts of tables
* down the page-table hierarchy. If results is != 1, we require flushing all
* instances of current domain if a new table is installed (because the
* lowest-level entry may be referenced by many top-level page tables).
* However, common case will be that result == 1, so we only need to flush
* processors with the same top-level page table. Make choice at
* table-installation time based on a `flush_level' flag, which is
* FLUSH_NONE, FLUSH_PAGETABLE, FLUSH_DOMAIN. A flush reduces this
* to FLUSH_NONE, while squashed write mappings can only promote up
* to more aggressive flush types.
*/
#include <xen/config.h>
#include <xen/init.h>
#include <xen/lib.h>
@@ -186,11 +144,6 @@ static struct {
#define GPS (percpu_info[smp_processor_id()].gps ? : current)
/*
* init_frametable:
* Initialise per-frame memory information. This goes directly after
* MAX_MONITOR_ADDRESS in physical memory.
*/
void __init init_frametable(unsigned long nr_pages)
{
unsigned long mfn;
@@ -619,7 +572,7 @@ static int mod_l2_entry(l2_pgentry_t *pl2e,
if ( unlikely((((unsigned long)pl2e & (PAGE_SIZE-1)) >> 2) >=
DOMAIN_ENTRIES_PER_L2_PAGETABLE) )
{
MEM_LOG("Illegal L2 update attempt in hypervisor area %p", pl2e);
MEM_LOG("Illegal L2 update attempt in Xen-private area %p", pl2e);
return 0;
}
+1 -1
View File
@@ -49,7 +49,7 @@
#define ACPI_USE_SYSTEM_CLIBRARY
#define ACPI_USE_DO_WHILE_0
#ifdef __KERNEL__
#if 1 /*def __KERNEL__*/
#include <xen/config.h>
#include <xen/string.h>
-5
View File
@@ -26,8 +26,6 @@
#ifndef _ASM_ACPI_H
#define _ASM_ACPI_H
#ifdef __KERNEL__
#define COMPILER_DEPENDENT_INT64 long long
#define COMPILER_DEPENDENT_UINT64 unsigned long long
@@ -164,7 +162,4 @@ extern void acpi_reserve_bootmem(void);
#endif /*CONFIG_ACPI_SLEEP*/
#endif /*__KERNEL__*/
#endif /*_ASM_ACPI_H*/
+8 -10
View File
@@ -158,6 +158,10 @@ extern void __out_of_line_bug(int line) __attribute__((noreturn));
#elif defined(__i386__)
/* The following are machine addresses. */
#define MAX_XENHEAP_ADDRESS (12*1024*1024)
#define MAX_DIRECTMAP_ADDRESS (40*1024*1024)
/* Hypervisor owns top 64MB of virtual address space. */
#define HYPERVISOR_VIRT_START (0xFC000000UL)
@@ -167,18 +171,12 @@ extern void __out_of_line_bug(int line) __attribute__((noreturn));
*/
#define RO_MPT_VIRT_START (HYPERVISOR_VIRT_START)
#define RO_MPT_VIRT_END (RO_MPT_VIRT_START + (4*1024*1024))
/*
* Next 12MB is fixed monitor space, which is part of a 40MB direct-mapped
* memory region. The following are machine addresses.
*/
#define MAX_MONITOR_ADDRESS (12*1024*1024)
#define MAX_DIRECTMAP_ADDRESS (40*1024*1024)
/* And the virtual addresses for the direct-map region... */
/* The virtual addresses for the 40MB direct-map region. */
#define DIRECTMAP_VIRT_START (RO_MPT_VIRT_END)
#define DIRECTMAP_VIRT_END (DIRECTMAP_VIRT_START + MAX_DIRECTMAP_ADDRESS)
#define MONITOR_VIRT_START (DIRECTMAP_VIRT_START)
#define MONITOR_VIRT_END (MONITOR_VIRT_START + MAX_MONITOR_ADDRESS)
#define RDWR_MPT_VIRT_START (MONITOR_VIRT_END)
#define XENHEAP_VIRT_START (DIRECTMAP_VIRT_START)
#define XENHEAP_VIRT_END (XENHEAP_VIRT_START + MAX_XENHEAP_ADDRESS)
#define RDWR_MPT_VIRT_START (XENHEAP_VIRT_END)
#define RDWR_MPT_VIRT_END (RDWR_MPT_VIRT_START + (4*1024*1024))
#define FRAMETABLE_VIRT_START (RDWR_MPT_VIRT_END)
#define FRAMETABLE_VIRT_END (DIRECTMAP_VIRT_END)
-16
View File
@@ -1,20 +1,7 @@
#ifndef _I386_STRING_H_
#define _I386_STRING_H_
#ifdef __KERNEL__
#include <xen/config.h>
/*
* On a 486 or Pentium, we are better off not using the
* byte string operations. But on a 386 or a PPro the
* byte string ops are faster than doing it by hand
* (MUCH faster on a Pentium).
*
* Also, the byte strings actually work correctly. Forget
* the i486 routines for now as they may be broken..
*/
#if FIXED_486_STRING && defined(CONFIG_X86_USE_STRING_486)
#include <asm/string-486.h>
#else
/*
* This string-include defines all string functions as inline
@@ -495,7 +482,4 @@ static inline void * memscan(void * addr, int c, size_t size)
return addr;
}
#endif /* CONFIG_X86_USE_STRING_486 */
#endif /* __KERNEL__ */
#endif
-4
View File
@@ -44,8 +44,4 @@ enum EFLAGS {
EF_ID = 0x00200000, /* id */
};
#ifdef __KERNEL__
#define user_mode(regs) ((3 & (regs)->xcs))
#endif
#endif
+2 -2
View File
@@ -81,8 +81,8 @@ struct pt_regs {
#define PTRACE_GETFPXREGS 18
#define PTRACE_SETFPXREGS 19
#if defined(__KERNEL__) && !defined(__ASSEMBLY__)
#define user_mode(regs) (!!((regs)->cs & 3))
#if !defined(__ASSEMBLY__)
#define instruction_pointer(regs) ((regs)->rip)
extern void show_regs(struct pt_regs *);
+3 -6
View File
@@ -20,15 +20,12 @@ struct t_buf {
struct t_rec *data; /* pointer to data area. physical address
* for convenience in user space code */
unsigned long size; /* size of the data area, in t_recs */
unsigned long head; /* array index of the most recent record */
unsigned long size; /* size of the data area, in t_recs */
unsigned long head; /* array index of the most recent record */
#ifdef __KERNEL__
/* Kernel-private elements follow... */
struct t_rec *head_ptr; /* pointer to the head record */
struct t_rec *vdata; /* virtual address pointer to data */
#endif
/* never add anything here - the kernel stuff must be the last elements */
};
#endif /* __HYPERVISOR_IFS_TRACE_H__ */
+9 -9
View File
@@ -86,18 +86,18 @@ struct pfn_info
#define PageSetSlab(page) ((void)0)
#define PageClearSlab(page) ((void)0)
#define IS_XEN_HEAP_FRAME(_pfn) (page_to_phys(_pfn) < MAX_MONITOR_ADDRESS)
#define IS_XEN_HEAP_FRAME(_pfn) (page_to_phys(_pfn) < MAX_XENHEAP_ADDRESS)
#define SHARE_PFN_WITH_DOMAIN(_pfn, _dom) \
do { \
(_pfn)->u.domain = (_dom); \
wmb(); /* install valid domain ptr before updating refcnt. */ \
(_pfn)->count_and_flags = 1; /* Xen holds a writeable reference */ \
(_pfn)->type_and_flags = PGT_writeable_page | PGT_validated | 1; \
#define SHARE_PFN_WITH_DOMAIN(_pfn, _dom) \
do { \
(_pfn)->u.domain = (_dom); \
wmb(); /* install valid domain ptr before updating refcnt. */ \
/* _dom holds an allocation reference */ \
(_pfn)->count_and_flags = PGC_allocated | 1; \
/* The incremented type count is intended to pin to 'writeable'. */ \
(_pfn)->type_and_flags = PGT_writeable_page | PGT_validated | 1; \
} while ( 0 )
#define UNSHARE_PFN(_pfn) put_page_and_type(_pfn)
extern struct pfn_info *frame_table;
extern unsigned long frame_table_size;
extern struct list_head free_list;
-3
View File
@@ -326,8 +326,6 @@
#define PCIIOC_MMAP_IS_MEM (PCIIOC_BASE | 0x02) /* Set mmap state to MEM space. */
#define PCIIOC_WRITE_COMBINE (PCIIOC_BASE | 0x03) /* Enable/disable write-combining. */
#ifdef __KERNEL__
#include <xen/types.h>
#include <xen/config.h>
#include <xen/ioport.h>
@@ -833,5 +831,4 @@ extern int pci_pci_problems;
#define PCIPCI_VSFX 16
#define PCIPCI_ALIMAGIK 32
#endif /* __KERNEL__ */
#endif /* LINUX_PCI_H */
-6
View File
@@ -1,12 +1,7 @@
#ifndef _LINUX_STRING_H_
#define _LINUX_STRING_H_
/* We don't want strings.h stuff being user by user stuff by accident */
#ifdef __KERNEL__
#include <xen/types.h> /* for size_t */
//#include <xen/stddef.h> /* for NULL */
#ifdef __cplusplus
extern "C" {
@@ -86,5 +81,4 @@ extern void * memchr(const void *,int,__kernel_size_t);
}
#endif
#endif
#endif /* _LINUX_STRING_H_ */
-3
View File
@@ -80,9 +80,6 @@ int main(int argc, char **argv)
new_base = strtoul(argv[2], NULL, 16);
image_name = argv[3];
printf("Relocating `%s' from 0x%08lX to 0x%08lX\n",
image_name, old_base, new_base);
fp = fopen(image_name, "rb+");
if ( !fp )
{
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.