# HG changeset patch
# User kfraser@xxxxxxxxxxxxxxxxxxxxx
# Date 1187103849 -3600
# Node ID 98c2205a7455c2b07cd18ce1f4f39571897d1b28
# Parent 5027cbb9e3ebc5e00c7c4419370bce7a33dadb82
[linux, xencomm] Various fixes common xencomm.c for ia64 xencomm consolidation
- move xen_guest_handle() macro into include/xen/xencomm.h
ia64 also uses it.
- is_kern_addr() is powerpc specific. and other arch doesn't
implement it.
It will be defined in linux/include/asm-ia64/xen/xencomm.h
- fix error recovery path of xencomm_create()
xencomm_free() requires pseudo physical address, not virtual
address.
- add one BUG_ON() to xencomm_create_mini() for alignment
requirement
- use xencomm_pa() instead of __pa() in xencomm_map() and
xencomm_map_no_alloc().
They should work for statically allocated area. On ia64 it isn't
in
straight mapping area so that xencomm_pa() is necessary.
- add gcc bug work around. gcc 4.1.2 doesn't handle properly
variables on stack with align attribute.
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=16660
Signed-off-by: Isaku Yamahata <yamahata@xxxxxxxxxxxxx>)
---
arch/powerpc/platforms/xen/setup.h | 2 --
drivers/xen/core/xencomm.c | 10 +++++++---
include/xen/xencomm.h | 30 ++++++++++++++++++++++++++----
3 files changed, 33 insertions(+), 9 deletions(-)
diff -r 5027cbb9e3eb -r 98c2205a7455 arch/powerpc/platforms/xen/setup.h
--- a/arch/powerpc/platforms/xen/setup.h Mon Aug 13 16:40:36 2007 +0100
+++ b/arch/powerpc/platforms/xen/setup.h Tue Aug 14 16:04:09 2007 +0100
@@ -40,8 +40,6 @@ static inline u64 jiffies_to_ns(unsigned
return j * (1000000000UL / HZ);
}
-#define xen_guest_handle(hnd) ((hnd).p)
-
extern struct page *alloc_foreign_page(void);
extern void free_foreign_page(struct page *page);
diff -r 5027cbb9e3eb -r 98c2205a7455 drivers/xen/core/xencomm.c
--- a/drivers/xen/core/xencomm.c Mon Aug 13 16:40:36 2007 +0100
+++ b/drivers/xen/core/xencomm.c Tue Aug 14 16:04:09 2007 +0100
@@ -23,6 +23,9 @@
#include <asm/page.h>
#include <xen/xencomm.h>
#include <xen/interface/xen.h>
+#ifdef __ia64__
+#include <asm/xen/xencomm.h> /* for is_kern_addr() */
+#endif
static int xencomm_init(struct xencomm_desc *desc,
void *buffer, unsigned long bytes)
@@ -111,7 +114,7 @@ static int xencomm_create(void *buffer,
rc = xencomm_init(desc, buffer, bytes);
if (rc) {
printk("%s failure: %d\n", "xencomm_init", rc);
- xencomm_free(desc);
+ xencomm_free((void *)__pa(desc));
return rc;
}
@@ -146,6 +149,7 @@ static int xencomm_create_mini(void *buf
{
int rc = 0;
struct xencomm_desc *desc;
+ BUG_ON(((unsigned long)xc_desc) % sizeof(*xc_desc) != 0);
desc = (void *)xc_desc;
@@ -170,7 +174,7 @@ void *xencomm_map(void *ptr, unsigned lo
if (rc || desc == NULL)
return NULL;
- return (void *)__pa(desc);
+ return xencomm_pa(desc);
}
void *__xencomm_map_no_alloc(void *ptr, unsigned long bytes,
@@ -188,5 +192,5 @@ void *__xencomm_map_no_alloc(void *ptr,
if (rc)
return NULL;
- return (void *)__pa(desc);
+ return xencomm_pa(desc);
}
diff -r 5027cbb9e3eb -r 98c2205a7455 include/xen/xencomm.h
--- a/include/xen/xencomm.h Mon Aug 13 16:40:36 2007 +0100
+++ b/include/xen/xencomm.h Tue Aug 14 16:04:09 2007 +0100
@@ -35,10 +35,30 @@ extern void *__xencomm_map_no_alloc(void
extern void *__xencomm_map_no_alloc(void *ptr, unsigned long bytes,
struct xencomm_mini *xc_area);
-#define xencomm_map_no_alloc(ptr, bytes) \
- ({struct xencomm_mini xc_desc\
- __attribute__((__aligned__(sizeof(struct xencomm_mini))));\
- __xencomm_map_no_alloc(ptr, bytes, &xc_desc);})
+#if 0
+#define XENCOMM_MINI_ALIGNED(xc_desc, n) \
+ struct xencomm_mini xc_desc ## _base[(n)] \
+ __attribute__((__aligned__(sizeof(struct xencomm_mini)))); \
+ struct xencomm_mini* xc_desc = &xc_desc ## _base[0];
+#else
+/*
+ * gcc bug workaround:
+ * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=16660
+ * gcc doesn't handle properly stack variable with
+ * __attribute__((__align__(sizeof(struct xencomm_mini))))
+ */
+#define XENCOMM_MINI_ALIGNED(xc_desc, n) \
+ unsigned char xc_desc ## _base[((n) + 1 ) * \
+ sizeof(struct xencomm_mini)]; \
+ struct xencomm_mini *xc_desc = (struct xencomm_mini*) \
+ ((unsigned long)xc_desc ## _base + \
+ (sizeof(struct xencomm_mini) - \
+ ((unsigned long)xc_desc ## _base) % \
+ sizeof(struct xencomm_mini)));
+#endif
+#define xencomm_map_no_alloc(ptr, bytes) \
+ ({XENCOMM_MINI_ALIGNED(xc_desc, 1); \
+ __xencomm_map_no_alloc(ptr, bytes, xc_desc);})
/* provided by architecture code: */
extern unsigned long xencomm_vtop(unsigned long vaddr);
@@ -48,4 +68,6 @@ static inline void *xencomm_pa(void *ptr
return (void *)xencomm_vtop((unsigned long)ptr);
}
+#define xen_guest_handle(hnd) ((hnd).p)
+
#endif /* _LINUX_XENCOMM_H_ */
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|