summaryrefslogtreecommitdiffstats
path: root/private/mvdm/softpc.new/base/ccpu386/enter.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/mvdm/softpc.new/base/ccpu386/enter.c')
-rw-r--r--private/mvdm/softpc.new/base/ccpu386/enter.c199
1 files changed, 199 insertions, 0 deletions
diff --git a/private/mvdm/softpc.new/base/ccpu386/enter.c b/private/mvdm/softpc.new/base/ccpu386/enter.c
new file mode 100644
index 000000000..8d6feac59
--- /dev/null
+++ b/private/mvdm/softpc.new/base/ccpu386/enter.c
@@ -0,0 +1,199 @@
+/*[
+
+enter.c
+
+LOCAL CHAR SccsID[]="@(#)enter.c 1.7 01/19/95";
+
+ENTER CPU functions.
+--------------------
+
+]*/
+
+
+#include <insignia.h>
+
+#include <host_def.h>
+#include <xt.h>
+#include <c_main.h>
+#include <c_addr.h>
+#include <c_bsic.h>
+#include <c_prot.h>
+#include <c_seg.h>
+#include <c_stack.h>
+#include <c_xcptn.h>
+#include <c_reg.h>
+#include <enter.h>
+#include <c_page.h>
+#include <fault.h>
+
+
+/*
+ =====================================================================
+ EXTERNAL ROUTINES STARTS HERE.
+ =====================================================================
+ */
+
+
+GLOBAL VOID
+ENTER16
+
+IFN2(
+ IU32, op1, /* immediate data space required */
+ IU32, op2 /* level (indicates parameters which must be copied) */
+ )
+
+
+ {
+ IU32 frame_ptr;
+
+ IS32 p_delta = 0; /* posn of parameter relative to BP */
+ IU32 p_addr; /* memory address of parameter */
+ IU32 param; /* parameter read via BP */
+
+ op2 &= 0x1f; /* take level MOD 32 */
+
+ /* check room on stack for new data */
+ validate_stack_space(USE_SP, (ISM32)op2+1);
+
+ /* check old parameters exist */
+ if ( op2 > 1 )
+ {
+ /*
+ BP is pointing to the old stack before the parameters
+ were actually pushed, we therefore test for the presence
+ of the parameters by seeing if they could have been pushed,
+ if so they exist now.
+
+ We have to take care of the READ/WRITE stack addressability
+ ourselves. Because we have checked the new data can be
+ written we know the next call can not fail because of access
+ problems, however we don't yet know if the stack is readable.
+
+ Note we have been a bit severe on the paging unit because we
+ are asking if the old parameters could be written, if so they
+ can certainly be read from the point of view of the paging
+ unit!
+ */
+ /* do access check */
+ if ( GET_SS_AR_R() == 0 )
+ SF((IU16)0, FAULT_ENTER16_ACCESS);
+
+ /* now we know 'frigged' limit check is ok */
+ validate_stack_space(USE_BP, (ISM32)op2-1);
+ }
+
+ /* all ok - process instruction */
+
+ spush((IU32)GET_BP()); /* push BP */
+ frame_ptr = GetStackPointer(); /* save (E)SP */
+
+ if ( op2 > 0 )
+ {
+ /* level is >=1, copy stack parameters if they exist */
+ while ( --op2 > 0 )
+ {
+ /* copy parameter */
+ p_delta -= 2; /* decrement to next parameter */
+
+ /* calculate parameter address in 32/16bit arithmetic */
+ p_addr = get_current_BP() + p_delta;
+ if ( GET_SS_AR_X() == 0 ) /* look at SS 'B' bit */
+ p_addr &= WORD_MASK;
+
+ p_addr += GET_SS_BASE();
+
+ param = (IU32)vir_read_word(p_addr, NO_PHYSICAL_MAPPING);
+ spush(param);
+ }
+ spush((IU32)frame_ptr); /* save old (E)SP */
+ }
+
+ /* update (E)BP */
+ set_current_BP(frame_ptr);
+
+ /* finally allocate immediate data space on stack */
+ if ( op1 )
+ byte_change_SP((IS32)-op1);
+ }
+
+GLOBAL VOID
+ENTER32
+
+IFN2(
+ IU32, op1, /* immediate data space required */
+ IU32, op2 /* level (indicates parameters which must be copied) */
+ )
+
+
+ {
+ IU32 frame_ptr;
+
+ IS32 p_delta = 0; /* posn of parameter relative to EBP */
+ IU32 p_addr; /* memory address of parameter */
+ IU32 param; /* parameter read via EBP */
+
+ op2 &= 0x1f; /* take level MOD 32 */
+
+ /* check room on stack for new data */
+ validate_stack_space(USE_SP, (ISM32)op2+1);
+
+ /* check old parameters exist */
+ if ( op2 > 1 )
+ {
+ /*
+ EBP is pointing to the old stack before the parameters
+ were actually pushed, we therefore test for the presence
+ of the parameters by seeing if they could have been pushed,
+ if so they exist now.
+
+ We have to take care of the READ/WRITE stack addressability
+ ourselves. Because we have checked the new data can be
+ written we know the next call can not fail because of access
+ problems, however we don't yet know if the stack is readable.
+
+ Note we have been a bit severe on the paging unit because we
+ are asking if the old parameters could be written, if so they
+ can certainly be read from the point of view of the paging
+ unit!
+ */
+ /* do access check */
+ if ( GET_SS_AR_R() == 0 )
+ SF((IU16)0, FAULT_ENTER32_ACCESS);
+
+ /* now we know 'frigged' limit check is ok */
+ validate_stack_space(USE_BP, (ISM32)op2-1);
+ }
+
+ /* all ok - process instruction */
+
+ spush((IU32)GET_EBP()); /* push EBP */
+ frame_ptr = GetStackPointer(); /* save (E)SP */
+
+ if ( op2 > 0 )
+ {
+ /* level is >=1, copy stack parameters if they exist */
+ while ( --op2 > 0 )
+ {
+ /* copy parameter */
+ p_delta -= 4; /* decrement to next parameter */
+
+ /* calculate parameter address in 32/16bit arithmetic */
+ p_addr = get_current_BP() + p_delta;
+ if ( GET_SS_AR_X() == 0 ) /* look at SS 'B' bit */
+ p_addr &= WORD_MASK;
+
+ p_addr += GET_SS_BASE();
+
+ param = (IU32)vir_read_dword(p_addr, NO_PHYSICAL_MAPPING);
+ spush(param);
+ }
+ spush((IU32)frame_ptr); /* save old (E)SP */
+ }
+
+ /* update (E)BP */
+ set_current_BP(frame_ptr);
+
+ /* finally allocate immediate data space on stack */
+ if ( op1 )
+ byte_change_SP((IS32)-op1);
+ }