mirror of
https://git.busybox.net/uClibc
synced 2025-05-09 07:11:58 +08:00
tweak the idea between having a MMU and actually using it
This commit is contained in:
parent
aa5490a851
commit
010301e968
@ -45,7 +45,7 @@ include/bits/uClibc_config.h: extra/config/conf .config
|
|||||||
# in order to generate the headers correctly :(. That
|
# in order to generate the headers correctly :(. That
|
||||||
# means we can't use the $(HOSTCC) in order to get the
|
# means we can't use the $(HOSTCC) in order to get the
|
||||||
# correct output.
|
# correct output.
|
||||||
ifeq ($(ARCH_HAS_MMU),y)
|
ifeq ($(ARCH_USE_MMU),y)
|
||||||
export header_extra_args =
|
export header_extra_args =
|
||||||
else
|
else
|
||||||
export header_extra_args = -n
|
export header_extra_args = -n
|
||||||
|
@ -48,6 +48,16 @@ config ARCH_HAS_MMU
|
|||||||
|
|
||||||
Most people will answer Y.
|
Most people will answer Y.
|
||||||
|
|
||||||
|
config ARCH_USE_MMU
|
||||||
|
bool "Do you want to utilize the MMU?"
|
||||||
|
depends on ARCH_HAS_MMU
|
||||||
|
default y
|
||||||
|
help
|
||||||
|
If your target CPU has a MMU, and you wish to actually utilize it,
|
||||||
|
then answer Y here. Normal Linux requires an MMU.
|
||||||
|
|
||||||
|
If you're unsure, answer Y.
|
||||||
|
|
||||||
config UCLIBC_HAS_FLOATS
|
config UCLIBC_HAS_FLOATS
|
||||||
bool "Enable floating point number support"
|
bool "Enable floating point number support"
|
||||||
default y
|
default y
|
||||||
|
@ -99,7 +99,7 @@ extern int madvise (void *__addr, size_t __len, int __advice) __THROW;
|
|||||||
extern int posix_madvise (void *__addr, size_t __len, int __advice) __THROW;
|
extern int posix_madvise (void *__addr, size_t __len, int __advice) __THROW;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __ARCH_HAS_MMU__
|
#ifdef __ARCH_USE_MMU__
|
||||||
/* Guarantee all whole pages mapped by the range [ADDR,ADDR+LEN) to
|
/* Guarantee all whole pages mapped by the range [ADDR,ADDR+LEN) to
|
||||||
be memory resident. */
|
be memory resident. */
|
||||||
extern int mlock (__const void *__addr, size_t __len) __THROW;
|
extern int mlock (__const void *__addr, size_t __len) __THROW;
|
||||||
|
@ -703,7 +703,7 @@ extern int setresgid (__gid_t __egid, __gid_t __rgid, __gid_t __sgid)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#ifdef __ARCH_HAS_MMU__
|
#ifdef __ARCH_USE_MMU__
|
||||||
/* Clone the calling process, creating an exact copy.
|
/* Clone the calling process, creating an exact copy.
|
||||||
Return -1 for errors, 0 to the new process,
|
Return -1 for errors, 0 to the new process,
|
||||||
and the process ID of the new process to the old process. */
|
and the process ID of the new process to the old process. */
|
||||||
@ -885,7 +885,7 @@ extern void endusershell (void) __THROW; /* Discard cached info. */
|
|||||||
extern void setusershell (void) __THROW; /* Rewind and re-read the file. */
|
extern void setusershell (void) __THROW; /* Rewind and re-read the file. */
|
||||||
|
|
||||||
|
|
||||||
#ifdef __ARCH_HAS_MMU__
|
#ifdef __ARCH_USE_MMU__
|
||||||
/* Put the program in the background, and dissociate from the controlling
|
/* Put the program in the background, and dissociate from the controlling
|
||||||
terminal. If NOCHDIR is zero, do `chdir ("/")'. If NOCLOSE is zero,
|
terminal. If NOCHDIR is zero, do `chdir ("/")'. If NOCLOSE is zero,
|
||||||
redirects stdin, stdout, and stderr to /dev/null. */
|
redirects stdin, stdout, and stderr to /dev/null. */
|
||||||
|
@ -174,7 +174,7 @@ int rcmd(ahost, rport, locuser, remuser, cmd, fd2p)
|
|||||||
|
|
||||||
#ifdef __UCLIBC_HAS_REENTRANT_RPC__
|
#ifdef __UCLIBC_HAS_REENTRANT_RPC__
|
||||||
hstbuflen = 1024;
|
hstbuflen = 1024;
|
||||||
#ifdef __ARCH_HAS_MMU__
|
#ifdef __ARCH_USE_MMU__
|
||||||
tmphstbuf = alloca (hstbuflen);
|
tmphstbuf = alloca (hstbuflen);
|
||||||
#else
|
#else
|
||||||
tmphstbuf = malloc (hstbuflen);
|
tmphstbuf = malloc (hstbuflen);
|
||||||
@ -186,7 +186,7 @@ int rcmd(ahost, rport, locuser, remuser, cmd, fd2p)
|
|||||||
if (herr != NETDB_INTERNAL || errno != ERANGE)
|
if (herr != NETDB_INTERNAL || errno != ERANGE)
|
||||||
{
|
{
|
||||||
__set_h_errno (herr);
|
__set_h_errno (herr);
|
||||||
#ifndef __ARCH_HAS_MMU__
|
#ifndef __ARCH_USE_MMU__
|
||||||
free(tmphstbuf);
|
free(tmphstbuf);
|
||||||
#endif
|
#endif
|
||||||
herror(*ahost);
|
herror(*ahost);
|
||||||
@ -196,7 +196,7 @@ int rcmd(ahost, rport, locuser, remuser, cmd, fd2p)
|
|||||||
{
|
{
|
||||||
/* Enlarge the buffer. */
|
/* Enlarge the buffer. */
|
||||||
hstbuflen *= 2;
|
hstbuflen *= 2;
|
||||||
#ifdef __ARCH_HAS_MMU__
|
#ifdef __ARCH_USE_MMU__
|
||||||
tmphstbuf = alloca (hstbuflen);
|
tmphstbuf = alloca (hstbuflen);
|
||||||
#else
|
#else
|
||||||
if (tmphstbuf) {
|
if (tmphstbuf) {
|
||||||
@ -206,7 +206,7 @@ int rcmd(ahost, rport, locuser, remuser, cmd, fd2p)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#ifndef __ARCH_HAS_MMU__
|
#ifndef __ARCH_USE_MMU__
|
||||||
free(tmphstbuf);
|
free(tmphstbuf);
|
||||||
#endif
|
#endif
|
||||||
#else /* call the non-reentrant version */
|
#else /* call the non-reentrant version */
|
||||||
@ -388,7 +388,7 @@ int ruserok(rhost, superuser, ruser, luser)
|
|||||||
|
|
||||||
#ifdef __UCLIBC_HAS_REENTRANT_RPC__
|
#ifdef __UCLIBC_HAS_REENTRANT_RPC__
|
||||||
buflen = 1024;
|
buflen = 1024;
|
||||||
#ifdef __ARCH_HAS_MMU__
|
#ifdef __ARCH_USE_MMU__
|
||||||
buffer = alloca (buflen);
|
buffer = alloca (buflen);
|
||||||
#else
|
#else
|
||||||
buffer = malloc (buflen);
|
buffer = malloc (buflen);
|
||||||
@ -398,7 +398,7 @@ int ruserok(rhost, superuser, ruser, luser)
|
|||||||
buflen, &hp, &herr) != 0 || hp == NULL)
|
buflen, &hp, &herr) != 0 || hp == NULL)
|
||||||
{
|
{
|
||||||
if (herr != NETDB_INTERNAL || errno != ERANGE) {
|
if (herr != NETDB_INTERNAL || errno != ERANGE) {
|
||||||
#ifndef __ARCH_HAS_MMU__
|
#ifndef __ARCH_USE_MMU__
|
||||||
free(buffer);
|
free(buffer);
|
||||||
#endif
|
#endif
|
||||||
return -1;
|
return -1;
|
||||||
@ -406,7 +406,7 @@ int ruserok(rhost, superuser, ruser, luser)
|
|||||||
{
|
{
|
||||||
/* Enlarge the buffer. */
|
/* Enlarge the buffer. */
|
||||||
buflen *= 2;
|
buflen *= 2;
|
||||||
#ifdef __ARCH_HAS_MMU__
|
#ifdef __ARCH_USE_MMU__
|
||||||
buffer = alloca (buflen);
|
buffer = alloca (buflen);
|
||||||
#else
|
#else
|
||||||
if (buffer) {
|
if (buffer) {
|
||||||
@ -416,7 +416,7 @@ int ruserok(rhost, superuser, ruser, luser)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#ifndef __ARCH_HAS_MMU__
|
#ifndef __ARCH_USE_MMU__
|
||||||
free(buffer);
|
free(buffer);
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
@ -513,7 +513,7 @@ iruserok2 (raddr, superuser, ruser, luser, rhost)
|
|||||||
#ifdef __UCLIBC_HAS_REENTRANT_RPC__
|
#ifdef __UCLIBC_HAS_REENTRANT_RPC__
|
||||||
size_t buflen = sysconf (_SC_GETPW_R_SIZE_MAX);
|
size_t buflen = sysconf (_SC_GETPW_R_SIZE_MAX);
|
||||||
struct passwd pwdbuf;
|
struct passwd pwdbuf;
|
||||||
#ifdef __ARCH_HAS_MMU__
|
#ifdef __ARCH_USE_MMU__
|
||||||
char *buffer = alloca (buflen);
|
char *buffer = alloca (buflen);
|
||||||
#else
|
#else
|
||||||
char *buffer = malloc (buflen);
|
char *buffer = malloc (buflen);
|
||||||
@ -522,12 +522,12 @@ iruserok2 (raddr, superuser, ruser, luser, rhost)
|
|||||||
if (getpwnam_r (luser, &pwdbuf, buffer,
|
if (getpwnam_r (luser, &pwdbuf, buffer,
|
||||||
buflen, &pwd) != 0 || pwd == NULL)
|
buflen, &pwd) != 0 || pwd == NULL)
|
||||||
{
|
{
|
||||||
#ifndef __ARCH_HAS_MMU__
|
#ifndef __ARCH_USE_MMU__
|
||||||
free(buffer);
|
free(buffer);
|
||||||
#endif
|
#endif
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
#ifndef __ARCH_HAS_MMU__
|
#ifndef __ARCH_USE_MMU__
|
||||||
free(buffer);
|
free(buffer);
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
|
@ -33,7 +33,7 @@ libc_hidden_proto(exit)
|
|||||||
#ifdef __UCLIBC_HAS_PROGRAM_INVOCATION_NAME__
|
#ifdef __UCLIBC_HAS_PROGRAM_INVOCATION_NAME__
|
||||||
libc_hidden_proto(strrchr)
|
libc_hidden_proto(strrchr)
|
||||||
#endif
|
#endif
|
||||||
#ifdef __ARCH_HAS_MMU__
|
#ifdef __ARCH_USE_MMU__
|
||||||
libc_hidden_proto(memcpy)
|
libc_hidden_proto(memcpy)
|
||||||
libc_hidden_proto(getgid)
|
libc_hidden_proto(getgid)
|
||||||
libc_hidden_proto(getuid)
|
libc_hidden_proto(getuid)
|
||||||
@ -131,7 +131,7 @@ libc_hidden_data_def(__pagesize)
|
|||||||
# define O_NOFOLLOW 0
|
# define O_NOFOLLOW 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __ARCH_HAS_MMU__
|
#ifdef __ARCH_USE_MMU__
|
||||||
static void __check_one_fd(int fd, int mode)
|
static void __check_one_fd(int fd, int mode)
|
||||||
{
|
{
|
||||||
/* Check if the specified fd is already open */
|
/* Check if the specified fd is already open */
|
||||||
@ -272,7 +272,7 @@ void __uClibc_main(int (*main)(int, char **, char **), int argc,
|
|||||||
char **argv, void (*app_init)(void), void (*app_fini)(void),
|
char **argv, void (*app_init)(void), void (*app_fini)(void),
|
||||||
void (*rtld_fini)(void), void *stack_end)
|
void (*rtld_fini)(void), void *stack_end)
|
||||||
{
|
{
|
||||||
#ifdef __ARCH_HAS_MMU__
|
#ifdef __ARCH_USE_MMU__
|
||||||
unsigned long *aux_dat;
|
unsigned long *aux_dat;
|
||||||
ElfW(auxv_t) auxvt[AT_EGID + 1];
|
ElfW(auxv_t) auxvt[AT_EGID + 1];
|
||||||
#endif
|
#endif
|
||||||
@ -293,7 +293,7 @@ void __uClibc_main(int (*main)(int, char **, char **), int argc,
|
|||||||
__environ = &argv[argc];
|
__environ = &argv[argc];
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __ARCH_HAS_MMU__
|
#ifdef __ARCH_USE_MMU__
|
||||||
/* Pull stuff from the ELF header when possible */
|
/* Pull stuff from the ELF header when possible */
|
||||||
aux_dat = (unsigned long*)__environ;
|
aux_dat = (unsigned long*)__environ;
|
||||||
while (*aux_dat) {
|
while (*aux_dat) {
|
||||||
@ -314,7 +314,7 @@ void __uClibc_main(int (*main)(int, char **, char **), int argc,
|
|||||||
* __uClibc_init() regardless, to be sure the right thing happens. */
|
* __uClibc_init() regardless, to be sure the right thing happens. */
|
||||||
__uClibc_init();
|
__uClibc_init();
|
||||||
|
|
||||||
#ifdef __ARCH_HAS_MMU__
|
#ifdef __ARCH_USE_MMU__
|
||||||
/* Make certain getpagesize() gives the correct answer */
|
/* Make certain getpagesize() gives the correct answer */
|
||||||
__pagesize = (auxvt[AT_PAGESZ].a_un.a_val)? auxvt[AT_PAGESZ].a_un.a_val : PAGE_SIZE;
|
__pagesize = (auxvt[AT_PAGESZ].a_un.a_val)? auxvt[AT_PAGESZ].a_un.a_val : PAGE_SIZE;
|
||||||
|
|
||||||
|
@ -36,7 +36,7 @@ void *malloc(size_t size)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __ARCH_HAS_MMU__
|
#ifdef __ARCH_USE_MMU__
|
||||||
# define MMAP_FLAGS MAP_PRIVATE | MAP_ANONYMOUS
|
# define MMAP_FLAGS MAP_PRIVATE | MAP_ANONYMOUS
|
||||||
#else
|
#else
|
||||||
# define MMAP_FLAGS MAP_SHARED | MAP_ANONYMOUS
|
# define MMAP_FLAGS MAP_SHARED | MAP_ANONYMOUS
|
||||||
|
@ -354,7 +354,7 @@ libc_hidden_proto(__malloc_lock)
|
|||||||
#define MAP_ANONYMOUS MAP_ANON
|
#define MAP_ANONYMOUS MAP_ANON
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __ARCH_HAS_MMU__
|
#ifdef __ARCH_USE_MMU__
|
||||||
|
|
||||||
#define MMAP(addr, size, prot) \
|
#define MMAP(addr, size, prot) \
|
||||||
(mmap((addr), (size), (prot), MAP_PRIVATE|MAP_ANONYMOUS, 0, 0))
|
(mmap((addr), (size), (prot), MAP_PRIVATE|MAP_ANONYMOUS, 0, 0))
|
||||||
|
@ -106,7 +106,7 @@ malloc_from_heap (size_t size, struct heap *heap)
|
|||||||
#else /* !MALLOC_USE_SBRK */
|
#else /* !MALLOC_USE_SBRK */
|
||||||
|
|
||||||
/* Otherwise, use mmap. */
|
/* Otherwise, use mmap. */
|
||||||
#ifdef __ARCH_HAS_MMU__
|
#ifdef __ARCH_USE_MMU__
|
||||||
block = mmap ((void *)0, block_size, PROT_READ | PROT_WRITE,
|
block = mmap ((void *)0, block_size, PROT_READ | PROT_WRITE,
|
||||||
MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
|
MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
|
||||||
#else
|
#else
|
||||||
|
@ -44,7 +44,7 @@ libc_hidden_proto(__pagesize)
|
|||||||
heap, instead of mmap/munmap. This is a tradeoff -- sbrk is faster than
|
heap, instead of mmap/munmap. This is a tradeoff -- sbrk is faster than
|
||||||
mmap/munmap, and guarantees contiguous allocation, but is also less
|
mmap/munmap, and guarantees contiguous allocation, but is also less
|
||||||
flexible, and causes the heap to only be shrinkable from the end. */
|
flexible, and causes the heap to only be shrinkable from the end. */
|
||||||
#ifdef __ARCH_HAS_MMU__
|
#ifdef __ARCH_USE_MMU__
|
||||||
# define MALLOC_USE_SBRK
|
# define MALLOC_USE_SBRK
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -110,7 +110,7 @@ _start:
|
|||||||
mov fp, #0
|
mov fp, #0
|
||||||
mov lr, #0
|
mov lr, #0
|
||||||
|
|
||||||
#ifdef __ARCH_HAS_MMU__
|
#ifdef __ARCH_USE_MMU__
|
||||||
/* Pop argc off the stack and save a pointer to argv */
|
/* Pop argc off the stack and save a pointer to argv */
|
||||||
ldr a2, [sp], #4
|
ldr a2, [sp], #4
|
||||||
mov a3, sp
|
mov a3, sp
|
||||||
|
@ -43,21 +43,21 @@
|
|||||||
#define _POSIX_MAPPED_FILES 200112L
|
#define _POSIX_MAPPED_FILES 200112L
|
||||||
|
|
||||||
/* Locking of all memory is supported. */
|
/* Locking of all memory is supported. */
|
||||||
#ifdef __ARCH_HAS_MMU__
|
#ifdef __ARCH_USE_MMU__
|
||||||
# define _POSIX_MEMLOCK 200112L
|
# define _POSIX_MEMLOCK 200112L
|
||||||
#else
|
#else
|
||||||
# undef _POSIX_MEMLOCK
|
# undef _POSIX_MEMLOCK
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Locking of ranges of memory is supported. */
|
/* Locking of ranges of memory is supported. */
|
||||||
#ifdef __ARCH_HAS_MMU__
|
#ifdef __ARCH_USE_MMU__
|
||||||
# define _POSIX_MEMLOCK_RANGE 200112L
|
# define _POSIX_MEMLOCK_RANGE 200112L
|
||||||
#else
|
#else
|
||||||
# define _POSIX_MEMLOCK_RANGE
|
# define _POSIX_MEMLOCK_RANGE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Setting of memory protections is supported. */
|
/* Setting of memory protections is supported. */
|
||||||
#ifdef __ARCH_HAS_MMU__
|
#ifdef __ARCH_USE_MMU__
|
||||||
# define _POSIX_MEMORY_PROTECTION 1
|
# define _POSIX_MEMORY_PROTECTION 1
|
||||||
#else
|
#else
|
||||||
# undef _POSIX_MEMORY_PROTECTION
|
# undef _POSIX_MEMORY_PROTECTION
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
#include "syscalls.h"
|
#include "syscalls.h"
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#ifdef __ARCH_HAS_MMU__
|
#ifdef __ARCH_USE_MMU__
|
||||||
#ifdef __NR_fork
|
#ifdef __NR_fork
|
||||||
extern __typeof(fork) __libc_fork;
|
extern __typeof(fork) __libc_fork;
|
||||||
#define __NR___libc_fork __NR_fork
|
#define __NR___libc_fork __NR_fork
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "syscalls.h"
|
#include "syscalls.h"
|
||||||
#if defined __ARCH_HAS_MMU__ && defined __NR_ioperm
|
#if defined __ARCH_USE_MMU__ && defined __NR_ioperm
|
||||||
/* psm: can't #include <sys/io.h>, some archs miss it */
|
/* psm: can't #include <sys/io.h>, some archs miss it */
|
||||||
extern int ioperm(unsigned long __from, unsigned long __num, int __turn_on) __THROW;
|
extern int ioperm(unsigned long __from, unsigned long __num, int __turn_on) __THROW;
|
||||||
_syscall3(int, ioperm, unsigned long, from, unsigned long, num, int, turn_on);
|
_syscall3(int, ioperm, unsigned long, from, unsigned long, num, int, turn_on);
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "syscalls.h"
|
#include "syscalls.h"
|
||||||
#if defined __ARCH_HAS_MMU__ && defined __NR_iopl
|
#if defined __ARCH_USE_MMU__ && defined __NR_iopl
|
||||||
/* psm: can't #include <sys/io.h>, some archs miss it */
|
/* psm: can't #include <sys/io.h>, some archs miss it */
|
||||||
extern int iopl(int __level) __THROW;
|
extern int iopl(int __level) __THROW;
|
||||||
_syscall1(int, iopl, int, level);
|
_syscall1(int, iopl, int, level);
|
||||||
|
@ -9,6 +9,6 @@
|
|||||||
|
|
||||||
#include "syscalls.h"
|
#include "syscalls.h"
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
#if defined __ARCH_HAS_MMU__ && defined __NR_mlock
|
#if defined __ARCH_USE_MMU__ && defined __NR_mlock
|
||||||
_syscall2(int, mlock, const void *, addr, size_t, len);
|
_syscall2(int, mlock, const void *, addr, size_t, len);
|
||||||
#endif
|
#endif
|
||||||
|
@ -9,6 +9,6 @@
|
|||||||
|
|
||||||
#include "syscalls.h"
|
#include "syscalls.h"
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
#if defined __ARCH_HAS_MMU__ && defined __NR_mlockall
|
#if defined __ARCH_USE_MMU__ && defined __NR_mlockall
|
||||||
_syscall1(int, mlockall, int, flags);
|
_syscall1(int, mlockall, int, flags);
|
||||||
#endif
|
#endif
|
||||||
|
@ -9,6 +9,6 @@
|
|||||||
|
|
||||||
#include "syscalls.h"
|
#include "syscalls.h"
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
#if defined __ARCH_HAS_MMU__ && defined __NR_munlock
|
#if defined __ARCH_USE_MMU__ && defined __NR_munlock
|
||||||
_syscall2(int, munlock, const void *, addr, size_t, len);
|
_syscall2(int, munlock, const void *, addr, size_t, len);
|
||||||
#endif
|
#endif
|
||||||
|
@ -9,6 +9,6 @@
|
|||||||
|
|
||||||
#include "syscalls.h"
|
#include "syscalls.h"
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
#if defined __ARCH_HAS_MMU__
|
#if defined __ARCH_USE_MMU__
|
||||||
_syscall0(int, munlockall);
|
_syscall0(int, munlockall);
|
||||||
#endif
|
#endif
|
||||||
|
@ -12,7 +12,7 @@ CSRC := $(notdir $(wildcard $(UNISTD_DIR)/*.c))
|
|||||||
# multi source
|
# multi source
|
||||||
CSRC := $(filter-out exec.c,$(CSRC))
|
CSRC := $(filter-out exec.c,$(CSRC))
|
||||||
|
|
||||||
ifeq ($(ARCH_HAS_MMU),y)
|
ifeq ($(ARCH_USE_MMU),y)
|
||||||
CSRC := $(filter-out __exec_alloc.c,$(CSRC))
|
CSRC := $(filter-out __exec_alloc.c,$(CSRC))
|
||||||
else
|
else
|
||||||
CSRC := $(filter-out daemon.c,$(CSRC))
|
CSRC := $(filter-out daemon.c,$(CSRC))
|
||||||
|
@ -53,7 +53,7 @@ libc_hidden_proto(getenv)
|
|||||||
libc_hidden_proto(__environ)
|
libc_hidden_proto(__environ)
|
||||||
|
|
||||||
/**********************************************************************/
|
/**********************************************************************/
|
||||||
#if defined(__ARCH_HAS_MMU__) || defined(__UCLIBC_UCLINUX_BROKEN_MUNMAP__)
|
#if defined(__ARCH_USE_MMU__) || defined(__UCLIBC_UCLINUX_BROKEN_MUNMAP__)
|
||||||
|
|
||||||
/* We have an MMU, so use alloca() to grab space for buffers and
|
/* We have an MMU, so use alloca() to grab space for buffers and
|
||||||
* arg lists. Also fall back to alloca() if munmap() is broken. */
|
* arg lists. Also fall back to alloca() if munmap() is broken. */
|
||||||
|
@ -258,7 +258,7 @@ extern pthread_descr __pthread_main_thread;
|
|||||||
* the bounds a-priori. -StS */
|
* the bounds a-priori. -StS */
|
||||||
|
|
||||||
extern char *__pthread_initial_thread_bos;
|
extern char *__pthread_initial_thread_bos;
|
||||||
#ifndef __ARCH_HAS_MMU__
|
#ifndef __ARCH_USE_MMU__
|
||||||
extern char *__pthread_initial_thread_tos;
|
extern char *__pthread_initial_thread_tos;
|
||||||
#define NOMMU_INITIAL_THREAD_BOUNDS(tos,bos) \
|
#define NOMMU_INITIAL_THREAD_BOUNDS(tos,bos) \
|
||||||
if ((tos)>=__pthread_initial_thread_bos \
|
if ((tos)>=__pthread_initial_thread_bos \
|
||||||
@ -266,7 +266,7 @@ extern char *__pthread_initial_thread_tos;
|
|||||||
__pthread_initial_thread_bos = (tos)+1
|
__pthread_initial_thread_bos = (tos)+1
|
||||||
#else
|
#else
|
||||||
#define NOMMU_INITIAL_THREAD_BOUNDS(tos,bos) /* empty */
|
#define NOMMU_INITIAL_THREAD_BOUNDS(tos,bos) /* empty */
|
||||||
#endif /* __ARCH_HAS_MMU__ */
|
#endif /* __ARCH_USE_MMU__ */
|
||||||
|
|
||||||
|
|
||||||
/* Indicate whether at least one thread has a user-defined stack (if 1),
|
/* Indicate whether at least one thread has a user-defined stack (if 1),
|
||||||
@ -330,7 +330,7 @@ extern size_t __pagesize;
|
|||||||
THREAD_SELF implementation is used, this must be a power of two and
|
THREAD_SELF implementation is used, this must be a power of two and
|
||||||
a multiple of PAGE_SIZE. */
|
a multiple of PAGE_SIZE. */
|
||||||
#ifndef STACK_SIZE
|
#ifndef STACK_SIZE
|
||||||
#ifdef __ARCH_HAS_MMU__
|
#ifdef __ARCH_USE_MMU__
|
||||||
#define STACK_SIZE (2 * 1024 * 1024)
|
#define STACK_SIZE (2 * 1024 * 1024)
|
||||||
#else
|
#else
|
||||||
#define STACK_SIZE (4 * __pagesize)
|
#define STACK_SIZE (4 * __pagesize)
|
||||||
@ -387,7 +387,7 @@ static inline pthread_descr thread_self (void)
|
|||||||
return THREAD_SELF;
|
return THREAD_SELF;
|
||||||
#else
|
#else
|
||||||
char *sp = CURRENT_STACK_FRAME;
|
char *sp = CURRENT_STACK_FRAME;
|
||||||
#ifdef __ARCH_HAS_MMU__
|
#ifdef __ARCH_USE_MMU__
|
||||||
if (sp >= __pthread_initial_thread_bos)
|
if (sp >= __pthread_initial_thread_bos)
|
||||||
return &__pthread_initial_thread;
|
return &__pthread_initial_thread;
|
||||||
else if (sp >= __pthread_manager_thread_bos
|
else if (sp >= __pthread_manager_thread_bos
|
||||||
@ -420,7 +420,7 @@ static inline pthread_descr thread_self (void)
|
|||||||
else {
|
else {
|
||||||
return __pthread_find_self();
|
return __pthread_find_self();
|
||||||
}
|
}
|
||||||
#endif /* __ARCH_HAS_MMU__ */
|
#endif /* __ARCH_USE_MMU__ */
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -360,7 +360,7 @@ static int pthread_allocate_stack(const pthread_attr_t *attr,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
#ifdef __ARCH_HAS_MMU__
|
#ifdef __ARCH_USE_MMU__
|
||||||
stacksize = STACK_SIZE - pagesize;
|
stacksize = STACK_SIZE - pagesize;
|
||||||
if (attr != NULL)
|
if (attr != NULL)
|
||||||
stacksize = MIN (stacksize, roundup(attr->__stacksize, pagesize));
|
stacksize = MIN (stacksize, roundup(attr->__stacksize, pagesize));
|
||||||
@ -450,7 +450,7 @@ static int pthread_allocate_stack(const pthread_attr_t *attr,
|
|||||||
/* on non-MMU systems we always have non-standard stack frames */
|
/* on non-MMU systems we always have non-standard stack frames */
|
||||||
__pthread_nonstandard_stacks = 1;
|
__pthread_nonstandard_stacks = 1;
|
||||||
|
|
||||||
#endif /* __ARCH_HAS_MMU__ */
|
#endif /* __ARCH_USE_MMU__ */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Clear the thread data structure. */
|
/* Clear the thread data structure. */
|
||||||
@ -495,7 +495,7 @@ static int pthread_handle_create(pthread_t *thread, const pthread_attr_t *attr,
|
|||||||
&new_thread, &new_thread_bottom,
|
&new_thread, &new_thread_bottom,
|
||||||
&guardaddr, &guardsize) == 0)
|
&guardaddr, &guardsize) == 0)
|
||||||
break;
|
break;
|
||||||
#ifndef __ARCH_HAS_MMU__
|
#ifndef __ARCH_USE_MMU__
|
||||||
else
|
else
|
||||||
/* When there is MMU, mmap () is used to allocate the stack. If one
|
/* When there is MMU, mmap () is used to allocate the stack. If one
|
||||||
* segment is already mapped, we should continue to see if we can
|
* segment is already mapped, we should continue to see if we can
|
||||||
@ -632,14 +632,14 @@ static int pthread_handle_create(pthread_t *thread, const pthread_attr_t *attr,
|
|||||||
/* Free the stack if we allocated it */
|
/* Free the stack if we allocated it */
|
||||||
if (attr == NULL || !attr->__stackaddr_set)
|
if (attr == NULL || !attr->__stackaddr_set)
|
||||||
{
|
{
|
||||||
#ifdef __ARCH_HAS_MMU__
|
#ifdef __ARCH_USE_MMU__
|
||||||
if (new_thread->p_guardsize != 0)
|
if (new_thread->p_guardsize != 0)
|
||||||
munmap(new_thread->p_guardaddr, new_thread->p_guardsize);
|
munmap(new_thread->p_guardaddr, new_thread->p_guardsize);
|
||||||
munmap((caddr_t)((char *)(new_thread+1) - INITIAL_STACK_SIZE),
|
munmap((caddr_t)((char *)(new_thread+1) - INITIAL_STACK_SIZE),
|
||||||
INITIAL_STACK_SIZE);
|
INITIAL_STACK_SIZE);
|
||||||
#else
|
#else
|
||||||
free(new_thread_bottom);
|
free(new_thread_bottom);
|
||||||
#endif /* __ARCH_HAS_MMU__ */
|
#endif /* __ARCH_USE_MMU__ */
|
||||||
}
|
}
|
||||||
__pthread_handles[sseg].h_descr = NULL;
|
__pthread_handles[sseg].h_descr = NULL;
|
||||||
__pthread_handles[sseg].h_bottom = NULL;
|
__pthread_handles[sseg].h_bottom = NULL;
|
||||||
@ -716,7 +716,7 @@ static void pthread_free(pthread_descr th)
|
|||||||
|
|
||||||
/* If initial thread, nothing to free */
|
/* If initial thread, nothing to free */
|
||||||
if (th == &__pthread_initial_thread) return;
|
if (th == &__pthread_initial_thread) return;
|
||||||
#ifdef __ARCH_HAS_MMU__
|
#ifdef __ARCH_USE_MMU__
|
||||||
if (!th->p_userstack)
|
if (!th->p_userstack)
|
||||||
{
|
{
|
||||||
/* Free the stack and thread descriptor area */
|
/* Free the stack and thread descriptor area */
|
||||||
@ -729,7 +729,7 @@ static void pthread_free(pthread_descr th)
|
|||||||
if (!th->p_userstack) {
|
if (!th->p_userstack) {
|
||||||
free(h_bottom_save);
|
free(h_bottom_save);
|
||||||
}
|
}
|
||||||
#endif /* __ARCH_HAS_MMU__ */
|
#endif /* __ARCH_USE_MMU__ */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Handle threads that have exited */
|
/* Handle threads that have exited */
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
#ifdef __ARCH_HAS_MMU__
|
#ifdef __ARCH_USE_MMU__
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -172,9 +172,9 @@ char *__pthread_initial_thread_bos = NULL;
|
|||||||
* This is adapted when other stacks are malloc'ed since we don't know
|
* This is adapted when other stacks are malloc'ed since we don't know
|
||||||
* the bounds a-priori. -StS */
|
* the bounds a-priori. -StS */
|
||||||
|
|
||||||
#ifndef __ARCH_HAS_MMU__
|
#ifndef __ARCH_USE_MMU__
|
||||||
char *__pthread_initial_thread_tos = NULL;
|
char *__pthread_initial_thread_tos = NULL;
|
||||||
#endif /* __ARCH_HAS_MMU__ */
|
#endif /* __ARCH_USE_MMU__ */
|
||||||
|
|
||||||
/* File descriptor for sending requests to the thread manager. */
|
/* File descriptor for sending requests to the thread manager. */
|
||||||
/* Initially -1, meaning that the thread manager is not running. */
|
/* Initially -1, meaning that the thread manager is not running. */
|
||||||
@ -363,7 +363,7 @@ static void pthread_initialize(void)
|
|||||||
{
|
{
|
||||||
struct sigaction sa;
|
struct sigaction sa;
|
||||||
sigset_t mask;
|
sigset_t mask;
|
||||||
#ifdef __ARCH_HAS_MMU__
|
#ifdef __ARCH_USE_MMU__
|
||||||
struct rlimit limit;
|
struct rlimit limit;
|
||||||
rlim_t max_stack;
|
rlim_t max_stack;
|
||||||
#endif
|
#endif
|
||||||
@ -410,7 +410,7 @@ static void pthread_initialize(void)
|
|||||||
beyond STACK_SIZE minus two pages (one page for the thread descriptor
|
beyond STACK_SIZE minus two pages (one page for the thread descriptor
|
||||||
immediately beyond, and one page to act as a guard page). */
|
immediately beyond, and one page to act as a guard page). */
|
||||||
|
|
||||||
#ifdef __ARCH_HAS_MMU__
|
#ifdef __ARCH_USE_MMU__
|
||||||
/* We cannot allocate a huge chunk of memory to mmap all thread stacks later
|
/* We cannot allocate a huge chunk of memory to mmap all thread stacks later
|
||||||
* on a non-MMU system. Thus, we don't need the rlimit either. -StS */
|
* on a non-MMU system. Thus, we don't need the rlimit either. -StS */
|
||||||
getrlimit(RLIMIT_STACK, &limit);
|
getrlimit(RLIMIT_STACK, &limit);
|
||||||
@ -429,7 +429,7 @@ static void pthread_initialize(void)
|
|||||||
__pthread_initial_thread_bos = (char *) 1; /* set it non-zero so we know we have been here */
|
__pthread_initial_thread_bos = (char *) 1; /* set it non-zero so we know we have been here */
|
||||||
PDEBUG("initial thread stack bounds: bos=%p, tos=%p\n",
|
PDEBUG("initial thread stack bounds: bos=%p, tos=%p\n",
|
||||||
__pthread_initial_thread_bos, __pthread_initial_thread_tos);
|
__pthread_initial_thread_bos, __pthread_initial_thread_tos);
|
||||||
#endif /* __ARCH_HAS_MMU__ */
|
#endif /* __ARCH_USE_MMU__ */
|
||||||
|
|
||||||
/* Setup signal handlers for the initial thread.
|
/* Setup signal handlers for the initial thread.
|
||||||
Since signal handlers are shared between threads, these settings
|
Since signal handlers are shared between threads, these settings
|
||||||
|
@ -648,7 +648,7 @@ static int pthread_handle_create(pthread_t *thread, const pthread_attr_t *attr,
|
|||||||
new_thread = (pthread_descr) stack_addr;
|
new_thread = (pthread_descr) stack_addr;
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
#ifndef __ARCH_HAS_MMU__
|
#ifndef __ARCH_USE_MMU__
|
||||||
} else {
|
} else {
|
||||||
/* When there is MMU, mmap () is used to allocate the stack. If one
|
/* When there is MMU, mmap () is used to allocate the stack. If one
|
||||||
* segment is already mapped, we should continue to see if we can
|
* segment is already mapped, we should continue to see if we can
|
||||||
|
@ -17,7 +17,7 @@ libutil_DIR := $(top_srcdir)libutil
|
|||||||
libutil_OUT := $(top_builddir)libutil
|
libutil_OUT := $(top_builddir)libutil
|
||||||
|
|
||||||
libutil_SRC := $(wildcard $(libutil_DIR)/*.c)
|
libutil_SRC := $(wildcard $(libutil_DIR)/*.c)
|
||||||
ifneq ($(ARCH_HAS_MMU),y)
|
ifneq ($(ARCH_USE_MMU),y)
|
||||||
libutil_SRC := $(filter-out $(libutil_DIR)/forkpty.c,$(libutil_SRC))
|
libutil_SRC := $(filter-out $(libutil_DIR)/forkpty.c,$(libutil_SRC))
|
||||||
endif
|
endif
|
||||||
libutil_OBJ := $(patsubst $(libutil_DIR)/%.c,$(libutil_OUT)/%.o,$(libutil_SRC))
|
libutil_OBJ := $(patsubst $(libutil_DIR)/%.c,$(libutil_OUT)/%.o,$(libutil_SRC))
|
||||||
|
@ -193,7 +193,7 @@ timeout_handler (int sig __attribute__ ((unused)))
|
|||||||
int
|
int
|
||||||
main (int argc, char *argv[])
|
main (int argc, char *argv[])
|
||||||
{
|
{
|
||||||
#ifdef __ARCH_HAS_MMU__
|
#ifdef __ARCH_USE_MMU__
|
||||||
int direct = 0; /* Directly call the test function? */
|
int direct = 0; /* Directly call the test function? */
|
||||||
#else
|
#else
|
||||||
int direct = 1;
|
int direct = 1;
|
||||||
|
@ -32,7 +32,7 @@
|
|||||||
#define GOT2 (1 << 2)
|
#define GOT2 (1 << 2)
|
||||||
#define GOT3 (1 << 3)
|
#define GOT3 (1 << 3)
|
||||||
|
|
||||||
#ifdef __ARCH_HAS_MMU__
|
#ifdef __ARCH_USE_MMU__
|
||||||
|
|
||||||
void child_handler(int sig)
|
void child_handler(int sig)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user