From mboxrd@z Thu Jan 1 00:00:00 1970 From: Gerd Knorr Subject: Re: PAE xen + linux kernel boots ... Date: Sun, 1 May 2005 01:01:54 +0200 Message-ID: <20050430230154.GD8637@bytesex> References: <20050425172624.GB22076@bytesex> <87ll74o29m.fsf@bytesex.org> <20050430090117.GC16883@us.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Return-path: Content-Disposition: inline In-Reply-To: <20050430090117.GC16883@us.ibm.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: Scott Parish Cc: xen-devel@lists.xensource.com List-Id: xen-devel@lists.xenproject.org > The hypervisor was taking a pagefault in ptwr_emulated_update() when > pl1e (a map_domain_mem() mapped page) was dereferenced to be > copied. pl1e is a 64 bit type with pae, but only the first 4 bytes > were getting mapped, and there was a case where pl1e would straddle > a page boundary, Huh? page table entries must be 8-byte aligned, so they never ever can cross a page border. Must be something else. > -void *map_domain_mem(unsigned long pa) > +void *map_domain_mem(unsigned long long pa) Hmm, I guess the most sane approach is to add a new type for physical addresses, simply using "unsigned long long" isn't a good idea ... > - idx = map_idx = (map_idx + 1) & (MAPCACHE_ENTRIES - 1); > + idx = map_idx = (map_idx + 2) & (MAPCACHE_ENTRIES - 1); > cache[idx] = l1e_create_phys(pa, __PAGE_HYPERVISOR); > + cache[idx + 1] = l1e_create_phys(pa + sizeof(u32), __PAGE_HYPERVISOR); That looks a bit fishy, like hiding a bug somewhere else. And most likely will break for non-pae ... Gerd -- #define printk(args...) fprintf(stderr, ## args)