RE: UEFI port of Fdtlib
From: Olivier Martin <hidden>
Date: 2011-09-12 10:00:27
Thanks David for the feedback, You right I should better use the Tianocore functions "UINT32 SwapBytes32(UINT32 Value)" and "UINT64 SwapBytes64(UINT64 Value)". And the Tianocore's CopyMem() supports the overlapped source and destination. Olivier -----Original Message----- From: David Gibson [mailto:david-xT8FGy+AXnRB3Ne2BGzF6laj5H9X9Tb+@public.gmane.org] Sent: 12 September 2011 02:40 To: Olivier Martin Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org Subject: Re: UEFI port of Fdtlib On Fri, Sep 09, 2011 at 08:02:40PM +0100, Olivier Martin wrote:
Hello all, I have ported the libfdt to Tianocore project [1] (under BSD license)
which
is an implementation of UEFI specification supported by Intel, ARM Ltd and other major companies. I took the libfdt directory from the head revision of git://git.jdl.com/software/dtc.git and ported it to the Tianocore project. I had just needed to edit the libfdt_env.h to translate the POSIX types
and
functions into their Tianocore equivalents. I was advised to send my changes to this mailing-list (please find the edited lifdt_env.h attached to this email). I am using this libfdt library to add/update information to the Device
Tree
(Linux kernel cmd line, etc) that is passed to the Linux kernel. I am planning to push upstream my changes in the next couple of days. Questions and comment are welcome ! Best Regards, Olivier [1] http://sourceforge.net/apps/mediawiki/tianocore/
#ifndef _LIBFDT_ENV_H
#define _LIBFDT_ENV_H
#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
typedef UINT8 uint8_t;
typedef UINT32 uint32_t;
typedef UINT64 uint64_t;
typedef UINTN uintptr_t;
typedef UINTN size_t;
#define _B(n) ((unsigned long long)((uint8_t *)&x)[n])
static inline uint32_t fdt32_to_cpu(uint32_t x)
{
return (_B(0) << 24) | (_B(1) << 16) | (_B(2) << 8) | _B(3);
}
#define cpu_to_fdt32(x) fdt32_to_cpu(x)
static inline uint64_t fdt64_to_cpu(uint64_t x)
{
return (_B(0) << 56) | (_B(1) << 48) | (_B(2) << 40) | (_B(3) << 32)
| (_B(4) << 24) | (_B(5) << 16) | (_B(6) << 8) | _B(7);
}
#define cpu_to_fdt64(x) fdt64_to_cpu(x)
#undef _BTianocore really doesn't have any byte swapping functions? I only used these nasty versions, because they're portable, whereas very little about userspace endian.h/bytesex.h is.
static inline void* memcpy(void* dest, const void* src, size_t len) {
return CopyMem (dest, src, len);
}
static inline void *memmove(void *dest, const void *src, size_t n) {
return CopyMem (dest, src, n);
}Ok, I take it that Tianocore's CopyMem can operate on overlapping source and destination, like memmove()? -- David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson