Annotation of coherent/b/kernel/i386/mem_cache.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * mem_cache.c - remember correspondences between virtual and physical
        !             3:  *     addresses.
        !             4:  */
        !             5: #include <sys/coherent.h>
        !             6: 
        !             7: #ifndef NULL
        !             8: #define NULL   ((char *) 0)
        !             9: #endif /* NULL */
        !            10: 
        !            11: /*
        !            12:  * We maintain a dynamicly allocated linked list of vaddr/paddr pairs.
        !            13:  */
        !            14: typedef struct cache_entry {
        !            15:        struct cache_entry *next;
        !            16:        struct cache_entry *prev;
        !            17: 
        !            18:        caddr_t vaddr;
        !            19:        paddr_t paddr;
        !            20: } CACHE_ENTRY;
        !            21: 
        !            22: static CACHE_ENTRY *find_vaddr();
        !            23: static CACHE_ENTRY *find_paddr();
        !            24: 
        !            25: /*
        !            26:  * cache_head is the head of the linked list of stored addresses.
        !            27:  */
        !            28: static CACHE_ENTRY *cache_head = NULL;
        !            29: 
        !            30: /*
        !            31:  * Remember that 'vaddr' and 'paddr' correspond.
        !            32:  *
        !            33:  * If we run out of memory, we just do a printf().  :-(
        !            34:  */
        !            35: void
        !            36: mem_remember(vaddr, paddr)
        !            37:        caddr_t vaddr;
        !            38:        paddr_t paddr;
        !            39: {
        !            40:        CACHE_ENTRY *entry;
        !            41: 
        !            42:        T_PIGGY( 0x40, printf("mem_remember(v:%x, p:%x)", vaddr, paddr); );
        !            43: 
        !            44:        /* Be sure to overwrite any existing entry.  */
        !            45:        if (NULL != (entry = find_paddr(paddr))) {
        !            46:                entry->vaddr = vaddr;
        !            47:                entry->paddr = paddr;
        !            48:        } else { /* We need to create a new entry.  */
        !            49:                if (NULL == (entry = kalloc(sizeof(CACHE_ENTRY)))) {
        !            50:                        printf(
        !            51:                        "mem_remember(v:%x, p:%x): no more kernel memory.\n",
        !            52:                        vaddr, paddr);
        !            53:                        return;
        !            54:                }
        !            55: 
        !            56:                T_PIGGY( 0x40, printf(": creating %x,", entry); );
        !            57: 
        !            58:                /* Store the data.  */
        !            59:                entry->vaddr = vaddr;
        !            60:                entry->paddr = paddr;
        !            61: 
        !            62:                /* Insert 'entry' at the head of the list.  */
        !            63:                entry->prev = NULL;
        !            64:                entry->next = cache_head;
        !            65:                if (NULL != cache_head) { cache_head->prev = entry; }
        !            66: 
        !            67:                cache_head = entry;
        !            68:        }
        !            69: } /* mem_remember() */
        !            70: 
        !            71: /*
        !            72:  * Forget the vaddr/paddr pair that goes with 'vaddr'.
        !            73:  * Do nothing if we didn't know about vaddr.
        !            74:  */
        !            75: void
        !            76: mem_forget(vaddr)
        !            77: {
        !            78:        CACHE_ENTRY *entry, *my_next, *my_prev;
        !            79:        T_PIGGY( 0x40, printf("mem_forget(v:%x)", vaddr); );
        !            80: 
        !            81:        if (NULL != (entry = find_vaddr(vaddr))) {
        !            82:                T_PIGGY( 0x40, printf("forgetting(p:%x)", entry->paddr); );
        !            83: 
        !            84:                /* Remove 'entry' from the linked list.  */
        !            85:                my_next = entry->next;
        !            86:                my_prev = entry->prev;
        !            87: 
        !            88:                if (NULL != my_next) { my_next->prev = my_prev; }
        !            89:                if (NULL != my_prev) { my_prev->next = my_next; }
        !            90: 
        !            91:                if (entry == cache_head) { cache_head = my_next; }
        !            92: 
        !            93:                kfree(entry);
        !            94:        }
        !            95: } /* mem_forget() */
        !            96: 
        !            97: 
        !            98: /*
        !            99:  * Recall the vaddr that goes with 'paddr'.  Returns 0 if we don't know
        !           100:  * what paddr goes with.
        !           101:  */
        !           102: caddr_t
        !           103: mem_recall(paddr)
        !           104:        paddr_t paddr;
        !           105: {
        !           106:        CACHE_ENTRY *entry;
        !           107:        caddr_t retval;
        !           108: 
        !           109:        T_PIGGY( 0x40, printf("mem_recall(%x)=", paddr); );
        !           110: 
        !           111:        if (NULL == (entry = find_paddr(paddr))) {
        !           112:                retval = 0;
        !           113:        } else {
        !           114:                retval = entry->vaddr;
        !           115:        }
        !           116: 
        !           117:        T_PIGGY( 0x40, printf("%x, ", retval); );
        !           118: 
        !           119:        return( retval );
        !           120: } /* mem_recall() */
        !           121: 
        !           122: 
        !           123: /*
        !           124:  * Given a vaddr, 'vaddr', find the corresponding cache_entry.
        !           125:  * Returns NULL if it can not find 'vaddr'.
        !           126:  */
        !           127: static CACHE_ENTRY *
        !           128: find_vaddr(vaddr)
        !           129:        register caddr_t vaddr;
        !           130: {
        !           131:        register CACHE_ENTRY *entry;
        !           132: 
        !           133:        /*
        !           134:         * Walk forward through the cache looking for a matching address.
        !           135:         * If we don't find it, 'entry' will be NULL, which is exactly
        !           136:         * what we want.
        !           137:         */
        !           138:        for (entry = cache_head; entry != NULL; entry = entry->next) {
        !           139:                if (vaddr == entry->vaddr) {
        !           140:                        break;
        !           141:                }
        !           142:        }
        !           143: 
        !           144:        return( entry );
        !           145: } /* find_vaddr() */
        !           146: 
        !           147: 
        !           148: /*
        !           149:  * Given a paddr, 'paddr', find the corresponding cache_entry.
        !           150:  * Returns NULL if it can not find 'paddr'.
        !           151:  */
        !           152: static CACHE_ENTRY *
        !           153: find_paddr(paddr)
        !           154:        register paddr_t paddr;
        !           155: {
        !           156:        register CACHE_ENTRY *entry;
        !           157: 
        !           158:        /*
        !           159:         * Walk forward through the cache looking for a matching address.
        !           160:         * If we don't find it, 'entry' will be NULL, which is exactly
        !           161:         * what we want.
        !           162:         */
        !           163:        for (entry = cache_head; entry != NULL; entry = entry->next) {
        !           164:                if (paddr == entry->paddr) {
        !           165:                        break;
        !           166:                }
        !           167:        }
        !           168: 
        !           169:        return( entry );
        !           170: } /* find_paddr() */

unix.superglobalmegacorp.com

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