[8/8] arc: libgloss: Prepare for porting to ARCv3

Message ID 20240820121043.1605628-9-ykolerov@synopsys.com
State New
Headers
Series A series of patches for Synopsys ARC port |

Commit Message

Yuriy Kolerov Aug. 20, 2024, 12:10 p.m. UTC
  From: Yuriy Kolerov <ykolerov@synopsys.com>

There are 3 families of Synopsys DeisgnWare ARC processors:
ARCompact/ARCv1 (32-bit), ARCv2 (32-bit) and ARCv3 (32-bit
and 64-bit targets). Upstream Newlib supports only ARCv1/2.
This commit prepares ARCv1/2 libgloss port to be reused by
ARCv3 port (except crt* files). Note that __ARC64__ macro
stands for all ARCv3 targets.

Signed-off-by: Yuriy Kolerov <ykolerov@synopsys.com>
---
 libgloss/arc/hl-stub.c         | 14 ++++++++++++++
 libgloss/arc/hl/hl_gw.c        |  9 +++++++++
 libgloss/arc/hl/hl_toolchain.h | 10 ++++++++++
 libgloss/arc/nsim-syscalls.c   |  5 +++++
 4 files changed, 38 insertions(+)
  

Patch

diff --git a/libgloss/arc/hl-stub.c b/libgloss/arc/hl-stub.c
index 7f5b9facc..c4d6ee67b 100644
--- a/libgloss/arc/hl-stub.c
+++ b/libgloss/arc/hl-stub.c
@@ -15,6 +15,7 @@ 
  *
  */
 
+#include <string.h>
 #include <errno.h>
 #include <unistd.h>
 #include <sys/times.h>
@@ -44,6 +45,19 @@  _getpid (void)
   return __MYPID;
 }
 
+/* We do not have 64-bit compatible hostlink fstat.  */
+#if defined (__ARC64__)
+int
+_fstat (int fd, struct stat *st)
+{
+  memset (st, 0, sizeof (*st));
+  st->st_mode = S_IFCHR;
+  st->st_blksize = 1024;
+
+  return 0;
+}
+#endif
+
 
 /* hostlink backend has only fstat(), so use fstat() in stat().  */
 int
diff --git a/libgloss/arc/hl/hl_gw.c b/libgloss/arc/hl/hl_gw.c
index f576f097e..4a8f8780f 100644
--- a/libgloss/arc/hl/hl_gw.c
+++ b/libgloss/arc/hl/hl_gw.c
@@ -15,6 +15,7 @@ 
  *
  */
 
+#include <stdint.h>
 #include "hl_gw.h"
 
 #define HL_VERSION 1
@@ -134,7 +135,15 @@  _hl_send (volatile __uncached void *p)
 
   _hl_pkt_init (pkt_hdr, _hl_payload_used (p));
 
+#if defined (__ARC64__)
+  /*
+   * Here we pass only low 4 bytes of the packet address (pkt_hdr).
+   * The high part of the address is obtained from __HOSTLINK__ address.
+   */
+  hdr->buf_addr = (uintptr_t) pkt_hdr & 0xFFFFFFFF;
+#else
   hdr->buf_addr = (uint32_t) pkt_hdr;
+#endif
   hdr->payload_size = _hl_payload_size ();
   hdr->host2target_addr = HL_NOADDRESS;
   hdr->version = HL_VERSION;
diff --git a/libgloss/arc/hl/hl_toolchain.h b/libgloss/arc/hl/hl_toolchain.h
index bf884bf3f..946061718 100644
--- a/libgloss/arc/hl/hl_toolchain.h
+++ b/libgloss/arc/hl/hl_toolchain.h
@@ -19,7 +19,12 @@ 
 #define _HL_TOOLCHAIN_H
 
 #ifndef __uncached
+#if defined (__ARC64__)
+  /* TODO: Uncached attribute is not implemented for ARCv3 yet.  */
+  #define __uncached
+#else
   #define __uncached __attribute__((uncached))
+#endif
 #endif /* __uncached */
 
 #ifndef __aligned
@@ -43,7 +48,12 @@ 
 #endif /* __noreturn */
 
 #ifndef __longcall
+#if defined (__ARC64__)
+  /* TODO: Long call attribute is not implemented for ARCv3 yet.  */
+  #define __longcall
+#else
   #define __longcall __attribute__((long_call))
+#endif
 #endif /* __longcall */
 
 #define HL_MAX_DCACHE_LINE 256
diff --git a/libgloss/arc/nsim-syscalls.c b/libgloss/arc/nsim-syscalls.c
index 807f95cd0..0a99ad59c 100644
--- a/libgloss/arc/nsim-syscalls.c
+++ b/libgloss/arc/nsim-syscalls.c
@@ -100,7 +100,12 @@  _open (const char * pathname, int flags, int mode)
 }
 
 /* Should be provided by crt0.S.  */
+#if defined (__ARC64__)
+/* TODO: long_call is not implemented yet in GCC. Fix this when implemented.  */
+extern void __attribute__((noreturn)) _exit_halt (int ret);
+#else
 extern void __attribute__((noreturn, long_call)) _exit_halt (int ret);
+#endif
 
 void
 __attribute__((noreturn))