On Tue, 2006-06-06 at 15:35 +1000, Rusty Russell wrote:
> static inline int get_page(struct page_info *page,
> struct domain *domain)
> +{
> + u32 x, nx, y = page->count_info;
> + u32 d, nd = page->u.inuse._domain;
> + u32 _domain = pickle_domptr(domain);
> +
> + do {
> + x = y;
> + nx = x + 1;
> + d = nd;
> + if ( unlikely((x & PGC_count_mask) == 0) || /* Not allocated? */
> + unlikely((nx & PGC_count_mask) == 0) ) /* Count overflow? */
> + {
> + if ( !_shadow_mode_refcounts(domain) )
> + DPRINTK("Error pfn %lx: rd=%p, od=%p, caf=%08x, taf=%"
> PRtype_info "\n",
> + page_to_pfn(page), domain, unpickle_domptr(d),
> + x, page->u.inuse.type_info);
> + return 0;
> + }
> + if ( unlikely(d != _domain) ) /* Wrong owner? */
> + return try_shared_page(page, domain);
> + __asm__ __volatile__(
> + LOCK_PREFIX "cmpxchg8b %3"
> + : "=d" (nd), "=a" (y), "=c" (d),
> + "=m" (*(volatile u64 *)(&page->count_info))
> + : "0" (d), "1" (x), "c" (d), "b" (nx) );
> + }
> + while ( unlikely(nd != d) || unlikely(y != x) );
> +
> + return 1;
> +}
What is the "=c" (d) there for? And doesn't cmpxchg8b modify the zero
flag---is it necessary to clobber the condition code register?
> diff -r d5f98d23427a xen/include/public/xen.h
> --- a/xen/include/public/xen.h Tue May 30 10:44:23 2006
> +++ b/xen/include/public/xen.h Wed May 31 17:39:54 2006
> @@ -64,6 +64,7 @@
> #define __HYPERVISOR_xenoprof_op 31
> #define __HYPERVISOR_event_channel_op 32
> #define __HYPERVISOR_physdev_op 33
> +#define __HYPERVISOR_share_op 33
Sharing no 33?
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|