Reapply changes from https://github.com/dotnet/runtime/commit/1b5719c2e3dde393531eaeb5b5cde05dabeef5b8
Apply https://github.com/libunwind/libunwind/pull/317
+Apply https://github.com/libunwind/libunwind/pull/330
Apply https://github.com/libunwind/libunwind/pull/333
Apply https://github.com/libunwind/libunwind/pull/342
+Apply https://github.com/libunwind/libunwind/pull/353
+Apply https://github.com/libunwind/libunwind/pull/358
For LoongArch64:
Apply https://github.com/libunwind/libunwind/pull/316 and https://github.com/libunwind/libunwind/pull/322
"stp x8, x9, [%[base], #64]\n" \
"stp x10, x11, [%[base], #80]\n" \
"stp x12, x13, [%[base], #96]\n" \
- "stp x14, x13, [%[base], #112]\n" \
+ "stp x14, x15, [%[base], #112]\n" \
"stp x16, x17, [%[base], #128]\n" \
"stp x18, x19, [%[base], #144]\n" \
"stp x20, x21, [%[base], #160]\n" \
#include <string.h>
#include <unistd.h>
#include <sys/mman.h>
+#include <errno.h>
+#include <stdio.h>
#if defined(HAVE_ELF_H)
# include <elf.h>
return write (2, string, strlen (string));
}
+HIDDEN extern long unw_page_size;
+
+static inline unw_word_t uwn_page_start(unw_word_t addr)
+{
+ return addr & ~(unw_page_size - 1);
+}
+
#define mi_init UNWI_ARCH_OBJ(mi_init)
extern void mi_init (void); /* machine-independent initializations */
int open(const char *, int, ...);
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int, const void *, size_t);
+long sysconf(int name);
+
+#define _SC_PAGESIZE 11
#endif // _MSC_VER
return 0;
}
-#define PAGE_SIZE 4096
-#define PAGE_START(a) ((a) & ~(PAGE_SIZE-1))
static int mem_validate_pipe[2] = {-1, -1};
#ifdef HAVE_MINCORE
unsigned char present = 1;
- unw_word_t addr = PAGE_START((unw_word_t)&present);
+ size_t len = unw_page_size;
+ unw_word_t addr = uwn_page_start((unw_word_t)&present);
unsigned char mvec[1];
int ret;
- while ((ret = mincore ((void*)addr, PAGE_SIZE, (unsigned char *)mvec)) == -1 &&
- errno == EAGAIN) {}
+ while ((ret = mincore((void *)addr, len, (unsigned char *)mvec)) == -1 &&
+ errno == EAGAIN)
+ {
+ }
if (ret == 0)
{
Debug(1, "using mincore to validate memory\n");
{
size_t len;
- if (PAGE_START(addr + sizeof (unw_word_t) - 1) == PAGE_START(addr))
- len = PAGE_SIZE;
- else
- len = PAGE_SIZE * 2;
-
- addr = PAGE_START(addr);
+ len = unw_page_size;
+ addr = uwn_page_start(addr);
if (addr == 0)
return -1;
return 0;
}
-#define PAGE_SIZE 4096
-#define PAGE_START(a) ((a) & ~(PAGE_SIZE-1))
-
/* Cache of already validated addresses */
#define NLGA 4
static unw_word_t last_good_addr[NLGA];
validate_mem (unw_word_t addr)
{
int i, victim;
- size_t len;
-
- if (PAGE_START(addr + sizeof (unw_word_t) - 1) == PAGE_START(addr))
- len = PAGE_SIZE;
- else
- len = PAGE_SIZE * 2;
-
- addr = PAGE_START(addr);
+ size_t len = unw_page_size;
+ addr = uwn_page_start(addr);
if (addr == 0)
return -1;
long unwi_debug_level;
#endif /* UNW_DEBUG */
+long unw_page_size;
+static void
+unw_init_page_size ()
+{
+ errno = 0;
+ long result = sysconf (_SC_PAGESIZE);
+ if (result == -1)
+ {
+ if (errno != 0)
+ {
+ print_error ("Failed to get _SC_PAGESIZE: ");
+ print_error (strerror(errno));
+ print_error ("\n");
+ }
+ else
+ print_error ("Failed to get _SC_PAGESIZE, errno was not set.\n");
+
+ unw_page_size = 4096;
+ }
+ else
+ {
+ unw_page_size = result;
+ }
+}
HIDDEN void
mi_init (void)
setbuf (stderr, NULL);
}
#endif
-
- assert (sizeof (struct cursor) <= sizeof (unw_cursor_t));
+ unw_init_page_size();
+ assert(sizeof(struct cursor) <= sizeof(unw_cursor_t));
}
// Memory validation routines are from aarch64
-#define PAGE_SIZE 4096
-#define PAGE_START(a) ((a) & ~(PAGE_SIZE-1))
-
static int mem_validate_pipe[2] = {-1, -1};
#ifdef HAVE_PIPE2
#ifdef HAVE_MINCORE
unsigned char present = 1;
- unw_word_t addr = PAGE_START((unw_word_t)&present);
+ size_t len = unw_page_size;
+ unw_word_t addr = uwn_page_start((unw_word_t)&present);
unsigned char mvec[1];
int ret;
- while ((ret = mincore ((void*)addr, PAGE_SIZE, (unsigned char *)mvec)) == -1 &&
- errno == EAGAIN) {}
+ while ((ret = mincore((void *)addr, len, (unsigned char *)mvec)) == -1 &&
+ errno == EAGAIN)
+ {
+ }
if (ret == 0)
{
Debug(1, "using mincore to validate memory\n");
static int
validate_mem (unw_word_t addr)
{
- size_t len;
-
- if (PAGE_START(addr + sizeof (unw_word_t) - 1) == PAGE_START(addr))
- len = PAGE_SIZE;
- else
- len = PAGE_SIZE * 2;
-
- addr = PAGE_START(addr);
+ size_t len = unw_page_size;
+ addr = uwn_page_start(addr);
if (addr == 0)
return -1;
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+#include "libunwind_i.h"
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
return 0;
}
-#define PAGE_SIZE 4096
-#define PAGE_START(a) ((a) & ~(PAGE_SIZE-1))
-
static int mem_validate_pipe[2] = {-1, -1};
static inline void
return -1;
}
- for (i = 0; i < (len + PAGE_SIZE - 1) / PAGE_SIZE; i++)
+ for (i = 0; i < (len + unw_page_size - 1) / unw_page_size; i++)
{
if (!(mvec[i] & 1)) return -1;
}
#ifdef HAVE_MINCORE
unsigned char present = 1;
- unw_word_t addr = PAGE_START((unw_word_t)&present);
+ size_t len = unw_page_size;
+ unw_word_t addr = uwn_page_start((unw_word_t)&present);
unsigned char mvec[1];
int ret;
- while ((ret = mincore ((void*)addr, PAGE_SIZE, mvec)) == -1 &&
- errno == EAGAIN) {}
+ while ((ret = mincore((void *)addr, len, mvec)) == -1 &&
+ errno == EAGAIN)
+ {
+ }
if (ret == 0 && (mvec[0] & 1))
{
Debug(1, "using mincore to validate memory\n");
validate_mem (unw_word_t addr)
{
int i, victim;
- size_t len;
-
- if (PAGE_START(addr + sizeof (unw_word_t) - 1) == PAGE_START(addr))
- len = PAGE_SIZE;
- else
- len = PAGE_SIZE * 2;
-
- addr = PAGE_START(addr);
+ size_t len = unw_page_size;
+ addr = uwn_page_start(addr);
if (addr == 0)
return -1;
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>
+#include <errno.h>
#include "libunwind_i.h"
#include "compiler.h"
return 4096;
}
+long sysconf(int name)
+{
+ if (name == _SC_PAGESIZE)
+ {
+ return getpagesize();
+ }
+
+ errno = EINVAL;
+ return -1;
+}
+
void* mmap(void *addr, size_t length, int prot, int flags, int fd, size_t offset)
{
// We shouldn't be doing anything other than anonymous mappings
return -1;
}
+ssize_t write(int fd, const void *buf, size_t nbyte)
+{
+ // For dump debugging we shouldn't need to open files
+ // Especially since we didn't implement open()
+ return -1;
+}
+
int close(int fd)
{
// For dump debugging we shouldn't need to open files
return 0;
}
-#define PAGE_SIZE 4096
-#define PAGE_START(a) ((a) & ~(PAGE_SIZE-1))
-
/* Cache of already validated addresses */
#define NLGA 4
static unw_word_t last_good_addr[NLGA];
#ifdef HAVE_MINCORE
unsigned char mvec[2]; /* Unaligned access may cross page boundary */
#endif
- size_t len;
-
- if (PAGE_START(addr + sizeof (unw_word_t) - 1) == PAGE_START(addr))
- len = PAGE_SIZE;
- else
- len = PAGE_SIZE * 2;
-
- addr = PAGE_START(addr);
+ size_t len = unw_page_size;
+ addr = uwn_page_start(addr);
if (addr == 0)
return -1;
return 0;
}
-#define PAGE_SIZE 4096
-#define PAGE_START(a) ((a) & ~(PAGE_SIZE-1))
-
static int mem_validate_pipe[2] = {-1, -1};
#ifdef HAVE_PIPE2
#ifdef HAVE_MINCORE
unsigned char present = 1;
- unw_word_t addr = PAGE_START((unw_word_t)&present);
+ size_t len = unw_page_size;
+ unw_word_t addr = uwn_page_start((unw_word_t)&present);
unsigned char mvec[1];
int ret;
- while ((ret = mincore ((void*)addr, PAGE_SIZE, (unsigned char *)mvec)) == -1 &&
+ while ((ret = mincore ((void*)addr, len, (unsigned char *)mvec)) == -1 &&
errno == EAGAIN) {}
if (ret == 0)
{
static int
validate_mem (unw_word_t addr)
{
- size_t len;
-
- if (PAGE_START(addr + sizeof (unw_word_t) - 1) == PAGE_START(addr))
- len = PAGE_SIZE;
- else
- len = PAGE_SIZE * 2;
-
- addr = PAGE_START(addr);
+ size_t len = unw_page_size;
+ addr = uwn_page_start(addr);
if (addr == 0)
return -1;