summaryrefslogtreecommitdiff
path: root/src/base/loader
diff options
context:
space:
mode:
authorBobby R. Bruce <bbruce@ucdavis.edu>2019-10-29 10:43:48 -0700
committerBobby R. Bruce <bbruce@ucdavis.edu>2019-11-21 23:07:03 +0000
commit54e0a39b50b9bf53ebf21db59a000d76a59a8a6f (patch)
tree7f81d48003998b24723551f621ac8d495a8c29c4 /src/base/loader
parentcbdf361f3f10ddfc351c24a1baab85a648d5e16d (diff)
downloadgem5-54e0a39b50b9bf53ebf21db59a000d76a59a8a6f.tar.xz
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 <jason@lowepower.com> Maintainer: Jason Lowe-Power <jason@lowepower.com> Tested-by: kokoro <noreply+kokoro@google.com>
Diffstat (limited to 'src/base/loader')
-rw-r--r--src/base/loader/exec_aout.test.cc143
-rw-r--r--src/base/loader/exec_ecoff.h2
-rw-r--r--src/base/loader/exec_ecoff.test.cc323
3 files changed, 468 insertions, 0 deletions
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 <gtest/gtest.h>
+
+#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 <gtest/gtest.h>
+
+#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