Annotation of cci/sys/tahoe/Aexception.c, revision 1.1.1.1

1.1       root        1: 
                      2: #include "../machine/alignment.h" 
                      3: exception(infop, type, param1, param2)
                      4: process_info *infop;
                      5: int    type, param1, param2;
                      6: {
                      7: /*
                      8:  * Signal an exception. It will be handled by 'locore.s'. Here, I:
                      9:  *     1) Put the exception code where it belongs on the stack.
                     10:  *     2) Restore pc and sp to show that the current opcode
                     11:  *             'was not executed'.
                     12:  *     3) Execute one big non-local-goto. In the process we take care
                     13:  *             to reset the current HW fp such that 'alignment' will
                     14:  *             indeed return to 'locore.s'.
                     15:  *             IMPORTANT NOTE : the process I use will NOT restore
                     16:  *             all registers (like normal returns) so the call to the
                     17:  *             handling routine HAS TO BE the last thing in 'alignment'.
                     18:  *             Otherwise, all its own register variables will be a mess !!
                     19:  *             I also know that 'alignment' itself WILL restore all
                     20:  *             registers for 'locore.s' since its entry mask is all-1.
                     21:  */
                     22:        register long *my_fp;
                     23:        register long *current_fp, *prev_fp;
                     24: 
                     25:        my_fp = (long *)&infop-1 ;
                     26:        infop->ret_exception = type;
                     27:        switch (type) {
                     28:        case ARITHMETIC:
                     29:                infop->ret_code = param1;
                     30:                break;
                     31:        case ILL_ACCESS:
                     32:                infop->ret_addr = param1;
                     33:                infop->ret_code = param2;
                     34:                break;
                     35:        case ALIGNMENT:
                     36:        case ILL_ADDRMOD:
                     37:        case ILL_OPRND:
                     38:                break;
                     39:        default :
                     40:                printf ("Bad exception type %d (alignment code)\n", type);
                     41:                break;
                     42:        }
                     43: /*
                     44:  * Now the big trick. Look up the stack until the frame of
                     45:  * 'alignment' is found. prev_fp will point to it and current_fp
                     46:  * will then point to the frame of whoever 'alignment' called.
                     47:  * This should better work ...
                     48:  */
                     49:        prev_fp = my_fp;
                     50:        while (prev_fp != &fp) {
                     51:                current_fp = prev_fp;
                     52:                prev_fp = (long *) *prev_fp;
                     53:        }
                     54: /*
                     55:  * Found it. Now fool the HW into thinking that 'alignment' called
                     56:  * us directly here, so this routine's 'return' will go back
                     57:  * all the way to 'alignment', stopping any further emulation
                     58:  * for the current offending opcode.
                     59:  *  "fool the HW..." ha ha, am I realy fooling myself ?
                     60:  */
                     61:        *my_fp = *current_fp;
                     62:        *(my_fp - 2) = *(current_fp -2);        /* Alter program counter */
                     63: /*
                     64:  * Without further ado, just go back now !!!!
                     65:  */
                     66: }
                     67: 
                     68: not_needed (infop)
                     69: process_info *infop;
                     70: {
                     71: /*
                     72:  * Shouldn't ever come to this routine.
                     73:  */
                     74: 
                     75:        printf ("Opcode 0x%x should not trap to alignment code.",
                     76:                opCODE);
                     77:        printf (" OS or machine problem!! \n");
                     78: }
                     79: 
                     80: 
                     81: cannot_do (infop)
                     82: process_info *infop;
                     83: {
                     84: /*
                     85:  * Some opcode-caused alignments cannot be emulated. See table.c for
                     86:  * specific reasons. Reflect this back to the process as alignment
                     87:  * exception.
                     88:  */
                     89:        exception (infop, ALIGNMENT);
                     90: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.