From: Gerd Hoffmann <kraxel@suse.de>
To: Chuck Short <zulcss@gmail.com>
Cc: Virtualization Mailing List <virtualization@lists.osdl.org>
Subject: Re: paravirt & xen & SMP
Date: Wed, 10 Jan 2007 17:27:15 +0100 [thread overview]
Message-ID: <45A513E3.3010104@suse.de> (raw)
In-Reply-To: <27c823430701100818i5ec586ffm65d5678f4fe1bbea@mail.gmail.com>
[-- Attachment #1: Type: text/plain, Size: 372 bytes --]
Chuck Short wrote:
> Hi Gerd,
>
> I was wondering how you got it to work this far?
It's almost at userspace now (virtual machine is UP only, kernel built
with CONFIG_SMP=y though), just by avoiding multicalls in the boot path
before pda being setup. Patch attached, goes on top of the complete
paravirt patch queue.
cheers,
Gerd
--
Gerd Hoffmann <kraxel@suse.de>
[-- Attachment #2: kraxel.buildfix --]
[-- Type: text/plain, Size: 3854 bytes --]
---
arch/i386/paravirt-xen/enlighten.c | 28 +++++++++++++++++++++++++++-
drivers/Makefile | 2 +-
include/asm-i386/paravirt.h | 20 ++++++++++----------
3 files changed, 38 insertions(+), 12 deletions(-)
Index: paravirt-2.6.20-rc4-hg691/include/asm-i386/paravirt.h
===================================================================
--- paravirt-2.6.20-rc4-hg691.orig/include/asm-i386/paravirt.h
+++ paravirt-2.6.20-rc4-hg691/include/asm-i386/paravirt.h
@@ -493,6 +493,16 @@ static inline void apic_write_atomic(uns
paravirt_ops.apic_write_atomic(reg,v);
}
unsigned long apic_read(unsigned long reg);
+
+static inline void setup_boot_clock(void)
+{
+ paravirt_ops.setup_boot_clock();
+}
+
+static inline void setup_secondary_clock(void)
+{
+ paravirt_ops.setup_secondary_clock();
+}
#endif
/* These will be unexported once raid6 is fixed... */
@@ -525,16 +535,6 @@ static inline void pmd_clear(pmd_t *pmdp
{
paravirt_ops.pmd_clear(pmdp);
}
-
-static inline void setup_boot_clock(void)
-{
- paravirt_ops.setup_boot_clock();
-}
-
-static inline void setup_secondary_clock(void)
-{
- paravirt_ops.setup_secondary_clock();
-}
#endif
/* Lazy mode for batching updates / context switch */
Index: paravirt-2.6.20-rc4-hg691/arch/i386/paravirt-xen/enlighten.c
===================================================================
--- paravirt-2.6.20-rc4-hg691.orig/arch/i386/paravirt-xen/enlighten.c
+++ paravirt-2.6.20-rc4-hg691/arch/i386/paravirt-xen/enlighten.c
@@ -240,6 +240,25 @@ static fastcall void xen_load_gdt(const
xen_mc_flush();
}
+static fastcall void xen_load_gdt_boot(const struct Xgt_desc_struct *dtr)
+{
+ unsigned long va;
+ int f;
+ unsigned size = dtr->size + 1;
+ unsigned long frames[16];
+
+ BUG_ON(size > 16*PAGE_SIZE);
+
+ for (va = dtr->address, f = 0;
+ va < dtr->address + size;
+ va += PAGE_SIZE, f++) {
+ frames[f] = virt_to_mfn(va);
+ make_lowmem_page_readonly((void *)va);
+ }
+
+ HYPERVISOR_set_gdt(frames, size/8);
+}
+
static void load_TLS_descriptor(struct thread_struct *t,
unsigned int cpu, unsigned int i)
{
@@ -522,6 +541,7 @@ static fastcall void xen_alloc_pd(u32 pf
static fastcall void xen_release_pd(u32 pfn)
{
make_lowmem_page_readwrite(__va(PFN_PHYS(pfn)));
+ memset(__va(PFN_PHYS(pfn)), 0, PAGE_SIZE);
}
static fastcall void xen_release_pt(u32 pfn)
@@ -757,12 +777,18 @@ static asmlinkage void __init xen_start_
/* set up the boot-time gdt and segments */
init_mm.pgd = pgd; /* use the Xen pagetables to start */
- xen_load_gdt(&cpu_gdt_descr);
+ xen_load_gdt_boot(&cpu_gdt_descr);
/* set up PDA descriptor */
pack_descriptor(&low, &high, (unsigned)&boot_pda, sizeof(boot_pda)-1,
0x80 | DESCTYPE_S | 0x02, 0);
+#if 0
xen_write_gdt_entry(cpu_gdt_table, GDT_ENTRY_PDA, low, high);
+#else
+ if (HYPERVISOR_update_descriptor(virt_to_machine(cpu_gdt_table + GDT_ENTRY_PDA).maddr,
+ (u64)high << 32 | low))
+ BUG();
+#endif
/* set up %gs and init Xen parts of the PDA */
asm volatile("mov %0, %%gs" : : "r" (__KERNEL_PDA) : "memory");
Index: paravirt-2.6.20-rc4-hg691/drivers/Makefile
===================================================================
--- paravirt-2.6.20-rc4-hg691.orig/drivers/Makefile
+++ paravirt-2.6.20-rc4-hg691/drivers/Makefile
@@ -18,6 +18,7 @@ obj-$(CONFIG_ARM_AMBA) += amba/
# char/ comes before serial/ etc so that the VT console is the boot-time
# default.
obj-y += char/
+obj-$(CONFIG_XEN) += xen/
obj-$(CONFIG_CONNECTOR) += connector/
@@ -31,7 +32,6 @@ obj-y += base/ block/ misc/ mfd/ net/
obj-$(CONFIG_NUBUS) += nubus/
obj-$(CONFIG_ATM) += atm/
obj-$(CONFIG_PPC_PMAC) += macintosh/
-obj-$(CONFIG_XEN) += xen/
obj-$(CONFIG_IDE) += ide/
obj-$(CONFIG_FC4) += fc4/
obj-$(CONFIG_SCSI) += scsi/
[-- Attachment #3: Type: text/plain, Size: 165 bytes --]
_______________________________________________
Virtualization mailing list
Virtualization@lists.osdl.org
https://lists.osdl.org/mailman/listinfo/virtualization
next prev parent reply other threads:[~2007-01-10 16:27 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-01-10 15:23 paravirt & xen & SMP Gerd Hoffmann
[not found] ` <27c823430701100818i5ec586ffm65d5678f4fe1bbea@mail.gmail.com>
2007-01-10 16:27 ` Gerd Hoffmann [this message]
2007-01-10 18:48 ` Jeremy Fitzhardinge
2007-01-11 14:41 ` Gerd Hoffmann
2007-01-11 23:13 ` Jeremy Fitzhardinge
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=45A513E3.3010104@suse.de \
--to=kraxel@suse.de \
--cc=virtualization@lists.osdl.org \
--cc=zulcss@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).