|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [RFC] libxc: Add trusted decompressors
On Tue, 2013-02-26 at 22:32 +0000, Bastian Blank wrote:
> Add trusted decompressors based on hypervisor code.
> This are used in mini-os by pv-grub.
I think this is a reasonably pragmatic way to arrange the build.
I'm not sure "trusted" is quite the right term though, these aren't
really any more trustworthy than the library supplied ones -- they are
just more suitable for a mini-os environment.
I can't think of a better term though...
>
> Signed-off-by: Bastian Blank <waldi@xxxxxxxxxx>
>
> diff -r efdc4bbfdd20 stubdom/Makefile
> --- a/stubdom/Makefile Tue Feb 26 19:42:36 2013 +0100
> +++ b/stubdom/Makefile Tue Feb 26 23:20:22 2013 +0100
> @@ -328,7 +328,7 @@
> .PHONY: libxc
> libxc: libxc-$(XEN_TARGET_ARCH)/libxenctrl.a
> libxc-$(XEN_TARGET_ARCH)/libxenguest.a
> libxc-$(XEN_TARGET_ARCH)/libxenctrl.a: cross-zlib
> - CPPFLAGS="$(TARGET_CPPFLAGS)" CFLAGS="$(TARGET_CFLAGS)" $(MAKE)
> DESTDIR= -C libxc-$(XEN_TARGET_ARCH)
> + CPPFLAGS="$(TARGET_CPPFLAGS)" CFLAGS="$(TARGET_CFLAGS)" $(MAKE)
> DESTDIR= CONFIG_LIBXC_MINIOS=y -C libxc-$(XEN_TARGET_ARCH)
>
> libxc-$(XEN_TARGET_ARCH)/libxenguest.a:
> libxc-$(XEN_TARGET_ARCH)/libxenctrl.a
>
> diff -r efdc4bbfdd20 tools/libxc/Makefile
> --- a/tools/libxc/Makefile Tue Feb 26 19:42:36 2013 +0100
> +++ b/tools/libxc/Makefile Tue Feb 26 23:20:22 2013 +0100
> @@ -58,7 +58,6 @@
> GUEST_SRCS-y += xc_dom_core.c xc_dom_boot.c
> GUEST_SRCS-y += xc_dom_elfloader.c
> GUEST_SRCS-$(CONFIG_X86) += xc_dom_bzimageloader.c
> -GUEST_SRCS-$(CONFIG_X86) += xc_dom_decompress.c
> GUEST_SRCS-$(CONFIG_ARM) += xc_dom_armzimageloader.c
> GUEST_SRCS-y += xc_dom_binloader.c
> GUEST_SRCS-y += xc_dom_compat_linux.c
> @@ -69,6 +68,16 @@
> GUEST_SRCS-$(CONFIG_ARM) += xc_dom_arm.c
> GUEST_SRCS-$(CONFIG_ARM) += xc_hvm_build_arm.c
>
> +ifeq ($(CONFIG_LIBXC_MINIOS),y)
> +GUEST_SRCS-y += xc_dom_decompress_trusted.c
> +GUEST_SRCS-y += xc_dom_decompress_trusted_bzip2.c
> +GUEST_SRCS-y += xc_dom_decompress_trusted_lzma.c
> +GUEST_SRCS-y += xc_dom_decompress_trusted_lzo1x.c
> +GUEST_SRCS-y += xc_dom_decompress_trusted_xz.c
> +else
> +GUEST_SRCS-y += xc_dom_decompress.c
> +endif
> +
> OSDEP_SRCS-y += xenctrl_osdep_ENOSYS.c
>
> -include $(XEN_TARGET_ARCH)/Makefile
> diff -r efdc4bbfdd20 tools/libxc/xc_dom_decompress_trusted.c
> --- /dev/null Thu Jan 01 00:00:00 1970 +0000
> +++ b/tools/libxc/xc_dom_decompress_trusted.c Tue Feb 26 23:20:22 2013 +0100
> @@ -0,0 +1,49 @@
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <inttypes.h>
> +
> +#include "xg_private.h"
> +#include "xc_dom_decompress_trusted.h"
> +
> +struct xc_dom_image *trusted_dom;
> +static unsigned char *output_blob;
> +static unsigned int output_size;
> +
> +static void trusted_error(const char *msg)
> +{
> + xc_dom_panic(trusted_dom->xch, XC_INVALID_KERNEL, "%s", msg);
> +}
> +
> +static int trusted_flush(void *src, unsigned int size)
> +{
> + void *n = realloc(output_blob, output_size + size);
> + if (!n)
> + return -1;
> + output_blob = n;
> +
> + memcpy(&output_blob[output_size], src, size);
> + output_size += size;
> + return size;
> +}
> +
> +int xc_dom_decompress_trusted_decompress(
> + decompress_fn fn, struct xc_dom_image *dom, void **blob, size_t *size)
> +{
> + int ret;
> +
> + trusted_dom = dom;
> + output_blob = NULL;
> + output_size = 0;
> +
> + ret = fn(dom->kernel_blob, dom->kernel_size, NULL, trusted_flush, NULL,
> NULL, trusted_error);
> +
> + if (ret)
> + free(output_blob);
> + else {
> + *blob = output_blob;
> + *size = output_size;
> + }
> +
> + return ret;
> +}
> +
> diff -r efdc4bbfdd20 tools/libxc/xc_dom_decompress_trusted.h
> --- /dev/null Thu Jan 01 00:00:00 1970 +0000
> +++ b/tools/libxc/xc_dom_decompress_trusted.h Tue Feb 26 23:20:22 2013 +0100
> @@ -0,0 +1,12 @@
> +#include "xc_dom.h"
> +
> +typedef int decompress_fn(unsigned char *inbuf, unsigned int len,
> + int (*fill)(void*, unsigned int),
> + int (*flush)(void*, unsigned int),
> + unsigned char *outbuf, unsigned int *posp,
> + void (*error)(const char *x));
> +
> +int xc_dom_decompress_trusted_decompress(
> + decompress_fn fn, struct xc_dom_image *dom, void **blob, size_t *size)
> + __attribute__((visibility("hidden")));
> +
> diff -r efdc4bbfdd20 tools/libxc/xc_dom_decompress_trusted_bzip2.c
> --- /dev/null Thu Jan 01 00:00:00 1970 +0000
> +++ b/tools/libxc/xc_dom_decompress_trusted_bzip2.c Tue Feb 26 23:20:22
> 2013 +0100
> @@ -0,0 +1,14 @@
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <inttypes.h>
> +
> +#include "xg_private.h"
> +#include "xc_dom_decompress_trusted.h"
> +
> +#include "../../xen/common/bunzip2.c"
> +
> +int xc_try_bzip2_decode(
> + struct xc_dom_image *dom, void **blob, size_t *size)
> +{
> + return xc_dom_decompress_trusted_decompress(bunzip2, dom, blob, size);
> +}
> diff -r efdc4bbfdd20 tools/libxc/xc_dom_decompress_trusted_lzma.c
> --- /dev/null Thu Jan 01 00:00:00 1970 +0000
> +++ b/tools/libxc/xc_dom_decompress_trusted_lzma.c Tue Feb 26 23:20:22
> 2013 +0100
> @@ -0,0 +1,14 @@
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <inttypes.h>
> +
> +#include "xg_private.h"
> +#include "xc_dom_decompress_trusted.h"
> +
> +#include "../../xen/common/unlzma.c"
> +
> +int xc_try_lzma_decode(
> + struct xc_dom_image *dom, void **blob, size_t *size)
> +{
> + return xc_dom_decompress_trusted_decompress(unlzma, dom, blob, size);
> +}
> diff -r efdc4bbfdd20 tools/libxc/xc_dom_decompress_trusted_lzo1x.c
> --- /dev/null Thu Jan 01 00:00:00 1970 +0000
> +++ b/tools/libxc/xc_dom_decompress_trusted_lzo1x.c Tue Feb 26 23:20:22
> 2013 +0100
> @@ -0,0 +1,15 @@
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <inttypes.h>
> +
> +#include "xg_private.h"
> +#include "xc_dom_decompress_trusted.h"
> +
> +#include "../../xen/common/lzo.c"
> +#include "../../xen/common/unlzo.c"
> +
> +int xc_try_lzo1x_decode(
> + struct xc_dom_image *dom, void **blob, size_t *size)
> +{
> + return xc_dom_decompress_trusted_decompress(unlzo, dom, blob, size);
> +}
> diff -r efdc4bbfdd20 tools/libxc/xc_dom_decompress_trusted_xz.c
> --- /dev/null Thu Jan 01 00:00:00 1970 +0000
> +++ b/tools/libxc/xc_dom_decompress_trusted_xz.c Tue Feb 26 23:20:22
> 2013 +0100
> @@ -0,0 +1,17 @@
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <inttypes.h>
> +
> +#include "xg_private.h"
> +#include "xc_dom_decompress_trusted.h"
> +
> +// TODO
> +#define XZ_DEC_X86
> +
> +#include "../../xen/common/unxz.c"
> +
> +int xc_try_xz_decode(
> + struct xc_dom_image *dom, void **blob, size_t *size)
> +{
> + return xc_dom_decompress_trusted_decompress(unxz, dom, blob, size);
> +}
> diff -r efdc4bbfdd20 xen/common/decompress.h
> --- a/xen/common/decompress.h Tue Feb 26 19:42:36 2013 +0100
> +++ b/xen/common/decompress.h Tue Feb 26 23:20:22 2013 +0100
> @@ -1,3 +1,5 @@
> +#ifdef __XEN__
> +
> #include <xen/config.h>
> #include <xen/cache.h>
> #include <xen/decompress.h>
> @@ -15,3 +17,14 @@
>
> #define large_malloc xmalloc_bytes
> #define large_free xfree
> +
> +#else
> +
> +#define STATIC static
> +#define INIT
> +#define INITDATA
> +
> +#define large_malloc malloc
> +#define large_free free
> +
> +#endif
> diff -r efdc4bbfdd20 xen/common/lzo.c
> --- a/xen/common/lzo.c Tue Feb 26 19:42:36 2013 +0100
> +++ b/xen/common/lzo.c Tue Feb 26 23:20:22 2013 +0100
> @@ -68,7 +68,19 @@
> * Richard Purdie <rpurdie@xxxxxxxxxxxxxx>
> */
>
> +#ifndef __MINIOS__
> #include <xen/types.h>
> +#else
> +#include <stdint.h>
> +
> +typedef uint32_t u32;
> +typedef uint16_t u16;
> +
> +#define likely(a) a
> +#define noinline
> +#define unlikely(a) a
> +#endif
> +
> #include <xen/lzo.h>
> #define get_unaligned(_p) (*(_p))
> #define put_unaligned(_val,_p) (*(_p)=_val)
> diff -r efdc4bbfdd20 xen/common/unlzma.c
> --- a/xen/common/unlzma.c Tue Feb 26 19:42:36 2013 +0100
> +++ b/xen/common/unlzma.c Tue Feb 26 23:20:22 2013 +0100
> @@ -54,7 +54,9 @@
> * Copyright (c) 1999-2005 Igor Pavlov
> */
>
> +#ifndef __MINIOS__
> #include <xen/compiler.h>
> +#endif
>
> #define LZMA_IOBUF_SIZE 0x10000
>
> diff -r efdc4bbfdd20 xen/common/unlzo.c
> --- a/xen/common/unlzo.c Tue Feb 26 19:42:36 2013 +0100
> +++ b/xen/common/unlzo.c Tue Feb 26 23:20:22 2013 +0100
> @@ -32,7 +32,43 @@
>
> #include "decompress.h"
> #include <xen/lzo.h>
> +
> +#ifndef __MINIOS__
> #include <asm/byteorder.h>
> +#else
> +#include <endian.h>
> +#include <stdint.h>
> +
> +typedef uint8_t u8;
> +typedef uint16_t u16;
> +typedef uint32_t u32;
> +
> +static inline u16 be16_to_cpup(const u16 *p)
> +{
> + u16 v = *p;
> +#if BYTE_ORDER == LITTLE_ENDIAN
> + return (((v & 0x00ffU) << 8) |
> + ((v & 0xff00U) >> 8));
> +#else
> + return v;
> +#endif
> +}
> +
> +static inline u32 be32_to_cpup(const u32 *p)
> +{
> + u32 v = *p;
> +#if BYTE_ORDER == LITTLE_ENDIAN
> + return (((v & 0x000000ffUL) << 24) |
> + ((v & 0x0000ff00UL) << 8) |
> + ((v & 0x00ff0000UL) >> 8) |
> + ((v & 0xff000000UL) >> 24));
> +#else
> + return v;
> +#endif
> +}
> +
> +#define unlikely(a) a
> +#endif
>
> #if 1 /* ndef CONFIG_??? */
> static inline u16 INIT get_unaligned_be16(void *p)
> diff -r efdc4bbfdd20 xen/common/xz/private.h
> --- a/xen/common/xz/private.h Tue Feb 26 19:42:36 2013 +0100
> +++ b/xen/common/xz/private.h Tue Feb 26 23:20:22 2013 +0100
> @@ -10,8 +10,53 @@
> #ifndef XZ_PRIVATE_H
> #define XZ_PRIVATE_H
>
> +#ifndef __MINIOS__
> #include <xen/kernel.h>
> #include <asm/byteorder.h>
> +#else
> +#include <endian.h>
> +#include <stddef.h>
> +#include <stdint.h>
> +
> +typedef char bool_t;
> +typedef uint8_t u8;
> +typedef uint16_t u16;
> +typedef uint32_t u32;
> +typedef uint32_t __le32;
> +
> +static inline u32 cpu_to_le32(const u32 v)
> +{
> +#if BYTE_ORDER == BIG_ENDIAN
> + return (((v & 0x000000ffUL) << 24) |
> + ((v & 0x0000ff00UL) << 8) |
> + ((v & 0x00ff0000UL) >> 8) |
> + ((v & 0xff000000UL) >> 24));
> +#else
> + return v;
> +#endif
> +}
> +
> +static inline u32 le32_to_cpup(const u32 *p)
> +{
> + return cpu_to_le32(*p);
> +}
> +
> +#define min(x,y) ({ \
> + const typeof(x) _x = (x); \
> + const typeof(y) _y = (y); \
> + (void) (&_x == &_y); \
> + _x < _y ? _x : _y; })
> +
> +#define min_t(type,x,y) \
> + ({ type __x = (x); type __y = (y); __x < __y ? __x: __y; })
> +#define max_t(type,x,y) \
> + ({ type __x = (x); type __y = (y); __x > __y ? __x: __y; })
> +
> +#define __force
> +#define always_inline
> +
> +#endif
> +
> #define get_le32(p) le32_to_cpup((const uint32_t *)(p))
>
> #if 1 /* ndef CONFIG_??? */
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |