Annotation of tme/machine/sun2/sun2-control.c, revision 1.1

1.1     ! root        1: /* $Id: sun2-control.c,v 1.3 2003/05/03 19:26:38 fredette Exp $ */
        !             2: 
        !             3: /* machine/sun2/sun2-control.c - implementation of Sun 2 emulation control space: */
        !             4: 
        !             5: /*
        !             6:  * Copyright (c) 2003 Matt Fredette
        !             7:  * All rights reserved.
        !             8:  *
        !             9:  * Redistribution and use in source and binary forms, with or without
        !            10:  * modification, are permitted provided that the following conditions
        !            11:  * are met:
        !            12:  * 1. Redistributions of source code must retain the above copyright
        !            13:  *    notice, this list of conditions and the following disclaimer.
        !            14:  * 2. Redistributions in binary form must reproduce the above copyright
        !            15:  *    notice, this list of conditions and the following disclaimer in the
        !            16:  *    documentation and/or other materials provided with the distribution.
        !            17:  * 3. All advertising materials mentioning features or use of this software
        !            18:  *    must display the following acknowledgement:
        !            19:  *      This product includes software developed by Matt Fredette.
        !            20:  * 4. The name of the author may not be used to endorse or promote products
        !            21:  *    derived from this software without specific prior written permission.
        !            22:  *
        !            23:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
        !            24:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
        !            25:  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
        !            26:  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
        !            27:  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
        !            28:  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
        !            29:  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            30:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
        !            31:  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
        !            32:  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
        !            33:  * POSSIBILITY OF SUCH DAMAGE.
        !            34:  */
        !            35: 
        !            36: #include <tme/common.h>
        !            37: _TME_RCSID("$Id: sun2-control.c,v 1.3 2003/05/03 19:26:38 fredette Exp $");
        !            38: 
        !            39: /* includes: */
        !            40: #include "sun2-impl.h"
        !            41: 
        !            42: /* macros: */
        !            43: 
        !            44: /* the bus cycle handler for function code three space: */
        !            45: int
        !            46: _tme_sun2_control_cycle_handler(void *_sun2, struct tme_bus_cycle *cycle_init)
        !            47: {
        !            48:   struct tme_sun2 *sun2;
        !            49:   struct tme_bus_cycle cycle_resp;
        !            50:   tme_bus_addr_t reg, address, index;
        !            51:   tme_uint32_t pte;
        !            52:   int rc;
        !            53: 
        !            54:   /* recover our sun2: */
        !            55:   sun2 = (struct tme_sun2 *) _sun2;
        !            56: 
        !            57:   /* get the register and address and index: */
        !            58:   reg = cycle_init->tme_bus_cycle_address & (TME_SUN2_PAGE_SIZE - 1);
        !            59:   reg = TME_MIN(reg, TME_SUN2_CONTROL_JUNK);
        !            60:   address = cycle_init->tme_bus_cycle_address & ~(TME_SUN2_PAGE_SIZE - 1);
        !            61:   index = address >> TME_SUN2_PAGE_SIZE_LOG2;
        !            62: 
        !            63:   /* this macro evaluates to TRUE whenever a register is maybe being
        !            64:      accessed: */
        !            65: #define _TME_SUN2_REG_ACCESSED(icreg)                          \
        !            66:   TME_RANGES_OVERLAP(reg,                                      \
        !            67:                     reg                                        \
        !            68:                     + cycle_init->tme_bus_cycle_size - 1,      \
        !            69:                     TME_SUN2_CONTROL_ADDRESS(icreg),           \
        !            70:                     TME_SUN2_CONTROL_ADDRESS(icreg)            \
        !            71:                     + sizeof(sun2->icreg) - 1)
        !            72: 
        !            73:   /* whenever the page map register is accessed, we need to fill it
        !            74:      before running the cycle: */
        !            75:   if (_TME_SUN2_REG_ACCESSED(tme_sun2_pgmap_hi)
        !            76:       || _TME_SUN2_REG_ACCESSED(tme_sun2_pgmap_lo)) {
        !            77: 
        !            78:     /* get the PTE from the MMU: */
        !            79:     rc = _tme_sun2_mmu_pte_get(sun2, address, &pte);
        !            80:     assert(rc == TME_OK);
        !            81:     sun2->tme_sun2_pgmap_hi = (pte >> 16);
        !            82:     sun2->tme_sun2_pgmap_lo = (pte & 0xffff);
        !            83:   }
        !            84: 
        !            85:   /* whenever the segment map register is accessed, we need to fill it
        !            86:      before running the cycle: */
        !            87:   if (_TME_SUN2_REG_ACCESSED(tme_sun2_segmap)
        !            88:       && cycle_init->tme_bus_cycle_type == TME_BUS_CYCLE_READ) {
        !            89:     sun2->tme_sun2_segmap = tme_sun_mmu_segmap_get(sun2->tme_sun2_mmu, sun2->tme_sun2_context_user, address);
        !            90:   }
        !            91: 
        !            92:   /* whenever the IDPROM register is accessed, we need to fill it
        !            93:      before running the cycle: */
        !            94:   if (_TME_SUN2_REG_ACCESSED(tme_sun2_idprom)
        !            95:       && index < sizeof(sun2->tme_sun2_idprom_contents)) {
        !            96:     sun2->tme_sun2_idprom = sun2->tme_sun2_idprom_contents[index];
        !            97:   }
        !            98: 
        !            99:   /* run the cycle: */
        !           100:   TME_SUN2_CONTROL_BUS_CYCLE(sun2, reg, &cycle_resp);
        !           101:   cycle_resp.tme_bus_cycle_type = (cycle_init->tme_bus_cycle_type
        !           102:                                   ^ (TME_BUS_CYCLE_WRITE
        !           103:                                      | TME_BUS_CYCLE_READ));
        !           104:   cycle_resp.tme_bus_cycle_lane_routing = cycle_init->tme_bus_cycle_lane_routing;
        !           105:   tme_bus_cycle_xfer(cycle_init, &cycle_resp);
        !           106: 
        !           107:   /* whenever the bus error register is read or written, it is
        !           108:      cleared: */
        !           109:   if (_TME_SUN2_REG_ACCESSED(tme_sun2_buserr)) {
        !           110:     sun2->tme_sun2_buserr = 0;
        !           111:   }
        !           112: 
        !           113:   /* these registers only need action taken when they're written: */
        !           114:   if (cycle_init->tme_bus_cycle_type == TME_BUS_CYCLE_WRITE) {
        !           115:     
        !           116:     /* the page map has been written: */
        !           117:     if (_TME_SUN2_REG_ACCESSED(tme_sun2_pgmap_hi)
        !           118:        || _TME_SUN2_REG_ACCESSED(tme_sun2_pgmap_lo)) {
        !           119:       pte = sun2->tme_sun2_pgmap_hi;
        !           120:       pte = (pte << 16) | sun2->tme_sun2_pgmap_lo;
        !           121:       rc = _tme_sun2_mmu_pte_set(sun2, address, pte);
        !           122:       assert(rc == TME_OK);
        !           123:     }
        !           124: 
        !           125:     /* the segment map has been written: */
        !           126:     if (_TME_SUN2_REG_ACCESSED(tme_sun2_segmap)) {
        !           127:        tme_sun_mmu_segmap_set(sun2->tme_sun2_mmu, sun2->tme_sun2_context_user, address, sun2->tme_sun2_segmap);
        !           128:     }
        !           129: 
        !           130:     /* the system context register has been written: */
        !           131:     if (_TME_SUN2_REG_ACCESSED(tme_sun2_context_system)) {
        !           132:       _tme_sun2_mmu_context_system_set(sun2);
        !           133:     }
        !           134: 
        !           135:     /* the system context register has been written: */
        !           136:     if (_TME_SUN2_REG_ACCESSED(tme_sun2_context_user)) {
        !           137:       _tme_sun2_mmu_context_user_set(sun2);
        !           138:     }
        !           139: 
        !           140:     /* the diag register has been written: */
        !           141:     if (_TME_SUN2_REG_ACCESSED(tme_sun2_diag)) {
        !           142:       /* TBD */
        !           143:     }
        !           144: 
        !           145:     /* the system enable register has been written: */
        !           146:     if (_TME_SUN2_REG_ACCESSED(tme_sun2_enable)) {
        !           147:       rc = _tme_sun2_ipl_check(sun2);
        !           148:       assert(rc == TME_OK);
        !           149:     }
        !           150:   }
        !           151: 
        !           152:   return (TME_OK);
        !           153: }
        !           154: 
        !           155: #if 1
        !           156: #include <stdio.h>
        !           157: 
        !           158: /* this dumps out the sun2 state: */
        !           159: void
        !           160: tme_sun2_dump(struct tme_sun2 *sun2)
        !           161: {
        !           162:   
        !           163:   /* dump out the page map register: */
        !           164:   fprintf(stderr, "PGMAP = 0x%04x%04x\n",
        !           165:          sun2->tme_sun2_pgmap_hi,
        !           166:          sun2->tme_sun2_pgmap_lo);
        !           167:   fprintf(stderr, "SEGMAP = 0x%02x\n", sun2->tme_sun2_segmap);
        !           168:   fprintf(stderr, "\n");
        !           169:   fprintf(stderr, "SCONTEXT = 0x%02x\n", sun2->tme_sun2_context_system);
        !           170:   fprintf(stderr, " CONTEXT = 0x%02x\n", sun2->tme_sun2_context_user);
        !           171:   fprintf(stderr, "\n");
        !           172:   fprintf(stderr, "IDPROM = 0x%02x\n", sun2->tme_sun2_idprom);
        !           173:   fprintf(stderr, "DIAG = 0x%02x\n", sun2->tme_sun2_diag);
        !           174:   fprintf(stderr, "BUSERR = 0x%04x\n", sun2->tme_sun2_buserr);
        !           175:   fprintf(stderr, "ENABLE = 0x%04x\n", sun2->tme_sun2_enable);
        !           176: }
        !           177: #endif /* 1 */

unix.superglobalmegacorp.com

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