From: Gerd Hoffmann <kraxel@suse.de>
To: Zachary Amsden <zach@vmware.com>
Cc: Chris Wright <chrisw@sous-sol.org>,
virtualization@lists.osdl.org,
Christian Limpach <Christian.Limpach@cl.cam.ac.uk>,
xen-devel@lists.xensource.com, linux-kernel@vger.kernel.org,
Ian Pratt <ian.pratt@xensource.com>
Subject: Re: [Xen-devel] Re: [RFC PATCH 07/35] Make LOAD_OFFSET defined by subarch
Date: Thu, 11 May 2006 09:47:17 +0200 [thread overview]
Message-ID: <4462EC05.8060705@suse.de> (raw)
In-Reply-To: <44627733.4010305@vmware.com>
[-- Attachment #1: Type: text/plain, Size: 938 bytes --]
Zachary Amsden wrote:
> Chris Wright wrote:
>> Change LOAD_OFFSET so that the kernel has virtual addresses in the elf
>> header fields.
>>
>> Unlike bare metal kernels, Xen kernels start with virtual address
>> management turned on and thus the addresses to load to should be
>> virtual addresses.
>
> This patch interferes with using a traditional bootloader. The loader
> for Xen should be smarter - it already has VIRT_BASE from the xen_guest
> section, and can simply add the relocation to these header fields. This
> is unnecessary, and one of the many reasons a Xen kernel can't run in a
> normal environment.
I fully agree. Attached below is a patch (against xen unstable
mercurial tree) which does exactly that ;)
cheers,
Gerd
--
Gerd Hoffmann <kraxel@suse.de>
Erst mal heiraten, ein, zwei Kinder, und wenn alles läuft
geh' ich nach drei Jahren mit der Familie an die Börse.
http://www.suse.de/~kraxel/julika-dora.jpeg
[-- Attachment #2: load-offset-submit.diff --]
[-- Type: text/x-patch, Size: 8349 bytes --]
diff -r 1e3977e029fd linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/page.h
--- a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/page.h Mon May 8 18:21:41 2006
+++ b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/page.h Thu May 11 09:10:41 2006
@@ -289,10 +289,6 @@
#endif
#define __KERNEL_START (__PAGE_OFFSET + __PHYSICAL_START)
-#undef LOAD_OFFSET
-#define LOAD_OFFSET 0
-
-
#define PAGE_OFFSET ((unsigned long)__PAGE_OFFSET)
#define VMALLOC_RESERVE ((unsigned long)__VMALLOC_RESERVE)
#define MAXMEM (__FIXADDR_TOP-__PAGE_OFFSET-__VMALLOC_RESERVE)
diff -r 1e3977e029fd linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/page.h
--- a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/page.h Mon May 8 18:21:41 2006
+++ b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/page.h Thu May 11 09:10:41 2006
@@ -260,9 +260,6 @@
#define __PAGE_OFFSET 0xffff880000000000
#endif /* !__ASSEMBLY__ */
-#undef LOAD_OFFSET
-#define LOAD_OFFSET 0
-
/* to align the pointer to the (next) page boundary */
#define PAGE_ALIGN(addr) (((addr)+PAGE_SIZE-1)&PAGE_MASK)
diff -r 1e3977e029fd tools/libxc/xc_load_elf.c
--- a/tools/libxc/xc_load_elf.c Mon May 8 18:21:41 2006
+++ b/tools/libxc/xc_load_elf.c Thu May 11 09:10:41 2006
@@ -59,6 +59,7 @@
Elf_Phdr *phdr;
Elf_Shdr *shdr;
unsigned long kernstart = ~0UL, kernend=0UL;
+ unsigned long sstart, send;
const char *shstrtab;
char *guestinfo=NULL, *p;
int h;
@@ -132,6 +133,8 @@
}
if ( (strstr(guestinfo, "PAE=yes") != NULL) )
dsi->pae_kernel = 1;
+ if ( (p = strstr(guestinfo, "VIRT_BASE=")) != NULL )
+ dsi->virt_base = strtoul(p+10, &p, 0);
break;
}
@@ -153,11 +156,30 @@
phdr = (Elf_Phdr *)(image + ehdr->e_phoff + (h*ehdr->e_phentsize));
if ( !is_loadable_phdr(phdr) )
continue;
- if ( phdr->p_paddr < kernstart )
- kernstart = phdr->p_paddr;
- if ( (phdr->p_paddr + phdr->p_memsz) > kernend )
- kernend = phdr->p_paddr + phdr->p_memsz;
- }
+ sstart = phdr->p_paddr;
+ send = phdr->p_paddr + phdr->p_memsz;
+ /*
+ * bug comparibility alert: old linux kernels used to have
+ * virtual addresses in the paddr headers, whereas newer ones
+ * (since kexec merge, around 2.6.14) correctly use physical
+ * addresses.
+ *
+ * As we want to be able to boot both kinds of kernels we'll
+ * do some guesswork here: If paddr is greater than virt_base
+ * we assume it is a old kernel and use it as-is. Otherwise
+ * we'll add virt_base to get the correct address.
+ */
+ if (sstart < dsi->virt_base) {
+ sstart += dsi->virt_base;
+ send += dsi->virt_base;
+ }
+ if ( sstart < kernstart )
+ kernstart = sstart;
+ if ( send > kernend )
+ kernend = send;
+ }
+ if (dsi->virt_base > 0 && ehdr->e_entry < dsi->virt_base)
+ ehdr->e_entry += dsi->virt_base;
if ( (kernstart > kernend) ||
(ehdr->e_entry < kernstart) ||
@@ -204,7 +226,11 @@
for ( done = 0; done < phdr->p_filesz; done += chunksz )
{
- pa = (phdr->p_paddr + done) - dsi->v_start;
+ /* bug compatibility alert, see above */
+ pa = phdr->p_paddr + done;
+ if (pa > dsi->virt_base)
+ pa -= dsi->virt_base;
+
va = xc_map_foreign_range(
xch, dom, PAGE_SIZE, PROT_WRITE, parray[pa>>PAGE_SHIFT]);
chunksz = phdr->p_filesz - done;
@@ -217,7 +243,11 @@
for ( ; done < phdr->p_memsz; done += chunksz )
{
- pa = (phdr->p_paddr + done) - dsi->v_start;
+ /* bug compatibility alert, see above */
+ pa = phdr->p_paddr + done;
+ if (pa > dsi->virt_base)
+ pa -= dsi->virt_base;
+
va = xc_map_foreign_range(
xch, dom, PAGE_SIZE, PROT_WRITE, parray[pa>>PAGE_SHIFT]);
chunksz = phdr->p_memsz - done;
diff -r 1e3977e029fd tools/libxc/xg_private.h
--- a/tools/libxc/xg_private.h Mon May 8 18:21:41 2006
+++ b/tools/libxc/xg_private.h Thu May 11 09:10:41 2006
@@ -135,6 +135,7 @@
unsigned long v_kernstart;
unsigned long v_kernend;
unsigned long v_kernentry;
+ unsigned long virt_base;
unsigned int load_symtab;
unsigned int pae_kernel;
diff -r 1e3977e029fd xen/common/elf.c
--- a/xen/common/elf.c Mon May 8 18:21:41 2006
+++ b/xen/common/elf.c Thu May 11 09:10:41 2006
@@ -24,6 +24,7 @@
Elf_Phdr *phdr;
Elf_Shdr *shdr;
unsigned long kernstart = ~0UL, kernend=0UL;
+ unsigned long sstart, send;
char *shstrtab, *guestinfo=NULL, *p;
char *elfbase = (char *)dsi->image_addr;
int h;
@@ -76,6 +77,8 @@
return -EINVAL;
}
+ if ( (p = strstr(guestinfo, "VIRT_BASE=")) != NULL )
+ dsi->virt_base = simple_strtoul(p+10, &p, 0);
break;
}
@@ -86,11 +89,40 @@
phdr = (Elf_Phdr *)(elfbase + ehdr->e_phoff + (h*ehdr->e_phentsize));
if ( !is_loadable_phdr(phdr) )
continue;
- if ( phdr->p_paddr < kernstart )
- kernstart = phdr->p_paddr;
- if ( (phdr->p_paddr + phdr->p_memsz) > kernend )
- kernend = phdr->p_paddr + phdr->p_memsz;
- }
+ sstart = phdr->p_paddr;
+ send = phdr->p_paddr + phdr->p_memsz;
+ /*
+ * bug comparibility alert: old linux kernels used to have
+ * virtual addresses in the paddr headers, whereas newer ones
+ * (since kexec merge, around 2.6.14) correctly use physical
+ * addresses.
+ *
+ * As we want to be able to boot both kinds of kernels we'll
+ * do some guesswork here: If paddr is greater than virt_base
+ * we assume it is a old kernel and use it as-is. Otherwise
+ * we'll add virt_base to get the correct address.
+ */
+ if (sstart < dsi->virt_base) {
+ sstart += dsi->virt_base;
+ send += dsi->virt_base;
+ }
+ printk("%s: program hdr: %08lx (=vaddr) "
+ "paddr: %08lx filesz: %08lx memsz: %08lx => %08lx-%08lx\n",
+ __FUNCTION__,
+ (unsigned long)phdr->p_vaddr,
+ (unsigned long)phdr->p_paddr,
+ (unsigned long)phdr->p_filesz,
+ (unsigned long)phdr->p_memsz,
+ sstart, send);
+ if ( sstart < kernstart )
+ kernstart = sstart;
+ if ( send > kernend )
+ kernend = send;
+ }
+ if (dsi->virt_base > 0 && ehdr->e_entry < dsi->virt_base)
+ ehdr->e_entry += dsi->virt_base;
+ printk("%s: entry point: %08lx\n", __FUNCTION__,
+ (unsigned long)ehdr->e_entry);
if ( (kernstart > kernend) ||
(ehdr->e_entry < kernstart) ||
@@ -126,6 +158,7 @@
char *elfbase = (char *)dsi->image_addr;
Elf_Ehdr *ehdr = (Elf_Ehdr *)dsi->image_addr;
Elf_Phdr *phdr;
+ unsigned long vaddr;
int h;
for ( h = 0; h < ehdr->e_phnum; h++ )
@@ -133,11 +166,15 @@
phdr = (Elf_Phdr *)(elfbase + ehdr->e_phoff + (h*ehdr->e_phentsize));
if ( !is_loadable_phdr(phdr) )
continue;
+ vaddr = phdr->p_paddr;
+ if (vaddr < dsi->virt_base)
+ vaddr += dsi->virt_base;
if ( phdr->p_filesz != 0 )
- memcpy((char *)phdr->p_paddr, elfbase + phdr->p_offset,
+ memcpy((char *)vaddr,
+ elfbase + phdr->p_offset,
phdr->p_filesz);
if ( phdr->p_memsz > phdr->p_filesz )
- memset((char *)phdr->p_paddr + phdr->p_filesz, 0,
+ memset((char *)phdr->p_vaddr + phdr->p_filesz, 0,
phdr->p_memsz - phdr->p_filesz);
}
diff -r 1e3977e029fd xen/include/xen/sched.h
--- a/xen/include/xen/sched.h Mon May 8 18:21:41 2006
+++ b/xen/include/xen/sched.h Thu May 11 09:10:41 2006
@@ -172,6 +172,7 @@
unsigned long v_kernstart;
unsigned long v_kernend;
unsigned long v_kernentry;
+ unsigned long virt_base;
/* Initialised by loader: Private. */
unsigned int load_symtab;
unsigned long symtab_addr;
next prev parent reply other threads:[~2006-05-11 7:45 UTC|newest]
Thread overview: 182+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-05-09 8:49 [RFC PATCH 00/35] Xen i386 paravirtualization support Chris Wright
2006-05-09 7:00 ` [RFC PATCH 01/35] Add XEN config options and disable unsupported config options Chris Wright
2006-05-09 10:05 ` Adrian Bunk
2006-05-09 11:06 ` Ed Tomlinson
2006-05-09 12:45 ` Christian Limpach
2006-05-09 23:23 ` Chris Wright
2006-05-09 14:47 ` Daniel Walker
2006-05-09 15:16 ` Christian Limpach
2006-05-09 16:00 ` Daniel Walker
2006-05-09 23:25 ` Chris Wright
2006-05-09 16:42 ` Andi Kleen
2006-05-10 15:36 ` [Xen-devel] " Alan Cox
2006-05-10 15:48 ` Christian Limpach
2006-05-09 7:00 ` [RFC PATCH 02/35] Makefile support to build Xen subarch Chris Wright
2006-05-09 7:00 ` [RFC PATCH 03/35] Add Xen interface header files Chris Wright
2006-05-09 14:49 ` Martin J. Bligh
2006-05-09 17:54 ` Christian Limpach
2006-05-09 15:15 ` Christoph Hellwig
2006-05-09 19:35 ` Hollis Blanchard
2006-05-09 19:48 ` [Xen-devel] " Anthony Liguori
2006-05-09 22:34 ` Christoph Hellwig
2006-05-09 22:36 ` Ingo Oeser
2006-05-09 16:06 ` Daniel Walker
2006-05-09 16:18 ` Christian Limpach
2006-05-09 16:29 ` Daniel Walker
2006-05-09 7:00 ` [RFC PATCH 04/35] Hypervisor " Chris Wright
2006-05-09 22:43 ` Ingo Oeser
2006-05-09 23:01 ` Chris Wright
2006-05-09 7:00 ` [RFC PATCH 05/35] Add sync bitops Chris Wright
2006-05-09 22:56 ` Christoph Lameter
2006-05-09 23:04 ` Andi Kleen
2006-05-09 23:07 ` Chris Wright
2006-05-09 7:00 ` [RFC PATCH 06/35] Add vmlinuz build target Chris Wright
2006-05-09 7:00 ` [RFC PATCH 07/35] Make LOAD_OFFSET defined by subarch Chris Wright
2006-05-10 23:28 ` Zachary Amsden
2006-05-11 7:47 ` Gerd Hoffmann [this message]
2006-05-11 8:51 ` [Xen-devel] " Chris Wright
2006-05-11 9:06 ` Gerd Hoffmann
2006-05-11 16:43 ` Christian Limpach
2006-05-12 6:47 ` [Xen-devel] " Jan Beulich
2006-05-12 8:38 ` Christian Limpach
2006-05-09 7:00 ` [RFC PATCH 08/35] Add Xen-specific memory management definitions Chris Wright
2006-05-09 14:49 ` Martin J. Bligh
2006-05-09 17:44 ` Christian Limpach
2006-05-15 6:44 ` Pete Zaitcev
2006-05-15 7:04 ` Keir Fraser
2006-05-15 8:19 ` Christian Limpach
2006-05-17 16:06 ` Pete Zaitcev
2006-05-18 7:42 ` Chris Wright
2006-05-09 7:00 ` [RFC PATCH 09/35] Change __FIXADDR_TOP to leave room for the hypervisor Chris Wright
2006-05-09 7:00 ` [RFC PATCH 10/35] Add a new head.S start-of-day file for booting on Xen Chris Wright
2006-05-09 7:00 ` [RFC PATCH 11/35] Add support for Xen to entry.S Chris Wright
2006-05-09 16:51 ` Andi Kleen
2006-05-09 7:00 ` [RFC PATCH 12/35] Add start-of-day setup hooks to subarch Chris Wright
2006-05-09 7:00 ` [RFC PATCH 13/35] Support loading an initrd when running on Xen Chris Wright
2006-05-09 7:00 ` [RFC PATCH 14/35] Subarch support for CPUID instruction Chris Wright
2006-05-09 7:00 ` [RFC PATCH 15/35] subarch support for controlling interrupt delivery Chris Wright
2006-05-09 14:49 ` Martin J. Bligh
2006-05-09 14:55 ` Nick Piggin
2006-05-09 15:51 ` Christian Limpach
2006-05-09 16:02 ` Martin J. Bligh
2006-05-09 16:07 ` Andi Kleen
2006-05-09 16:29 ` Christian Limpach
2006-05-09 16:31 ` Andi Kleen
2006-05-09 20:42 ` Christian Limpach
2006-05-09 21:56 ` Andi Kleen
2006-05-10 10:35 ` Christian Limpach
2006-05-10 10:54 ` Andi Kleen
2006-05-09 21:56 ` Chris Wright
2006-05-09 7:00 ` [RFC PATCH 16/35] subarch support for interrupt and exception gates Chris Wright
2006-05-09 11:09 ` Andi Kleen
2006-05-09 12:55 ` Christian Limpach
2006-05-13 12:27 ` Andrew Morton
2006-05-15 18:30 ` Chris Wright
2006-05-09 7:00 ` [RFC PATCH 17/35] Segment register changes for Xen Chris Wright
2006-05-09 7:16 ` Pavel Machek
2006-05-10 20:09 ` Andi Kleen
2006-05-10 20:30 ` Pavel Machek
2006-05-11 10:34 ` Avi Kivity
2006-05-11 10:41 ` Andi Kleen
2006-05-12 0:28 ` [Xen-devel] " Rusty Russell
2006-05-09 16:44 ` Andi Kleen
2006-05-18 20:20 ` Zachary Amsden
2006-05-18 20:41 ` Keir Fraser
2006-05-18 21:26 ` Chris Wright
2006-05-09 7:00 ` [RFC PATCH 18/35] Support gdt/idt/ldt handling on Xen Chris Wright
2006-05-09 7:21 ` Pavel Machek
2006-05-10 20:23 ` Andi Kleen
2006-05-09 14:49 ` Martin J. Bligh
2006-05-09 18:14 ` Christian Limpach
2006-05-09 18:21 ` Martin Bligh
2006-05-09 7:00 ` [RFC PATCH 19/35] subarch support for control register accesses Chris Wright
2006-05-09 7:00 ` [RFC PATCH 20/35] subarch stack pointer update Chris Wright
2006-05-09 7:00 ` [RFC PATCH 21/35] subarch TLB support Chris Wright
2006-05-09 7:00 ` [RFC PATCH 22/35] subarch suport for idle loop (NO_IDLE_HZ for Xen) Chris Wright
2006-05-09 13:21 ` Andi Kleen
2006-05-09 15:13 ` Christian Limpach
2006-05-09 7:00 ` [RFC PATCH 23/35] Increase x86 interrupt vector range Chris Wright
2006-05-09 7:00 ` [RFC PATCH 24/35] Add support for Xen event channels Chris Wright
2006-05-12 21:41 ` Pavel Machek
2006-05-13 12:27 ` Andrew Morton
2006-05-13 13:02 ` Keir Fraser
2006-05-09 7:00 ` [RFC PATCH 25/35] Add Xen time abstractions Chris Wright
2006-05-09 16:23 ` Daniel Walker
2006-05-09 16:38 ` Christian Limpach
2006-05-09 19:27 ` Adrian Bunk
2006-05-09 21:50 ` Andi Kleen
2006-05-09 23:03 ` Ingo Oeser
2006-05-09 23:09 ` Andi Kleen
2006-05-09 23:13 ` Chris Wright
2006-05-12 21:44 ` Pavel Machek
2006-05-09 7:00 ` [RFC PATCH 26/35] Add Xen subarch reboot support Chris Wright
2006-05-09 17:02 ` Andi Kleen
2006-05-12 21:46 ` Pavel Machek
2006-05-12 21:57 ` Chris Wright
2006-05-09 7:00 ` [RFC PATCH 27/35] Add nosegneg capability to the vsyscall page notes Chris Wright
2006-05-09 7:00 ` [RFC PATCH 28/35] add support for Xen feature queries Chris Wright
2006-05-12 21:56 ` Pavel Machek
2006-05-09 7:00 ` [RFC PATCH 29/35] Add the Xen virtual console driver Chris Wright
2006-05-09 13:26 ` Andi Kleen
2006-05-09 15:03 ` Christian Limpach
2006-05-13 12:27 ` Andrew Morton
2006-05-13 12:51 ` Nick Piggin
2006-05-13 14:29 ` Andrew Morton
2006-05-13 14:43 ` Nick Piggin
2006-05-09 7:00 ` [RFC PATCH 30/35] Add apply_to_page_range() function Chris Wright
2006-05-09 7:00 ` [RFC PATCH 31/35] Add Xen grant table support Chris Wright
2006-05-09 7:00 ` [RFC PATCH 32/35] Add Xen driver utility functions Chris Wright
2006-05-09 19:48 ` Greg KH
2006-05-09 21:50 ` Andi Kleen
2006-05-09 7:00 ` [RFC PATCH 33/35] Add the Xenbus sysfs and virtual device hotplug driver Chris Wright
2006-05-09 16:06 ` Alexey Dobriyan
2006-05-09 16:28 ` Andi Kleen
2006-05-09 19:40 ` Greg KH
2006-05-09 21:53 ` Chris Wright
2006-05-09 22:01 ` Greg KH
2006-05-09 22:50 ` Chris Wright
2006-05-09 23:43 ` Anthony Liguori
2006-05-09 19:49 ` Greg KH
2006-05-09 19:58 ` Chris Wright
2006-05-13 12:28 ` Andrew Morton
2006-05-09 7:00 ` [RFC PATCH 34/35] Add the Xen virtual network device driver Chris Wright
2006-05-09 11:55 ` [Xen-devel] " Herbert Xu
2006-05-09 12:43 ` Christian Limpach
2006-05-09 13:01 ` Herbert Xu
2006-05-09 13:14 ` Andi Kleen
2006-05-09 13:16 ` Christian Limpach
2006-05-09 13:26 ` Herbert Xu
2006-05-09 14:00 ` Christian Limpach
2006-05-09 14:30 ` David Boutcher
2006-05-09 23:35 ` Chris Wright
2006-05-09 11:58 ` Christoph Hellwig
2006-05-09 23:37 ` Chris Wright
2006-05-09 18:56 ` Stephen Hemminger
2006-05-09 23:39 ` Chris Wright
2006-05-09 20:25 ` Stephen Hemminger
2006-05-09 20:26 ` Keir Fraser
2006-05-09 20:39 ` Stephen Hemminger
2006-05-09 20:46 ` Roland Dreier
2006-05-10 18:28 ` Andi Kleen
2006-05-11 0:33 ` Herbert Xu
2006-05-11 7:49 ` Keir Fraser
2006-05-11 8:04 ` Herbert Xu
2006-05-11 9:47 ` Andi Kleen
2006-05-11 16:18 ` Stephen Hemminger
2006-05-11 16:48 ` Rick Jones
2006-05-11 16:55 ` Stephen Hemminger
2006-05-11 17:30 ` Andi Kleen
2006-05-09 20:32 ` Chris Wright
2006-05-09 22:41 ` [Xen-devel] " Herbert Xu
2006-05-09 23:51 ` Chris Wright
2006-05-10 6:36 ` Keir Fraser
2006-05-09 7:00 ` [RFC PATCH 35/35] Add Xen virtual block " Chris Wright
2006-05-09 12:01 ` Christoph Hellwig
2006-05-09 14:49 ` [RFC PATCH 00/35] Xen i386 paravirtualization support Martin J. Bligh
2006-05-09 15:07 ` Christoph Hellwig
2006-05-09 15:12 ` Martin J. Bligh
2006-05-09 15:20 ` Andi Kleen
2006-05-09 15:22 ` Christoph Hellwig
2006-05-09 15:45 ` Pekka Enberg
2006-05-14 1:35 ` Andrew Morton
2006-05-15 21:01 ` Chris Wright
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=4462EC05.8060705@suse.de \
--to=kraxel@suse.de \
--cc=Christian.Limpach@cl.cam.ac.uk \
--cc=chrisw@sous-sol.org \
--cc=ian.pratt@xensource.com \
--cc=linux-kernel@vger.kernel.org \
--cc=virtualization@lists.osdl.org \
--cc=xen-devel@lists.xensource.com \
--cc=zach@vmware.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