aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlavio Cruz <flaviocruz@gmail.com>2022-12-16 14:56:36 -0500
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2022-12-17 02:32:35 +0100
commitcef6d34aa02698ec2a173bdc6f42ae979ac08cd9 (patch)
treef6dae656f71e5316883ebdfbae5dc3f44803cdd8
parentad51c68171cb6a1cae15c61ca0218bbee2c05485 (diff)
downloadgnumach-cef6d34aa02698ec2a173bdc6f42ae979ac08cd9.tar.gz
gnumach-cef6d34aa02698ec2a173bdc6f42ae979ac08cd9.tar.bz2
gnumach-cef6d34aa02698ec2a173bdc6f42ae979ac08cd9.zip
Implement our own functions to convert between host and network values
We add htonl, ntohl and ntohs which were the last symbols we relied on from libc. The Makefile.am file was updated to reflect the fact that we only require libgcc. Message-Id: <Y5zNdOJ/YnyYCOhX@mars>
-rw-r--r--Makefile.am20
-rw-r--r--Makefrag.am4
-rw-r--r--util/byteorder.c45
-rw-r--r--util/byteorder.h31
4 files changed, 87 insertions, 13 deletions
diff --git a/Makefile.am b/Makefile.am
index 33f770f6..2f418bea 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -167,31 +167,27 @@ gnumach_o_LINK = $(LD) $(LDFLAGS) -u _start -r -o $@
noinst_PROGRAMS += \
gnumach.o
-# This is the list of routines we decide is OK to steal from the C library or libgcc.
-clib_routines := htonl htons ntohl ntohs \
- udivdi3 __udivdi3 __udivmoddi4 __umoddi3 \
- __divdi3 __moddi3 \
- __rel_iplt_start __rel_iplt_end \
- __rela_iplt_start __rela_iplt_end \
- __ffsdi2 \
- _START _start etext _edata end _end # actually ld magic, not libc.
+# This is the list of routines we use from libgcc.
+libgcc_routines := __udivmoddi4 __umoddi3 __ffsdi2
+# References generated by ld.
+ld_magic_routines := __rel_iplt_start __rel_iplt_end etext _edata _end
gnumach-undef: gnumach.$(OBJEXT)
$(NM_V) $(NM) -u $< | sed 's/ *U *//' | sort -u > $@
MOSTLYCLEANFILES += gnumach-undef
gnumach-undef-bad: gnumach-undef Makefile
- $(AM_V_GEN) sed '$(foreach r,$(clib_routines),/^$r$$/d;)' $< > $@
+ $(AM_V_GEN) sed '$(foreach r,$(libgcc_routines) $(ld_magic_routines),/^$r$$/d;)' $< > $@
MOSTLYCLEANFILES += gnumach-undef-bad
-clib-routines.o: gnumach-undef gnumach-undef-bad
+libgcc-routines.o: gnumach-undef gnumach-undef-bad
$(AM_V_at) if test -s gnumach-undef-bad; \
then cat gnumach-undef-bad; exit 2; else true; fi
$(AM_V_CCLD) $(CCLD) $(LDFLAGS) -nostdlib -nostartfiles -r -static \
- -o $@ `sed 's/^/-Wl,-u,/' < $<` -x c /dev/null -lc -lgcc
+ -o $@ `sed 's/^/-Wl,-u,/' < $<` -x c /dev/null -lgcc
@if nm $@ | grep __init_cpu_features; \
then echo "Please install a 32bit libc without multiarch support (on Debian systems, the libc6-dev:i386 package containing /usr/lib/i386-linux-gnu/libc.a)". ; \
false ; fi
gnumach_LINK = $(LD) $(LDFLAGS) $(LINKFLAGS) $(gnumach_LINKFLAGS) -o $@
-gnumach_LDADD = gnumach.o clib-routines.o
+gnumach_LDADD = gnumach.o libgcc-routines.o
#
# Installation.
diff --git a/Makefrag.am b/Makefrag.am
index 51b15260..e2593c42 100644
--- a/Makefrag.am
+++ b/Makefrag.am
@@ -244,7 +244,9 @@ libkernel_a_SOURCES += \
util/putchar.h \
util/puts.c \
util/atoi.c \
- util/atoi.h
+ util/atoi.h \
+ util/byteorder.h \
+ util/byteorder.c
#
# Virtual memory implementation.
diff --git a/util/byteorder.c b/util/byteorder.c
new file mode 100644
index 00000000..18311972
--- /dev/null
+++ b/util/byteorder.c
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2022 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Mach.
+ *
+ * GNU Mach is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2, or (at your option) any later
+ * version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "util/byteorder.h"
+
+uint16_t ntohs(uint16_t netshort) {
+#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+ return __builtin_bswap16(netshort);
+#else
+ return netshort;
+#endif
+}
+
+uint32_t ntohl(uint32_t netlong) {
+#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+ return __builtin_bswap32(netlong);
+#else
+ return netlong;
+#endif
+}
+
+uint32_t htonl(uint32_t hostlong) {
+#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+ return __builtin_bswap32(hostlong);
+#else
+ return hostlong;
+#endif
+}
diff --git a/util/byteorder.h b/util/byteorder.h
new file mode 100644
index 00000000..2b780ffe
--- /dev/null
+++ b/util/byteorder.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2022 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Mach.
+ *
+ * GNU Mach is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2, or (at your option) any later
+ * version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef _UTIL_BYTEORDER_H_
+#define _UTIL_BYTEORDER_H_
+
+#include <stdint.h>
+
+uint16_t ntohs(uint16_t netshort);
+uint32_t ntohl(uint32_t netlong);
+
+uint32_t htonl(uint32_t hostlong);
+
+#endif /* _UTIL_BYTEORDER_H_ */