Skip to content

Commit

Permalink
Add platform support for Linux/m68k (#51)
Browse files Browse the repository at this point in the history
* Add generic platform support for Linux/m68k

* Include sem_t when determining values for FB_ALIGNMENT and FB_DOUBLE_ALIGN

On m68k, 'long long' is 16-bit aligned while 'sem_t' is 32-bit aligned
and we must therefore include 'sem_t' when determining the values for
FB_ALIGNMENT and FB_DOUBLE_ALIGN. Otherwise, the futex system call
will fail on these systems.

* Don't try to include headers for __cpuid on non-x86 targets

* Make sure that the version scripts include _IO_stdin_used on Linux

The GNU C library supports two ABIs for libio, one is the pre-2.1
ABI and the other is the current one. In order to determine which
ABI is to be used, the C library checks whether the _IO_stdin_used
symbol is exported by the executable. In case the symbol is present,
the new ABI is assumed, if the symbol is missing, the old ABI is
assumed. Thus, if an application is linked against a modern version
of glibc, it must export the _IO_stdin_used symbol as otherwise the
executable can crash or provoke other unexpected behavior on some
architectures like PowerPC or MIPS because the C library is using
the old ABI in this case.
  • Loading branch information
glaubitz authored and AlexPeshkoff committed Oct 14, 2016
1 parent 83899ab commit 7ba4616
Show file tree
Hide file tree
Showing 6 changed files with 27 additions and 5 deletions.
1 change: 1 addition & 0 deletions builds/posix/vers.sh.in
Expand Up @@ -57,6 +57,7 @@ platform_linux() {
echo "${TAB}$i;"
done

echo "${TAB}_IO_stdin_used;"
echo 'local:'
echo "${TAB}*;"
echo '};'
Expand Down
16 changes: 14 additions & 2 deletions configure.ac
Expand Up @@ -363,6 +363,17 @@ dnl CPU_TYPE=ppc64
SHRLIB_EXT=so
;;

m68k*-*-linux*)
MAKEFILE_PREFIX=linux_generic
INSTALL_PREFIX=linux
PLATFORM=LINUX
AC_DEFINE(LINUX, 1, [Define this if OS is Linux])
AC_DEFINE(M68K, 1, [Define this if CPU is M68k])
LOCK_MANAGER_FLG=Y
EDITLINE_FLG=Y
SHRLIB_EXT=so
;;

*-*-linux* | *-*-gnu*)
MAKEFILE_PREFIX=linux_generic
INSTALL_PREFIX=linux
Expand Down Expand Up @@ -1027,10 +1038,11 @@ AC_CHECK_MEMBER([struct dirent.d_type],
dnl EKU: try to determine the alignment of long and double
dnl replaces FB_ALIGNMENT and FB_DOUBLE_ALIGN in src/jrd/common.h
AC_MSG_CHECKING(alignment of long)
AC_RUN_IFELSE([AC_LANG_SOURCE([[main () {
AC_RUN_IFELSE([AC_LANG_SOURCE([[#include <semaphore.h>
main () {
struct s {
char a;
long long b;
union { long long x; sem_t y; } b;
};
exit((int)&((struct s*)0)->b);
}]])],[ac_cv_c_alignment=$ac_status],[ac_cv_c_alignment=$ac_status],[])
Expand Down
8 changes: 5 additions & 3 deletions src/common/classes/DbImplementation.cpp
Expand Up @@ -48,6 +48,7 @@ static const UCHAR CpuHppa = 13;
static const UCHAR CpuAlpha = 14;
static const UCHAR CpuArm64 = 15;
static const UCHAR CpuPowerPc64el = 16;
static const UCHAR CpuM68k = 17;

static const UCHAR OsWindows = 0;
static const UCHAR OsLinux = 1;
Expand Down Expand Up @@ -87,7 +88,8 @@ const char* hardware[] = {
"HPPA",
"Alpha",
"ARM64",
"PowerPC64el"
"PowerPC64el",
"M68k"
};

const char* operatingSystem[] = {
Expand Down Expand Up @@ -128,8 +130,8 @@ const UCHAR backwardTable[FB_NELEM(hardware) * FB_NELEM(operatingSystem)] =

const UCHAR backEndianess[FB_NELEM(hardware)] =
{
// Intel AMD Sparc PPC PPC64 MIPSEL MIPS ARM IA64 s390 s390x SH SHEB HPPA Alpha ARM64 PowerPC64el
0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0
// Intel AMD Sparc PPC PPC64 MIPSEL MIPS ARM IA64 s390 s390x SH SHEB HPPA Alpha ARM64 PowerPC64el M68k
0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1
};

} // anonymous namespace
Expand Down
2 changes: 2 additions & 0 deletions src/common/classes/Hash.cpp
Expand Up @@ -23,11 +23,13 @@
#include "firebird.h"
#include "../common/classes/Hash.h"

#if defined(_M_IX86) || defined(_M_X64) || defined(__x86_64__) || defined(__i386__)
#ifdef _MSC_VER
#include <intrin.h>
#else
#include <cpuid.h>
#endif
#endif

using namespace Firebird;

Expand Down
4 changes: 4 additions & 0 deletions src/common/common.h
Expand Up @@ -199,6 +199,10 @@
#define FB_CPU CpuPowerPc64
#endif /* PPC64 */

#ifdef M68K
#define FB_CPU CpuM68k
#endif /* M68K */

#endif /* LINUX */


Expand Down
1 change: 1 addition & 0 deletions src/jrd/inf_pub.h
Expand Up @@ -241,6 +241,7 @@ enum info_db_implementations
isc_info_db_impl_linux_arm64 = 84,
isc_info_db_impl_linux_ppc64el = 85,
isc_info_db_impl_linux_ppc64 = 86,
isc_info_db_impl_linux_m68k = 87,


isc_info_db_impl_last_value // Leave this LAST!
Expand Down

0 comments on commit 7ba4616

Please sign in to comment.