|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * The contents of this file constitute Original Code as defined in and ! 7: * are subject to the Apple Public Source License Version 1.1 (the ! 8: * "License"). You may not use this file except in compliance with the ! 9: * License. Please obtain a copy of the License at ! 10: * http://www.apple.com/publicsource and read it before using this file. ! 11: * ! 12: * This Original Code and all software distributed under the License are ! 13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ! 17: * License for the specific language governing rights and limitations ! 18: * under the License. ! 19: * ! 20: * @APPLE_LICENSE_HEADER_END@ ! 21: */ ! 22: /* ! 23: * @OSF_COPYRIGHT@ ! 24: */ ! 25: ! 26: /* A marvelous selection of support routines for virtual memory */ ! 27: ! 28: #include <cpus.h> ! 29: #include <debug.h> ! 30: #include <mach_kdb.h> ! 31: #include <mach_vm_debug.h> ! 32: ! 33: #include <kern/cpu_number.h> ! 34: #include <kern/misc_protos.h> ! 35: #include <kern/assert.h> ! 36: #include <ppc/misc_protos.h> ! 37: #include <ppc/mem.h> ! 38: #include <ppc/pmap_internals.h> /* For pmap_pteg_overflow */ ! 39: ! 40: /* These refer to physical addresses and are set and referenced elsewhere */ ! 41: ! 42: unsigned int hash_table_base; ! 43: unsigned int hash_table_size; ! 44: ! 45: unsigned int hash_function_mask; ! 46: ! 47: struct shadowBAT shadow_BAT; ! 48: ! 49: /* gather statistics about hash table usage */ ! 50: ! 51: #if DEBUG ! 52: #define MEM_STATS 1 ! 53: #else ! 54: #define MEM_STATS 0 ! 55: #endif /* DEBUG */ ! 56: ! 57: #if MEM_STATS ! 58: /* hash table usage information */ ! 59: struct hash_table_stats { ! 60: int find_pte_in_pteg_calls; ! 61: int find_pte_in_pteg_not_found; ! 62: int find_pte_in_pteg_location[8]; ! 63: struct find_or_alloc_calls { ! 64: int found_primary; ! 65: int found_secondary; ! 66: int alloc_primary; ! 67: int alloc_secondary; ! 68: int overflow; ! 69: int not_found; ! 70: } find_or_alloc_calls[2]; ! 71: ! 72: } hash_table_stats[NCPUS]; ! 73: ! 74: #define INC_STAT(LOC) \ ! 75: hash_table_stats[cpu_number()].find_pte_in_pteg_location[LOC]++ ! 76: ! 77: #else /* MEM_STATS */ ! 78: #define INC_STAT(LOC) ! 79: #endif /* MEM_STATS */ ! 80: ! 81: /* Set up the machine registers for the given hash table. ! 82: * The table has already been zeroed. ! 83: */ ! 84: void hash_table_init(unsigned int base, unsigned int size) ! 85: { ! 86: sync(); /* SYNC: it's not just the law, it's a good idea... */ ! 87: mtsdr1(hash_table_base | ((size-1)>>16)); /* Slam the SDR1 with the has table address */ ! 88: sync(); /* SYNC: it's not just the law, it's a good idea... */ ! 89: isync(); ! 90: } ! 91:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.