MIPS cleanup-related patches, from Thiemo Seufer
... prefer LISP_FEATURE_FOO preprocessor things
Message-ID: <
20050422212841.GD10767@hattusa.textio>
... C style cleanups
Message-ID: <
20050422214218.GF10767@hattusa.textio>
... more strenuous os_flush_icache. "Should make no difference
in theory, but seems to in practice"
Message-ID: <
20050422220354.GG10767@hattusa.textio>
... prefer type \n name() C function name style;
conditionally compile the alpha stuff in segv handler;
remove (unused) sigcont handler
Message-ID: <
20050422222628.GI10767@hattusa.textio>
-;;; FIXME: Is this right?
(defun sanctify-for-execution (component)
(without-gcing
(alien-funcall (extern-alien "os_flush_icache"
(defun sanctify-for-execution (component)
(without-gcing
(alien-funcall (extern-alien "os_flush_icache"
printf("Flipping spaces ...\n");
#endif
printf("Flipping spaces ...\n");
#endif
- os_zero((os_vm_address_t) current_dynamic_space,
+ /* Maybe FIXME: it's possible that we could significantly reduce
+ * RSS by zeroing the from_space or madvise(MADV_DONTNEED) or
+ * similar os-dependent tricks here */
+ os_zero((os_vm_address_t) from_space,
(os_vm_size_t) DYNAMIC_SPACE_SIZE);
current_dynamic_space = new_space;
(os_vm_size_t) DYNAMIC_SPACE_SIZE);
current_dynamic_space = new_space;
#endif
size_retained = (new_space_free_pointer - new_space) * sizeof(lispobj);
#endif
size_retained = (new_space_free_pointer - new_space) * sizeof(lispobj);
+ os_flush_icache((os_vm_address_t)new_space, size_retained);
+
/* Zero stack. */
#ifdef PRINTNOISE
printf("Zeroing empty part of control stack ...\n");
/* Zero stack. */
#ifdef PRINTNOISE
printf("Zeroing empty part of control stack ...\n");
printf("%10.2f M bytes/sec collected.\n", gc_rate);
#endif
printf("%10.2f M bytes/sec collected.\n", gc_rate);
#endif
- /* os_flush_icache((os_vm_address_t) 0, sizeof(unsigned long)); */
- /* Maybe FIXME: it's possible that we could significantly reduce
- * RSS by zeroing the from_space or madvise(MADV_DONTNEED) or
- * similar os-dependent tricks here */
os_context_t *context;
struct thread *th=arch_os_get_current_thread();
os_context_t *context;
struct thread *th=arch_os_get_current_thread();
- struct interrupt_data *data=
- th ? th->interrupt_data : global_interrupt_data;
index = fixnum_value(SymbolValue(FREE_INTERRUPT_CONTEXT_INDEX,0));
index = fixnum_value(SymbolValue(FREE_INTERRUPT_CONTEXT_INDEX,0));
-#ifndef LISP_FEATURE_X86 || LISP_FEATURE_X86_64
+#if !defined(LISP_FEATURE_X86) && ! defined(LISP_FEATURE_X86_64)
static long
scav_return_pc_header(lispobj *where, lispobj object)
{
static long
scav_return_pc_header(lispobj *where, lispobj object)
{
#else /* LANGUAGE_ASSEMBLY */
#else /* LANGUAGE_ASSEMBLY */
+#ifdef LISP_FEATURE_MIPS
#ifdef __linux__
#define EXTERN(name,bytes) .globl name
#else
#ifdef __linux__
#define EXTERN(name,bytes) .globl name
#else
+#ifdef LISP_FEATURE_SPARC
#ifdef SVR4
#define EXTERN(name,bytes) .global name
#else
#ifdef SVR4
#define EXTERN(name,bytes) .global name
#else
+#ifdef LISP_FEATURE_ALPHA
#ifdef __linux__
#define EXTERN(name,bytes) .globl name
#endif
#endif
#ifdef __linux__
#define EXTERN(name,bytes) .globl name
#endif
#endif
#ifdef LISP_FEATURE_DARWIN
#define EXTERN(name,bytes) .globl _/**/name
#else
#ifdef LISP_FEATURE_DARWIN
#define EXTERN(name,bytes) .globl _/**/name
#else
EXTERN(dynamic_space_free_pointer, 4)
EXTERN(current_dynamic_space, 4)
EXTERN(dynamic_space_free_pointer, 4)
EXTERN(current_dynamic_space, 4)
-#ifdef mips
-EXTERN(current_flags_register, 4)
-#endif
-
#endif /* LANGUAGE_ASSEMBLY */
#endif /* _INCLUDED_GLOBALS_H_ */
#endif /* LANGUAGE_ASSEMBLY */
#endif /* _INCLUDED_GLOBALS_H_ */
#ifdef reg_ALLOC
dynamic_space_free_pointer =
(lispobj *)(*os_context_register_addr(context, reg_ALLOC));
#ifdef reg_ALLOC
dynamic_space_free_pointer =
(lispobj *)(*os_context_register_addr(context, reg_ALLOC));
+#if defined(LISP_FEATURE_ALPHA)
if ((long)dynamic_space_free_pointer & 1) {
lose("dead in fake_foreign_function_call, context = %x", context);
}
if ((long)dynamic_space_free_pointer & 1) {
lose("dead in fake_foreign_function_call, context = %x", context);
}
int linux_sparc_siginfo_bug = 0;
int linux_no_threads_p = 0;
int linux_sparc_siginfo_bug = 0;
int linux_no_threads_p = 0;
{
/* Conduct various version checks: do we have enough mmap(), is
* this a sparc running 2.2, can we do threads? */
{
/* Conduct various version checks: do we have enough mmap(), is
* this a sparc running 2.2, can we do threads? */
+#ifdef LISP_FEATURE_SB_THREAD
struct utsname name;
int major_version;
int minor_version;
struct utsname name;
int major_version;
int minor_version;
os_vm_address_t
os_map(int fd, int offset, os_vm_address_t addr, os_vm_size_t len)
{
os_vm_address_t
os_map(int fd, int offset, os_vm_address_t addr, os_vm_size_t len)
{
- addr = mmap(addr, len,
- OS_VM_PROT_ALL,
- MAP_PRIVATE | MAP_FILE | MAP_FIXED,
- fd, (off_t) offset);
+ os_vm_address_t actual;
- if (addr == MAP_FAILED) {
+ actual = mmap(addr, len, OS_VM_PROT_ALL, MAP_PRIVATE | MAP_FIXED,
+ fd, (off_t) offset);
+ if (actual == MAP_FAILED || (addr && (addr != actual))) {
perror("mmap");
lose("unexpected mmap(..) failure");
}
perror("mmap");
lose("unexpected mmap(..) failure");
}
-/* FIXME: Now that FOO_END, rather than FOO_SIZE, is the fundamental
- * description of a space, we could probably punt this and just do
- * (FOO_START <= x && x < FOO_END) everywhere it's called. */
-static boolean
-in_range_p(os_vm_address_t a, lispobj sbeg, size_t slen)
-{
- char* beg = (char*)((long)sbeg);
- char* end = (char*)((long)sbeg) + slen;
- char* adr = (char*)a;
- return (adr >= beg && adr < end);
-}
-
boolean
is_valid_lisp_addr(os_vm_address_t addr)
{
struct thread *th;
boolean
is_valid_lisp_addr(os_vm_address_t addr)
{
struct thread *th;
- if(in_range_p(addr, READ_ONLY_SPACE_START, READ_ONLY_SPACE_SIZE) ||
- in_range_p(addr, STATIC_SPACE_START , STATIC_SPACE_SIZE) ||
- in_range_p(addr, DYNAMIC_SPACE_START , DYNAMIC_SPACE_SIZE))
+ size_t ad = (size_t) addr;
+
+ if ((READ_ONLY_SPACE_START <= ad && ad < READ_ONLY_SPACE_END)
+ || (STATIC_SPACE_START <= ad && ad < STATIC_SPACE_END)
+#if defined LISP_FEATURE_GENCGC
+ || (DYNAMIC_SPACE_START <= ad && ad < DYNAMIC_SPACE_END)
+#else
+ || (DYNAMIC_0_SPACE_START <= ad && ad < DYNAMIC_SPACE_END)
+ || (DYNAMIC_1_SPACE_START <= ad && ad < DYNAMIC_SPACE_END)
+#endif
+ )
return 1;
for_each_thread(th) {
return 1;
for_each_thread(th) {
- if((th->control_stack_start <= addr) && (addr < th->control_stack_end))
+ if((size_t)(th->control_stack_start) <= ad
+ && ad < (size_t)(th->control_stack_end))
- if(in_range_p(addr, th->binding_stack_start, BINDING_STACK_SIZE))
+ if((size_t)(th->binding_stack_start) <= ad
+ && ad < (size_t)(th->binding_stack_start + BINDING_STACK_SIZE))
* The GENCGC needs to be hooked into whatever signal is raised for
* page fault on this OS.
*/
* The GENCGC needs to be hooked into whatever signal is raised for
* page fault on this OS.
*/
sigsegv_handler(int signal, siginfo_t *info, void* void_context)
{
os_context_t *context = arch_os_get_context(&void_context);
sigsegv_handler(int signal, siginfo_t *info, void* void_context)
{
os_context_t *context = arch_os_get_context(&void_context);
sigsegv_handler(int signal, siginfo_t *info, void* void_context)
{
os_context_t *context = arch_os_get_context(&void_context);
sigsegv_handler(int signal, siginfo_t *info, void* void_context)
{
os_context_t *context = arch_os_get_context(&void_context);
+ os_vm_address_t addr = arch_get_bad_addr(signal,info,context);
- addr = arch_get_bad_addr(signal,info,context);
+#ifdef LISP_FEATURE_ALPHA
+ /* Alpha stuff: This is the end of a pseudo-atomic section during
+ which a signal was received. We must deal with the pending
+ interrupt (see also interrupt.c, ../code/interrupt.lisp)
+
+ (how we got here: when interrupting, we set bit 63 in reg_ALLOC.
+ At the end of the atomic section we tried to write to reg_ALLOC,
+ got a SIGSEGV (there's nothing mapped there) so ended up here. */
if (addr != NULL &&
*os_context_register_addr(context,reg_ALLOC) & (1L<<63)){
if (addr != NULL &&
*os_context_register_addr(context,reg_ALLOC) & (1L<<63)){
-
- /* Alpha stuff: This is the end of a pseudo-atomic section
- * during which a signal was received. We must deal with the
- * pending interrupt (see also interrupt.c,
- * ../code/interrupt.lisp)
- */
- /* (how we got here: when interrupting, we set bit 63 in
- * reg_Alloc. At the end of the atomic section we tried to
- * write to reg_ALLOC, got a SIGSEGV (there's nothing mapped
- * there) so ended up here
- */
*os_context_register_addr(context,reg_ALLOC) -= (1L<<63);
interrupt_handle_pending(context);
*os_context_register_addr(context,reg_ALLOC) -= (1L<<63);
interrupt_handle_pending(context);
- } else {
- if(!interrupt_maybe_gc(signal, info, context))
- if(!handle_guard_page_triggered(context,addr))
- interrupt_handle_now(signal, info, context);
-void sigcont_handler(int signal, siginfo_t *info, void *void_context)
-{
- /* We need to have a handler installed for this signal so that
- * sigwaitinfo() for it actually returns at the appropriate time.
- * We don't need it to actually do anything. This mkes it
- * possibly the only signal handler in SBCL that doesn't depend on
- * not-guaranteed-by-POSIX features
- */
+ if(!interrupt_maybe_gc(signal, info, context))
+ if(!handle_guard_page_triggered(context,addr))
+ interrupt_handle_now(signal, info, context);
void
os_install_interrupt_handlers(void)
void
os_install_interrupt_handlers(void)
}
#ifdef LISP_FEATURE_SB_THREAD
}
#ifdef LISP_FEATURE_SB_THREAD
-int futex_wait(int *lock_word, int oldval) {
+int
+futex_wait(int *lock_word, int oldval)
+{
int t= sys_futex(lock_word,FUTEX_WAIT,oldval, 0);
return t;
}
int t= sys_futex(lock_word,FUTEX_WAIT,oldval, 0);
return t;
}
-int futex_wake(int *lock_word, int n){
+
+int
+futex_wake(int *lock_word, int n)
+{
return sys_futex(lock_word,FUTEX_WAKE,n,0);
}
#endif
return sys_futex(lock_word,FUTEX_WAKE,n,0);
}
#endif
+#ifndef LISP_FEATURE_ALPHA
printf("0x%08lX: ", (unsigned long) addr);
#else
printf("0x%08X: ", (u32) addr);
#endif
if (is_valid_lisp_addr((os_vm_address_t)addr)) {
printf("0x%08lX: ", (unsigned long) addr);
#else
printf("0x%08X: ", (u32) addr);
#endif
if (is_valid_lisp_addr((os_vm_address_t)addr)) {
+#ifndef LISP_FEATURE_ALPHA
unsigned long *lptr = (unsigned long *)addr;
#else
u32 *lptr = (u32 *)addr;
unsigned long *lptr = (unsigned long *)addr;
#else
u32 *lptr = (u32 *)addr;
printf("RDONLY\t=\t0x%08lx\n",
(unsigned long)SymbolValue(READ_ONLY_SPACE_FREE_POINTER));
#endif /* 0 */
printf("RDONLY\t=\t0x%08lx\n",
(unsigned long)SymbolValue(READ_ONLY_SPACE_FREE_POINTER));
#endif /* 0 */
-#ifdef MIPS
- printf("FLAGS\t=\t0x%08x\n", current_flags_register);
-#endif
FSHOW((stderr, "/funcalling initial_function=0x%lx\n", initial_function));
create_initial_thread(initial_function);
lose("CATS. CATS ARE NICE.");
FSHOW((stderr, "/funcalling initial_function=0x%lx\n", initial_function));
create_initial_thread(initial_function);
lose("CATS. CATS ARE NICE.");
initial_thread_trampoline(struct thread *th)
{
lispobj function;
initial_thread_trampoline(struct thread *th)
{
lispobj function;
+#if defined(LISP_FEATURE_X86) || defined(LISP_FEATURE_X86_64)
function = th->unbound_marker;
th->unbound_marker = UNBOUND_MARKER_WIDETAG;
if(arch_os_thread_init(th)==0) return 1;
function = th->unbound_marker;
th->unbound_marker = UNBOUND_MARKER_WIDETAG;
if(arch_os_thread_init(th)==0) return 1;
BINDING_STACK_SIZE+
ALIEN_STACK_SIZE+
dynamic_values_bytes+
BINDING_STACK_SIZE+
ALIEN_STACK_SIZE+
dynamic_values_bytes+
- 32*SIGSTKSZ
- );
- if(!spaces) goto cleanup;
+ 32*SIGSTKSZ);
+ if(!spaces)
+ return NULL;
per_thread=(union per_thread_data *)
(spaces+
THREAD_CONTROL_STACK_SIZE+
BINDING_STACK_SIZE+
ALIEN_STACK_SIZE);
per_thread=(union per_thread_data *)
(spaces+
THREAD_CONTROL_STACK_SIZE+
BINDING_STACK_SIZE+
ALIEN_STACK_SIZE);
- th=&per_thread->thread;
if(all_threads) {
memcpy(per_thread,arch_os_get_current_thread(),
dynamic_values_bytes);
if(all_threads) {
memcpy(per_thread,arch_os_get_current_thread(),
dynamic_values_bytes);
+ th=&per_thread->thread;
th->control_stack_start = spaces;
th->binding_stack_start=
(lispobj*)((void*)th->control_stack_start+THREAD_CONTROL_STACK_SIZE);
th->control_stack_start = spaces;
th->binding_stack_start=
(lispobj*)((void*)th->control_stack_start+THREAD_CONTROL_STACK_SIZE);
th->unbound_marker=initial_function;
return th;
th->unbound_marker=initial_function;
return th;
- cleanup:
- /* if(th && th->tls_cookie>=0) os_free_tls_pointer(th); */
- if(spaces) os_invalidate(spaces,
- THREAD_CONTROL_STACK_SIZE+BINDING_STACK_SIZE+
- ALIEN_STACK_SIZE+dynamic_values_bytes);
- return 0;
}
void link_thread(struct thread *th,pid_t kid_pid)
}
void link_thread(struct thread *th,pid_t kid_pid)
;;; checkins which aren't released. (And occasionally for internal
;;; versions, especially for internal versions off the main CVS
;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
;;; checkins which aren't released. (And occasionally for internal
;;; versions, especially for internal versions off the main CVS
;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)