NOTE:
This patch touches powerpc code.
I tested it with cross compilation, but didn't run it on a powerpc machine.
I don't have any access to it.
# HG changeset patch
# User yamahata@xxxxxxxxxxxxx
# Date 1186063791 -32400
# Node ID 5aebf2a66a51b953bfc2c5e502d214ce2f35a0a7
# Parent 8d5ae51a09a66ff450b46ebb09ff99475604ed91
various fixes xencomm.c for ia64 xencomm consolidation
- move xen_guest_handle() macro into include/xen/xencomm.h
It is also ia64 code.
- is_kern_addr() is powerpc specific.
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 on ia64 doesn't handle
properly auto variables with align attribute.
PATCHNAME: fix_xencomm_create_in_common_code
Signed-off-by: Isaku Yamahata <yamahata@xxxxxxxxxxxxx>)
diff -r 8d5ae51a09a6 -r 5aebf2a66a51 arch/powerpc/platforms/xen/setup.h
--- a/arch/powerpc/platforms/xen/setup.h Wed Aug 01 15:16:46 2007 +0100
+++ b/arch/powerpc/platforms/xen/setup.h Thu Aug 02 23:09:51 2007 +0900
@@ -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 8d5ae51a09a6 -r 5aebf2a66a51 drivers/xen/core/xencomm.c
--- a/drivers/xen/core/xencomm.c Wed Aug 01 15:16:46 2007 +0100
+++ b/drivers/xen/core/xencomm.c Thu Aug 02 23:09:51 2007 +0900
@@ -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 8d5ae51a09a6 -r 5aebf2a66a51 include/xen/xencomm.h
--- a/include/xen/xencomm.h Wed Aug 01 15:16:46 2007 +0100
+++ b/include/xen/xencomm.h Thu Aug 02 23:09:51 2007 +0900
@@ -35,10 +35,29 @@ 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);})
+#ifdef __ia64__
+/*
+ * workaround:
+ * gcc 4.1.2 on ia64 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)));
+#else
+#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];
+#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 +67,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_ */
--
yamahata
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|