From 54e0a39b50b9bf53ebf21db59a000d76a59a8a6f Mon Sep 17 00:00:00 2001 From: "Bobby R. Bruce" Date: Tue, 29 Oct 2019 10:43:48 -0700 Subject: [PATCH] tests,base: Added GTests for exec_ecoff.h and exec_aout.h Change-Id: Iec76ba24a06425caefd28d640c6479720f401c06 Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/22323 Reviewed-by: Jason Lowe-Power Maintainer: Jason Lowe-Power Tested-by: kokoro --- src/base/SConscript | 2 + src/base/loader/exec_aout.test.cc | 143 +++++++++++++ src/base/loader/exec_ecoff.h | 2 + src/base/loader/exec_ecoff.test.cc | 323 +++++++++++++++++++++++++++++ 4 files changed, 470 insertions(+) create mode 100644 src/base/loader/exec_aout.test.cc create mode 100644 src/base/loader/exec_ecoff.test.cc diff --git a/src/base/SConscript b/src/base/SConscript index c9162b472..fe92b4387 100644 --- a/src/base/SConscript +++ b/src/base/SConscript @@ -103,6 +103,8 @@ GTest('circlebuf.test', 'circlebuf.test.cc') GTest('circular_queue.test', 'circular_queue.test.cc') GTest('sat_counter.test', 'sat_counter.test.cc') GTest('refcnt.test','refcnt.test.cc') +GTest('loader/exec_ecoff.test', 'loader/exec_ecoff.test.cc') +GTest('loader/exec_aout.test', 'loader/exec_aout.test.cc') GTest('condcodes.test', 'condcodes.test.cc') GTest('chunk_generator.test', 'chunk_generator.test.cc') diff --git a/src/base/loader/exec_aout.test.cc b/src/base/loader/exec_aout.test.cc new file mode 100644 index 000000000..97419e47f --- /dev/null +++ b/src/base/loader/exec_aout.test.cc @@ -0,0 +1,143 @@ +/* + * Copyright (c) 2019 The Regents of the University of California + * All rights reserved + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer; + * redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution; + * neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Authors: Bobby R. Bruce + */ + + +#include + +#include "base/loader/exec_aout.h" + +#define OMAGIC_STRUCT (*((const aout_exechdr *)omagic)) +#define NMAGIC_STRUCT (*((const aout_exechdr *)nmagic)) +#define ZMAGIC_STRUCT (*((const aout_exechdr *)zmagic)) +#define NO_MAGIC_STRUCT (*((const aout_exechdr *)no_magic)) + +#if (defined(_BIG_ENDIAN) || !defined(_LITTLE_ENDIAN))\ + && BYTE_ORDER==BIG_ENDIAN +const uint8_t omagic[] { + 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +const uint8_t nmagic[] { + 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +const uint8_t zmagic[] { + 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +const uint8_t no_magic[] { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00 +}; +#elif defined(_LITTLE_ENDIAN) || BYTE_ORDER==LITTLE_ENDIAN +const uint8_t omagic[] { + 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +const uint8_t nmagic[] { + 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +const uint8_t zmagic[] { + 0x0B, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +const uint8_t no_magic[] { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01 +}; +#else + #error Invalid Endianess +#endif + +TEST(ExecAoutTest, IsNotBadMagicNumber) +{ + EXPECT_FALSE(N_BADMAG(OMAGIC_STRUCT)); + EXPECT_FALSE(N_BADMAG(NMAGIC_STRUCT)); + EXPECT_FALSE(N_BADMAG(ZMAGIC_STRUCT)); +} + +TEST(ExecAoutTest, IsBadMagicNumber) +{ + EXPECT_TRUE(N_BADMAG(NO_MAGIC_STRUCT)); +} + +TEST(ExecAoutTest, AlignNotZmagic) +{ + /* + * N_ALIGN will return x if the aout_exechdr does not have ZMAGIC as a + * magic number. + */ + int64_t x = 0xABCD; + EXPECT_EQ(x, N_ALIGN(OMAGIC_STRUCT, x)); + EXPECT_EQ(x, N_ALIGN(NMAGIC_STRUCT, x)); + EXPECT_EQ(x, N_ALIGN(NO_MAGIC_STRUCT, x)); +} + +TEST(ExecAoutTest, AlignIsZmagic) +{ + /* + * N_ALIGN will round up X by AOUT_LDPGSZ (1 << 13) if the aout_exechdr + * has ZMAGIC as a magic number. + */ + int64_t x = (1 << 20) + (1 << 18) + (1 << 12) + (1 << 5) + 1; + EXPECT_EQ((1 << 20) + (1 << 18) + (1 << 13), N_ALIGN(ZMAGIC_STRUCT, x)); +} + +TEST(ExecAoutTest, AlignIsZmagicNoRounding) +{ + /* + * In this case, there's no rounding needed. + */ + int64_t x = (1 << 20) + (1 << 18) + (1 << 13); + EXPECT_EQ(x, N_ALIGN(ZMAGIC_STRUCT, x)); +} \ No newline at end of file diff --git a/src/base/loader/exec_ecoff.h b/src/base/loader/exec_ecoff.h index a076afbab..4b4c6f422 100644 --- a/src/base/loader/exec_ecoff.h +++ b/src/base/loader/exec_ecoff.h @@ -37,6 +37,8 @@ #ifndef _SYS_EXEC_ECOFF_H_ #define _SYS_EXEC_ECOFF_H_ +#include "arch/alpha/ecoff_machdep.h" + struct ecoff_filehdr { coff_ushort f_magic; /* magic number */ coff_ushort f_nscns; /* # of sections */ diff --git a/src/base/loader/exec_ecoff.test.cc b/src/base/loader/exec_ecoff.test.cc new file mode 100644 index 000000000..f43b956dc --- /dev/null +++ b/src/base/loader/exec_ecoff.test.cc @@ -0,0 +1,323 @@ +/* + * Copyright (c) 2019 The Regents of the University of California + * All rights reserved + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer; + * redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution; + * neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Authors: Bobby R. Bruce + */ + + +#include + +#include "base/loader/exec_ecoff.h" + +#define OMAGIC_STRUCT (*((const ecoff_exechdr *)omagic)) +#define NMAGIC_STRUCT (*((const ecoff_exechdr *)nmagic)) +#define ZMAGIC_STRUCT (*((const ecoff_exechdr *)zmagic)) +#define NO_MAGIC_STRUCT (*((const ecoff_exechdr *)no_magic)) + +#if (defined(_BIG_ENDIAN) || !defined(_LITTLE_ENDIAN))\ + && BYTE_ORDER==BIG_ENDIAN +const uint8_t zmagic[] = { + // ecoff_filehdr + 0x01, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + + // ecoff_aouthdr + 0x01, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +const uint8_t nmagic[] = { + //ecoff_filehdr + 0x01, 0x08, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + + //ecoff_aouthdr + 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +const uint8_t omagic[] = { + //ecoff_filehdr + 0x01, 0x07, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + + //ecoff_aouthdr + 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; +#elif defined(_LITTLE_ENDIAN) || BYTE_ORDER==LITTLE_ENDIAN +const uint8_t zmagic[] = { + // ecoff_filehdr + 0x0B, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + + // ecoff_aouthdr + 0x0B, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +const uint8_t nmagic[] = { + //ecoff_filehdr + 0x08, 0x01, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, + + //ecoff_aouthdr + 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +const uint8_t omagic[] = { + //ecoff_filehdr + 0x07, 0x01, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + + //ecoff_aouthdr + 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; +#else + #error Invalid Endianess +#endif + + + +TEST(ExecEcoffTest, Round) +{ + /* + * Note: ECOFF_ROUND always rounds up. + */ + EXPECT_EQ((1 << 10) + (1 << 8) + (1 << 6), + ECOFF_ROUND((1 << 10) + (1 << 8) + (1 << 5) + (1 << 4) + (1 << 1), + (1 << 5))); + + EXPECT_EQ((1 << 10) + (1 << 8) + (1 << 5), + ECOFF_ROUND((1 << 10) + (1 << 8) + (1 << 4) + (1 << 1), + (1 << 5))); + + EXPECT_EQ((1 << 10) + (1 << 8) + (1 << 6), + ECOFF_ROUND((1 << 10) + (1 << 8) + (1 << 5) + (1 << 1), + (1 << 5))); +} + +TEST(ExecEcoffTest, NoRounding) +{ + EXPECT_EQ((1 << 10) + (1 << 8) + (1 << 5), + ECOFF_ROUND((1 << 10) + (1 << 8) + (1 << 5), + (1 << 5))); +} + +TEST(ExecEcoffTest, BlockAlignWithoutZmagic) +{ + /* + * ECOFF_BLOCK_ALIGN will return "value" if "ep->a.magic" is not + * ECOFF_ZMAGIC. + */ + u_int64_t value = 0XFFFF; + + EXPECT_EQ(value, ECOFF_BLOCK_ALIGN(&OMAGIC_STRUCT, value)); + EXPECT_EQ(value, ECOFF_BLOCK_ALIGN(&OMAGIC_STRUCT, value)); +} + +TEST(ExecEcoffTest, BlockAlignWithZmagic) +{ + /* + * ECOFF_BLOCK_ALIGN will return "value" rounded ECOFF_LDPGSZ (1 << 12) + * if "ep->a.magic" is ECOFF_ZMAGIC. This uses ECOFF_ROUND, so will only + * round up. + */ + u_int64_t value1 = (1 << 14) + (1 << 13) + (1 << 10) + (1 << 8); + u_int64_t expected_output1 = (1 << 14) + (1 << 13) + (1 << 12); + EXPECT_EQ(expected_output1, ECOFF_BLOCK_ALIGN(&ZMAGIC_STRUCT, value1)); + + u_int64_t value2 = (1 << 10) + (1 << 8); + u_int64_t expected_output2 = (1 << 12) ; + EXPECT_EQ(expected_output2, ECOFF_BLOCK_ALIGN(&ZMAGIC_STRUCT, value2)); +} + +TEST(ExecEcoffTest, SegmentAlignWithZmagic) +{ + /* + * ECOFF_SEGMENT_ALIGN will round "value" rounded by ECOFF_LDPGZ (1 << 12) + * if "ep->amagic" is ECOFF_ZMAGIC. + */ + u_int64_t value1 = (1 << 14) + (1 << 13) + (1 << 10) + (1 << 8); + u_int64_t expected_output1 = (1 << 14) + (1 << 13) + (1 << 12); + EXPECT_EQ(expected_output1, ECOFF_SEGMENT_ALIGN(&ZMAGIC_STRUCT, value1)); + + u_int64_t value2 = (1 << 10) + (1 << 8); + u_int64_t expected_output2 = (1 << 12) ; + EXPECT_EQ(expected_output2, ECOFF_SEGMENT_ALIGN(&ZMAGIC_STRUCT, value2)); +} + +TEST(ExecEcoffTest, SegmentAlignWithoutZmagic) +{ + /* + * ECOFF_SEGMENT_ALIGN will return value rounded by the + * ECOFF_SEGMENT_ALIGNMENT of ep (ECOFF_SEGMENT_ALIGNMENT is defined in + * "arch/alpha/ecoff_machdep.h") if "ep->amagic" is not ECOFF_ZMAGIC. + * + * ECOFF_SEGMENT_ALIGNMENT(ep) will return 8 if the 2nd LSB in + * "(ep)->f.f_flags" is 0 and 16 if it is 1. + * + * "(nmagic)->f.f_flags" is 0x2, and therefore ECOFF_SEGMENT_ALIGN will + * round value by (1 << 4). "(omagic)->f.f_flags" is 0x0 and, in this + * case, ECOFF_SEGMENT_ALIGN will round value by (1 << 3). + */ + + u_int64_t value = (1 << 14) + (1 << 13) + (1 << 8) + (1 << 4) + (1 << 2) + + (1 << 1); + + EXPECT_EQ((1 << 14) + (1 << 13) + (1 << 8) + (1 << 5), + ECOFF_SEGMENT_ALIGN(&NMAGIC_STRUCT, value)); // Round by (1 << 4). + EXPECT_EQ((1 << 14) + (1 << 13) + (1 << 8) + (1 << 4) + (1 << 3), + ECOFF_SEGMENT_ALIGN(&OMAGIC_STRUCT, value)); // Round by (1 << 3). +} + +TEST(ExecEcoffTest, TxtOffWithMagic) +{ + /* + * ECOFF_TXTOFF will return 0 if "(ep)->a.magic" is ECOFF_ZMAGIC + */ + EXPECT_EQ(0, ECOFF_TXTOFF(&ZMAGIC_STRUCT)); +} + +TEST(ExecEcoffTest, TxtOffWithoutMagic) +{ + /* + * If "(ep)->a.magic" is not ECOFF_ZMAGIC, ECOFF_TXTOFF will return + * "(ep)->f.f_nscns" multiplied by ECOFF_HDR_SIZE (sizeof ecoff_scnhdr) + * plus the size of ecoff_exechdr, roundeded by ECOFF_SEGMENT_ALIGNMENT. + * The value of ECOFF_SEGMENT_ALIGNMENT will return (1 << 3) if the 2nd + * LSB in "(ep)->f.f_flags" is 0 and (1 << 4) if it's one. + * + * In our setup (omagic)->f.f_flags is 0x0 and (nmagic)->f.f_flags is 0x2. + * (omagic)->f.f_nscns is 0xA, and (nmagic)->f.f_nscns is 0xF. + */ + + /* + * (sizeof omagic) * 0xA + (sizeof omagic), rounded by (1 << 3). + */ + u_int64_t expected_output_omagic = ECOFF_ROUND( + (sizeof(struct ecoff_scnhdr)) * 0xA + + (sizeof(struct ecoff_exechdr)), + (1 << 3)); + EXPECT_EQ(expected_output_omagic, ECOFF_TXTOFF(&OMAGIC_STRUCT)); + + /* + * (sizeof nmagic) * 0xF + (sizeof nmagic), rounded by (1 << 4). + */ + u_int64_t expected_output_nmagic = ECOFF_ROUND( + (sizeof(struct ecoff_scnhdr) * 0xF + + (sizeof(struct ecoff_exechdr))), + (1 << 4)); + EXPECT_EQ(expected_output_nmagic, ECOFF_TXTOFF(&NMAGIC_STRUCT)); +} + +TEST(ExecEcoffTest, DatOffWithMagic) +{ + /* + * f (ep)->a.magic is ECOFF_ZMAGIC, ECOFF_DATOFF will return + * (ep)->a.tsize plus ECOFF_TXT(ep), rounded by ECOFF_LDPGSZ (1 << 12). + * + * (zmagic)->a.tsize is 0xF. + */ + + u_int64_t expected_output = ECOFF_ROUND( + 0xF + ECOFF_TXTOFF(&ZMAGIC_STRUCT), (1 << 12)); + EXPECT_EQ(expected_output, ECOFF_DATOFF(&ZMAGIC_STRUCT)); +} + +TEST(ExecEcoffTest, DatOffWithoutMagic) +{ + /* + * ECOFF_DATOFF will return (ep)->a.tsize plus ECOFF_TXTOFF(ep) if + * (ep)->a.magic is not ECOFF_ZMAGIC. + * + * (nmagic)->a.tsize is 0xA. + * (omagic)->a.tsize is 0x1. + */ + + u_int64_t expected_output_nmagic = 0xA + ECOFF_TXTOFF(&NMAGIC_STRUCT); + EXPECT_EQ(expected_output_nmagic, ECOFF_DATOFF(&NMAGIC_STRUCT)); + + u_int64_t expected_output_omagic = 0x1 + ECOFF_TXTOFF(&OMAGIC_STRUCT); + EXPECT_EQ(expected_output_omagic, ECOFF_DATOFF(&OMAGIC_STRUCT)); +} \ No newline at end of file -- 2.30.2