From f9cb8a9ac3c9ff2894142649f913a7cce65d7504 Mon Sep 17 00:00:00 2001 From: Christian Helmuth Date: Mon, 7 Jan 2013 18:00:35 +0100 Subject: [PATCH] dde_ipxe: Properly wrap iPXE interfaces to C++ As iPXE header files are not C++ compatible, the implementation missed proper include directives. For example, alloc_memblock() had a wrong signature, which was not detected. Now, C wrapper functions are implemented using a local API to the C++ backend. Related to #593. --- dde_ipxe/src/lib/dde_ipxe/dde.c | 12 ++++++++++++ dde_ipxe/src/lib/dde_ipxe/dde_support.cc | 10 ++++++---- dde_ipxe/src/lib/dde_ipxe/dde_support.h | 24 ++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 dde_ipxe/src/lib/dde_ipxe/dde_support.h diff --git a/dde_ipxe/src/lib/dde_ipxe/dde.c b/dde_ipxe/src/lib/dde_ipxe/dde.c index 4c780b095..580a16025 100644 --- a/dde_ipxe/src/lib/dde_ipxe/dde.c +++ b/dde_ipxe/src/lib/dde_ipxe/dde.c @@ -27,9 +27,21 @@ #include #include #include +#include #include "local.h" + +/*********************************** + ** Wrapper to DDE support in C++ ** + ***********************************/ + +#include "dde_support.h" + +void *alloc_memblock(size_t size, size_t align, size_t offset) { return dde_alloc_memblock(size, align, offset); } +void free_memblock(void *p, size_t size) { dde_free_memblock(p, size); } +void timer2_udelay(unsigned long usecs) { dde_timer2_udelay(usecs); } + /********************************** ** Memory pool in DDE kit slabs ** **********************************/ diff --git a/dde_ipxe/src/lib/dde_ipxe/dde_support.cc b/dde_ipxe/src/lib/dde_ipxe/dde_support.cc index 33ccecc7d..c169e90b0 100644 --- a/dde_ipxe/src/lib/dde_ipxe/dde_support.cc +++ b/dde_ipxe/src/lib/dde_ipxe/dde_support.cc @@ -20,6 +20,7 @@ extern "C" { #include +#include "dde_support.h" } using namespace Genode; @@ -56,18 +57,19 @@ void __attribute__((constructor)) init() } -extern "C" void *alloc_memblock(size_t size, size_t align) +extern "C" void *dde_alloc_memblock(dde_kit_size_t size, dde_kit_size_t align, dde_kit_size_t offset) { void *ptr; if (allocator()->alloc_aligned(size, &ptr, log2(align)).is_error()) { - PERR("memory allocation failed in alloc_memblock"); + PERR("memory allocation failed in alloc_memblock (size=%zd, align=%zx, offset=%zx)", + size, align, offset); return 0; }; return ptr; } -extern "C" void free_memblock(void *p, size_t size) +extern "C" void dde_free_memblock(void *p, dde_kit_size_t size) { allocator()->free(p, size); } @@ -77,7 +79,7 @@ extern "C" void free_memblock(void *p, size_t size) ** Timer ** ***********/ -extern "C" void timer2_udelay(unsigned long usecs) +extern "C" void dde_timer2_udelay(unsigned long usecs) { /* * This function is called only once during rdtsc calibration (usecs will be diff --git a/dde_ipxe/src/lib/dde_ipxe/dde_support.h b/dde_ipxe/src/lib/dde_ipxe/dde_support.h new file mode 100644 index 000000000..eb5c03b52 --- /dev/null +++ b/dde_ipxe/src/lib/dde_ipxe/dde_support.h @@ -0,0 +1,24 @@ +/* + * \brief DDE iPXE wrappers to C++ backend + * \author Christian Helmuth + * \date 2013-01-07 + */ + +/* + * Copyright (C) 2010-2013 Genode Labs GmbH + * + * This file is part of the Genode OS framework, which is distributed + * under the terms of the GNU General Public License version 2. + */ + +#ifndef _DDE_SUPPORT_H_ +#define _DDE_SUPPORT_H_ + +#include + + +void *dde_alloc_memblock(dde_kit_size_t size, dde_kit_size_t align, dde_kit_size_t offset); +void dde_free_memblock(void *p, dde_kit_size_t size); +void dde_timer2_udelay(unsigned long usecs); + +#endif /* _DDE_SUPPORT_H_ */