void NT_initialize_fov (SCHEME_OBJECT fov) { int ctr, in; SCHEME_OBJECT iv, imv, prim; static int interrupt_numbers[2] = { Global_GC_Level, Global_1_Level, }; static long interrupt_masks[2] = { 0, /* No interrupts allowed */ (INT_Stack_Overflow | INT_Global_GC | INT_GC), }; iv = (VECTOR_REF (fov, SYSTEM_INTERRUPT_VECTOR)); imv = (VECTOR_REF (fov, FIXOBJ_INTERRUPT_MASK_VECTOR)); prim = (make_primitive ("MICROCODE-POLL-INTERRUPT-HANDLER", 2)); for (ctr = 0; ctr < ((sizeof (interrupt_numbers)) / (sizeof (int))); ctr++) { in = interrupt_numbers[ctr]; VECTOR_SET (iv, in, prim); VECTOR_SET (imv, in, (long_to_integer (interrupt_masks[ctr]))); } return; }
#include "scheme.h" #include "prims.h" #include "osio.h" #include "ux.h" #include "uxproc.h" extern int UX_channel_descriptor (Tchannel channel); static const char ** string_vector_arg (int arg); static int string_vector_p (SCHEME_OBJECT vector); static const char ** convert_string_vector (SCHEME_OBJECT vector); DEFINE_PRIMITIVE ("CHANNEL-DESCRIPTOR", Prim_channel_descriptor, 1, 1, 0) { PRIMITIVE_HEADER (1); PRIMITIVE_RETURN (long_to_integer (UX_channel_descriptor (arg_channel (1)))); } #define PROCESS_CHANNEL_ARG(arg, type, channel) \ { \ if ((ARG_REF (arg)) == SHARP_F) \ (type) = process_channel_type_none; \ else if ((ARG_REF (arg)) == (LONG_TO_FIXNUM (-1))) \ (type) = process_channel_type_inherit; \ else if ((ARG_REF (arg)) == (LONG_TO_FIXNUM (-2))) \ { \ if (ctty_type != process_ctty_type_explicit) \ error_bad_range_arg (arg); \ (type) = process_channel_type_ctty; \ } \ else \
static void setup_trap_frame (int signo, SIGINFO_T info, SIGCONTEXT_T * scp, struct trap_recovery_info * trinfo, SCHEME_OBJECT * new_stack_pointer) { unsigned long saved_mask = GET_INT_MASK; SCHEME_OBJECT handler; SCHEME_OBJECT signal_name; SET_INTERRUPT_MASK (0); /* To prevent GC for now. */ handler = ((VECTOR_P (fixed_objects)) ? (VECTOR_REF (fixed_objects, TRAP_HANDLER)) : SHARP_F); if (!INTERPRETER_APPLICABLE_P (handler)) { fprintf (stderr, "There is no trap handler for recovery!\n"); fflush (stderr); termination_trap (); } signal_name = ((signo != 0) ? (char_pointer_to_string (find_signal_name (signo))) : SHARP_F); if (!FREE_OK_P (Free)) REQUEST_GC (0); if (new_stack_pointer != 0) stack_pointer = new_stack_pointer; else { INITIALIZE_STACK (); Will_Push (CONTINUATION_SIZE); SET_RC (RC_END_OF_COMPUTATION); SET_EXP (SHARP_F); SAVE_CONT (); Pushed (); } Will_Push (7 + CONTINUATION_SIZE); STACK_PUSH (trinfo -> extra_trap_info); STACK_PUSH (trinfo -> pc_info_2); STACK_PUSH (trinfo -> pc_info_1); STACK_PUSH (trinfo -> state); STACK_PUSH (BOOLEAN_TO_OBJECT (new_stack_pointer != 0)); STACK_PUSH (find_signal_code_name (signo, info, scp)); STACK_PUSH (signal_name); SET_RC (RC_HARDWARE_TRAP); SET_EXP (long_to_integer (signo)); SAVE_CONT (); Pushed (); if ((new_stack_pointer != 0) /* This may want to do it in other cases, but this may be enough. */ && ((trinfo -> state) == STATE_COMPILED_CODE)) stop_history (); history_register = (make_dummy_history ()); Will_Push (STACK_ENV_EXTRA_SLOTS + 2); STACK_PUSH (signal_name); STACK_PUSH (handler); PUSH_APPLY_FRAME_HEADER (1); Pushed (); SET_INTERRUPT_MASK (saved_mask); abort_to_interpreter (PRIM_APPLY); }