Changeset 263 for soft/giet_vm/giet_boot
- Timestamp:
- Dec 19, 2013, 9:36:48 AM (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
soft/giet_vm/giet_boot/boot.c
r262 r263 11 11 // physicals addresses can have up to 40 bits, and use the (unsigned long long) type. 12 12 // It natively supports clusterised shared mmemory multi-processors architectures, 13 // where each processor is identified by a composite index (cluster_ id, local_id),13 // where each processor is identified by a composite index (cluster_xy, local_id), 14 14 // and where there is one physical memory bank per cluster. 15 15 // … … 61 61 // Each PT2 contains 512 PTE2 of 8bytes => 4K bytes. 62 62 // The total size of a page table is finally = 8K + (GIET_NB_PT2_MAX)*4K bytes. 63 //////////////////////////////////////////////////////////////////////////////////// 63 /////////////////////////////////////////////////////////////////////////////////////// 64 // Implementation Notes: 65 // 66 // 1) The cluster_id variable is a linear index in the mapping_info array of clusters. 67 // We use the cluster_xy variable for the tological index = x << Y_WIDTH + y 68 /////////////////////////////////////////////////////////////////////////////////////// 64 69 65 70 // for vobjs initialisation 71 #include <giet_config.h> 66 72 #include <mwmr_channel.h> 67 73 #include <barrier.h> … … 87 93 #include <stdarg.h> 88 94 89 #if !defined(NB_CLUSTERS) 90 # error The NB_CLUSTERS value must be defined in the 'giet_config.h' file ! 95 #if !defined(X_SIZE) 96 # error The X_SIZE value must be defined in the 'hard_config.h' file ! 97 #endif 98 99 #if !defined(Y_SIZE) 100 # error The Y_SIZE value must be defined in the 'hard_config.h' file ! 101 #endif 102 103 #if !defined(X_WIDTH) 104 # error The X_WIDTH value must be defined in the 'hard_config.h' file ! 105 #endif 106 107 #if !defined(Y_WIDTH) 108 # error The Y_WIDTH value must be defined in the 'hard_config.h' file ! 91 109 #endif 92 110 93 111 #if !defined(NB_PROCS_MAX) 94 # error The NB_PROCS_MAX value must be defined in the ' giet_config.h' file !112 # error The NB_PROCS_MAX value must be defined in the 'hard_config.h' file ! 95 113 #endif 96 114 … … 116 134 unsigned int _ptabs_vaddr[GIET_NB_VSPACE_MAX]; 117 135 118 // Scheduler pointers array (virtual addresses)119 __attribute__((section (".bootdata")))120 static_scheduler_t* _schedulers[NB_CLUSTERS * NB_PROCS_MAX];121 122 136 // Next free PT2 index array 123 137 __attribute__((section (".bootdata"))) … … 129 143 unsigned int _max_pt2[GIET_NB_VSPACE_MAX] = 130 144 { [0 ... GIET_NB_VSPACE_MAX - 1] = 0 }; 145 146 // Scheduler pointers array (virtual addresses) 147 // indexed by (x,y,lpid) : ((x << Y_WIDTH) + y)*NB_PROCS_MAX + lpid 148 __attribute__((section (".bootdata"))) 149 static_scheduler_t* _schedulers[NB_PROCS_MAX<<(X_WIDTH+Y_WIDTH)]; 131 150 132 151 … … 147 166 _exit(); 148 167 } 168 149 169 // checking number of clusters 150 if (header->clusters != NB_CLUSTERS) 151 { 152 _puts("\n[BOOT ERROR] Incoherent NB_CLUSTERS"); 153 _puts("\n - In giet_config, value = "); 154 _putd(NB_CLUSTERS); 155 _puts("\n - In mapping_info, value = "); 156 _putd(header->clusters); 170 if ( (header->x_size != X_SIZE) || 171 (header->y_size != Y_SIZE) || 172 (header->x_width != X_WIDTH) || 173 (header->y_width != Y_WIDTH) ) 174 { 175 _puts("\n[BOOT ERROR] Incoherent X_SIZE or Y_SIZE "); 176 _puts("\n - In hard_config: X_SIZE = "); 177 _putd( X_SIZE ); 178 _puts(" / Y_SIZE = "); 179 _putd( Y_SIZE ); 180 _puts(" / X_WIDTH = "); 181 _putd( X_WIDTH ); 182 _puts(" / Y_WIDTH = "); 183 _putd( Y_WIDTH ); 184 _puts("\n - In mapping_info: x_size = "); 185 _putd( header->x_size ); 186 _puts(" / y_size = "); 187 _putd( header->y_size ); 188 _puts(" / x_width = "); 189 _putd( header->x_width ); 190 _puts(" / y_width = "); 191 _putd( header->y_width ); 157 192 _puts("\n"); 158 193 _exit(); … … 167 202 168 203 #if BOOT_DEBUG_MAPPING 169 _puts("\n - clusters = "); 170 _putd( header->clusters ); 204 _puts("\n - x_size = "); 205 _putd( header->x_size ); 206 _puts("\n - y_size = "); 207 _putd( header->y_size ); 171 208 _puts("\n - procs = "); 172 209 _putd( header->procs ); … … 196 233 _puts("\n"); 197 234 198 unsigned int 235 unsigned int cluster_id; 199 236 mapping_cluster_t * cluster = _get_cluster_base(header); 200 for (cluster_id = 0; cluster_id < NB_CLUSTERS; cluster_id++)237 for( cluster_id = 0; cluster_id < X_SIZE*Y_SIZE ; cluster_id++) 201 238 { 202 _puts("\n cluster = "); 203 _putd( cluster_id ); 204 _puts("\n procs = "); 205 _putd( cluster[cluster_id].procs ); 206 _puts("\n psegs = "); 207 _putd( cluster[cluster_id].psegs ); 208 _puts("\n periphs = "); 209 _putd( cluster[cluster_id].periphs ); 210 _puts("\n"); 239 _puts("\n - cluster["); 240 _putd( cluster[cluster_id].x ); 241 _puts(","); 242 _putd( cluster[cluster_id].y ); 243 _puts("]\n procs = "); 244 _putd( cluster[cluster_id].procs ); 245 _puts("\n psegs = "); 246 _putd( cluster[cluster_id].psegs ); 247 _puts("\n periphs = "); 248 _putd( cluster[cluster_id].periphs ); 249 _puts("\n"); 211 250 } 212 251 #endif … … 1069 1108 { 1070 1109 if ( (vobj[vseg[vseg_id].vobj_offset].type == VOBJ_TYPE_SCHED) && 1071 (pseg[vseg[vseg_id].psegid].cluster == cluster_id ) )1110 (pseg[vseg[vseg_id].psegid].clusterid == cluster_id ) ) 1072 1111 { 1073 1112 *vbase = vseg[vseg_id].vbase; … … 1078 1117 if ( found == 0 ) 1079 1118 { 1080 _puts("\n[BOOT ERROR] No vobj of type SCHED in cluster "); 1081 _putd(cluster_id); 1082 _puts("\n"); 1119 mapping_cluster_t* cluster = _get_cluster_base(header); 1120 _puts("\n[BOOT ERROR] No vobj of type SCHED in cluster ["); 1121 _putd( cluster[cluster_id].x ); 1122 _puts(","); 1123 _putd( cluster[cluster_id].y ); 1124 _puts("]\n"); 1083 1125 _exit(); 1084 1126 } … … 1119 1161 unsigned int alloc_cma_channel = 0; // CMA channel allocator 1120 1162 unsigned int alloc_hba_channel = 0; // IOC channel allocator 1121 unsigned int alloc_tim_channel[ NB_CLUSTERS];// user TIMER allocators1163 unsigned int alloc_tim_channel[X_SIZE*Y_SIZE]; // user TIMER allocators 1122 1164 1123 1165 ///////////////////////////////////////////////////////////////////////// … … 1129 1171 // and lpid to access the schedulers array. 1130 1172 // - the _schedulers[] array of pointers can contain "holes", because 1131 // it is indexed by the global pid = cluster_ id*NB_PROCS_MAX + lpid1173 // it is indexed by the global pid = cluster_xy*NB_PROCS_MAX + lpid 1132 1174 // - the mapping info array of processors is contiguous, it is indexed 1133 1175 // by proc_id, and use an offset specific in each cluster. 1134 1176 1135 for (cluster_id = 0; cluster_id < header->clusters; cluster_id++) 1136 { 1177 for (cluster_id = 0 ; cluster_id < X_SIZE*Y_SIZE ; cluster_id++) 1178 { 1179 unsigned int x = cluster[cluster_id].x; 1180 unsigned int y = cluster[cluster_id].y; 1181 unsigned int cluster_xy = (x<<Y_WIDTH) + y; 1137 1182 1138 1183 #if BOOT_DEBUG_SCHED 1139 _puts("\n[BOOT DEBUG] Initialise schedulers in cluster "); 1140 _putd(cluster_id); 1141 _puts("\n"); 1142 #endif 1143 1184 _puts("\n[BOOT DEBUG] Initialise schedulers in cluster["); 1185 _putd( x ); 1186 _puts(","); 1187 _putd( y ); 1188 _puts("]\n"); 1189 #endif 1144 1190 alloc_tim_channel[cluster_id] = NB_PROCS_MAX; 1145 1191 … … 1154 1200 if ( nprocs > NB_PROCS_MAX ) 1155 1201 { 1156 _puts("\n[BOOT ERROR] Too much processors in cluster "); 1157 _putd(cluster_id); 1158 _puts("\n"); 1202 _puts("\n[BOOT ERROR] Too much processors in cluster["); 1203 _putd( x ); 1204 _puts(","); 1205 _putd( y ); 1206 _puts("]\n"); 1159 1207 _exit(); 1160 1208 } … … 1166 1214 if ( sched_length < (nprocs<<12) ) 1167 1215 { 1168 _puts("\n[BOOT ERROR] Schedulers segment too small in cluster "); 1169 _putd(cluster_id); 1170 _puts("\n"); 1216 _puts("\n[BOOT ERROR] Schedulers segment too small in cluster["); 1217 _putd( x ); 1218 _puts(","); 1219 _putd( y ); 1220 _puts("]\n"); 1171 1221 _exit(); 1172 1222 } … … 1177 1227 proc_id++, lpid++ ) 1178 1228 { 1229 // current processor scheduler pointer : psched 1230 static_scheduler_t* psched = (static_scheduler_t*)(sched_vbase+(lpid<<12)); 1231 1179 1232 // set the schedulers pointers array 1180 _schedulers[cluster_id * NB_PROCS_MAX + lpid] = 1181 (static_scheduler_t*)( sched_vbase + (lpid<<12) ); 1233 _schedulers[cluster_xy * NB_PROCS_MAX + lpid] = psched; 1182 1234 1183 1235 #if BOOT_DEBUG_SCHED 1184 1236 _puts("\nProc_"); 1185 _putd( lpid);1237 _putd( x ); 1186 1238 _puts("_"); 1187 _putd(cluster_id); 1239 _putd( y ); 1240 _puts("_"); 1241 _putd( lpid ); 1188 1242 _puts(" : scheduler virtual base address = "); 1189 1243 _putx( sched_vbase + (lpid<<12) ); 1190 1244 _puts("\n"); 1191 1245 #endif 1192 // current processor scheduler pointer : psched1193 static_scheduler_t* psched = (static_scheduler_t*)(sched_vbase+(lpid<<12));1194 1246 1195 1247 // initialise the "tasks" variable : default value is 0 … … 1269 1321 { 1270 1322 1323 // compute the cluster coordinates 1324 unsigned int x = cluster[task[task_id].clusterid].x; 1325 unsigned int y = cluster[task[task_id].clusterid].y; 1326 unsigned int cluster_xy = (x<<Y_WIDTH) + y; 1327 1271 1328 #if BOOT_DEBUG_SCHED 1272 1329 _puts("\n[BOOT DEBUG] Initialise context for task "); … … 1274 1331 _puts(" in vspace "); 1275 1332 _puts( vspace[vspace_id].name ); 1276 _puts("\n"); 1333 _puts(" running on cluster["); 1334 _putd( x ); 1335 _puts(","); 1336 _putd( y ); 1337 _puts("]\n"); 1277 1338 #endif 1278 1339 // compute gpid (global processor index) and scheduler base address 1279 unsigned int gpid = task[task_id].clusterid * NB_PROCS_MAX + 1280 task[task_id].proclocid; 1340 unsigned int gpid = cluster_xy * NB_PROCS_MAX + task[task_id].proclocid; 1281 1341 static_scheduler_t* psched = _schedulers[gpid]; 1282 1342 … … 1827 1887 unsigned int channel_id; 1828 1888 1829 for (cluster_id = 0; cluster_id < header->clusters; cluster_id++) 1830 { 1889 // loop on all physical clusters 1890 for (cluster_id = 0; cluster_id < X_SIZE*Y_SIZE; cluster_id++) 1891 { 1892 // computes cluster coordinates 1893 unsigned int x = cluster[cluster_id].x; 1894 unsigned int y = cluster[cluster_id].y; 1895 unsigned int cluster_xy = (x<<Y_WIDTH) + y; 1831 1896 1832 1897 #if BOOT_DEBUG_PERI 1833 _puts("\n[BOOT DEBUG] ****** peripherals initialisation in cluster "); 1834 _putd(cluster_id); 1835 _puts(" ******\n"); 1836 #endif 1837 1898 _puts("\n[BOOT DEBUG] ****** peripherals initialisation in cluster["); 1899 _putd( x ); 1900 _puts(","); 1901 _putd( y ); 1902 _puts("] ******\n"); 1903 #endif 1904 1905 // loop on peripherals 1838 1906 for (periph_id = cluster[cluster_id].periph_offset; 1839 1907 periph_id < cluster[cluster_id].periph_offset + … … 1843 1911 unsigned int channels = periph[periph_id].channels; 1844 1912 1845 #if BOOT_DEBUG_PERI1846 _puts("- peripheral type : ");1847 _putd(type);1848 _puts(" / channels = ");1849 _putd(channels);1850 _puts("\n");1851 #endif1852 1913 switch (type) 1853 1914 { … … 1856 1917 _ioc_init(); 1857 1918 #if BOOT_DEBUG_PERI 1858 _puts("- IOC initialised\n"); 1919 _puts("- IOC / channels = "); 1920 _putd(channels); 1921 _puts("\n"); 1859 1922 #endif 1860 1923 break; … … 1864 1927 for (channel_id = 0; channel_id < channels; channel_id++) 1865 1928 { 1866 _dma_init( cluster_ id, channel_id );1929 _dma_init( cluster_xy, channel_id ); 1867 1930 } 1868 1931 #if BOOT_DEBUG_PERI 1869 _puts("- DMA initialised\n"); 1932 _puts("- DMA / channels = "); 1933 _putd(channels); 1934 _puts("\n"); 1870 1935 #endif 1871 1936 break; 1872 1937 } 1873 case PERIPH_TYPE_NIC: // vci_multi_nic component 1938 case PERIPH_TYPE_FBF: // vci_block_device component 1939 { 1940 // nothing to do 1941 #if BOOT_DEBUG_PERI 1942 _puts("- FBF / channels = "); 1943 _putd(channels); 1944 _puts("\n"); 1945 #endif 1946 break; 1947 } 1948 case PERIPH_TYPE_HBA: // vci_multi_ahci component 1874 1949 { 1875 1950 for (channel_id = 0; channel_id < channels; channel_id++) … … 1878 1953 } 1879 1954 #if BOOT_DEBUG_PERI 1880 _puts("- NIC initialised\n"); 1955 _puts("- HBA / channels = "); 1956 _putd(channels); 1957 _puts("\n"); 1881 1958 #endif 1882 1959 break; 1883 1960 } 1961 case PERIPH_TYPE_CMA: // vci_chbuf_dma component 1962 { 1963 for (channel_id = 0; channel_id < channels; channel_id++) 1964 { 1965 // TODO 1966 } 1967 #if BOOT_DEBUG_PERI 1968 _puts("- CMA / channels = "); 1969 _putd(channels); 1970 _puts("\n"); 1971 #endif 1972 break; 1973 } 1974 case PERIPH_TYPE_NIC: // vci_multi_nic component 1975 { 1976 for (channel_id = 0; channel_id < channels; channel_id++) 1977 { 1978 // TODO 1979 } 1980 #if BOOT_DEBUG_PERI 1981 _puts("- NIC / channels = "); 1982 _putd(channels); 1983 _puts("\n"); 1984 #endif 1985 break; 1986 } 1987 case PERIPH_TYPE_XCU: // vci_xicu component 1988 { 1989 // nothing to do 1990 #if BOOT_DEBUG_PERI 1991 _puts("- XCU / channels = "); 1992 _putd(channels); 1993 _puts("\n"); 1994 #endif 1995 break; 1996 } 1997 case PERIPH_TYPE_MMC: // vci_memcache config 1998 { 1999 // nothing to do 2000 #if BOOT_DEBUG_PERI 2001 _puts("- MMC / channels = "); 2002 _putd(channels); 2003 _puts("\n"); 2004 #endif 2005 break; 2006 } 1884 2007 case PERIPH_TYPE_TTY: // vci_multi_tty component 1885 2008 { 1886 2009 #if BOOT_DEBUG_PERI 1887 _puts("- TTY initialised\n"); 2010 _puts("- TTY / channels = "); 2011 _putd(channels); 2012 _puts("\n"); 1888 2013 #endif 1889 2014 break; … … 1902 2027 } 1903 2028 #if BOOT_DEBUG_PERI 1904 _puts("- IOB initialised\n"); 2029 _puts("- IOB / channels = "); 2030 _putd(channels); 2031 _puts("\n"); 1905 2032 #endif 1906 2033 break; … … 1910 2037 1911 2038 #if BOOT_DEBUG_PERI 1912 _puts("\n[BOOT DEBUG] ****** coprocessors initialisation in cluster "); 1913 _putd(cluster_id); 1914 _puts(" ******\n"); 1915 #endif 1916 2039 _puts("\n[BOOT DEBUG] ****** coprocessors initialisation in cluster["); 2040 _putd( x ); 2041 _puts(","); 2042 _putd( y ); 2043 _puts("] ******\n"); 2044 #endif 2045 2046 // loop on coprocessors 1917 2047 for ( coproc_id = cluster[cluster_id].coproc_offset; 1918 2048 coproc_id < cluster[cluster_id].coproc_offset + … … 1939 2069 paddr_t mwmr_channel_pbase = vobj[vobj_id].paddr; 1940 2070 1941 _mw mr_hw_init( cluster_id,1942 1943 1944 2071 _mwr_hw_init( cluster_xy, 2072 cp_port_id, 2073 cp_port[cp_port_id].direction, 2074 mwmr_channel_pbase ); 1945 2075 #if BOOT_DEBUG_PERI 1946 2076 _puts(" port direction: "); … … 1959 2089 } // end boot_peripherals_init() 1960 2090 1961 1962 //////////////////////////////////////////////////////////////////////////////1963 // This function is executed by all processors to jump into kernel:1964 // - Each processor initialises its CP0_SCHED register from the value1965 // contained in the _schedulers[] array (previously initialised1966 // by proc0 in the _schedulers_init() function).1967 // - Each processor (but proc 0) initialise the CP2_PTPR register with1968 // the default value (i.e. PTPR corresponding to vspace_0 page table),1969 // and write into CP2 MODE register to activate their MMU.1970 // - All processors jump to the kernel entry point (seg_kernel_init_base).1971 //////////////////////////////////////////////////////////////////////////////1972 void boot_to_kernel()1973 {1974 // CP0 SCHED register initialisation1975 unsigned int procid = _get_procid();1976 _set_sched( (unsigned int)_schedulers[procid] );1977 1978 // MMU Activation1979 if ( procid != 0 )1980 {1981 _set_mmu_ptpr( (unsigned int)(_ptabs_paddr[0]>>13) );1982 _set_mmu_mode( 0xF );1983 1984 _tty_get_lock( 0 );1985 _puts("\n[BOOT] Proc ");1986 _putd( procid );1987 _puts(" MMU activation at cycle ");1988 _putd(_get_proctime());1989 _puts("\n");1990 _tty_release_lock( 0 );1991 1992 }1993 1994 // jump to kernel_init1995 unsigned int kernel_entry = (unsigned int)&seg_kernel_init_base;1996 1997 _tty_get_lock( 0 );1998 _puts("\n[BOOT] Processor ");1999 _putd( procid );2000 _puts(" jumps to kernel (");2001 _putx( kernel_entry );2002 _puts(") at cycle ");2003 _putd( _get_proctime() );2004 _puts("\n");2005 _tty_release_lock( 0 );2006 2007 asm volatile( "jr %0" ::"r"(kernel_entry) );2008 }2009 2010 2091 ///////////////////////////////////////////////////////////////////////// 2011 2092 // This function is the entry point of the boot code for all processors. … … 2014 2095 void boot_init() 2015 2096 { 2016 mapping_header_t* header = (mapping_header_t *) & seg_boot_mapping_base; 2017 unsigned int procid = _get_procid(); 2097 mapping_header_t* header = (mapping_header_t *) & seg_boot_mapping_base; 2098 unsigned int gpid = _get_procid(); 2099 unsigned int cluster_xy = gpid / NB_PROCS_MAX; 2100 unsigned int lpid = gpid % NB_PROCS_MAX; 2018 2101 2019 if ( procid == 0 ) // only Processor 0 does it2102 if ( gpid == 0 ) // only Processor 0 does it 2020 2103 { 2021 2104 _puts("\n[BOOT] boot_init start at cycle "); … … 2043 2126 _set_mmu_mode( 0xF ); 2044 2127 2045 _puts("\n[BOOT] Processor 0MMU activation at cycle ");2128 _puts("\n[BOOT] Processor[0,0,0] : MMU activation at cycle "); 2046 2129 _putd(_get_proctime()); 2047 2130 _puts("\n"); … … 2064 2147 _set_sched( (unsigned int)_schedulers[0] ); 2065 2148 2066 _puts("\n[BOOT] Proc 0 CPO_SCHED register initialised at cycle "); 2067 _putd(_get_proctime()); 2068 _puts("\n"); 2069 2070 // Initializing external peripherals 2149 // Initializing peripherals 2071 2150 boot_peripherals_init(); 2072 2151 2073 _puts("\n[BOOT] External peripherals initialised at cycle ");2152 _puts("\n[BOOT] All peripherals initialised at cycle "); 2074 2153 _putd(_get_proctime()); 2075 2154 _puts("\n"); … … 2083 2162 2084 2163 // P0 starts all other processors 2085 unsigned int cluster_id; 2086 unsigned int local_id; 2087 for (cluster_id = 0; cluster_id < NB_CLUSTERS; cluster_id++) 2088 { 2089 for(local_id = 0; local_id < NB_PROCS_MAX; local_id++) 2164 unsigned int x,y,p; 2165 for (x = 0 ; x < X_SIZE ; x++) 2166 { 2167 for (y = 0 ; y < Y_SIZE ; y++) 2090 2168 { 2091 if ((cluster_id != 0) || (local_id != 0)) 2092 { 2093 _xcu_send_ipi( cluster_id, 2094 local_id, 2095 (unsigned int)boot_init ); 2169 for(p = 0; p < NB_PROCS_MAX; p++) 2170 { 2171 if ( (x != 0) || (y != 0) || (p != 0) ) 2172 { 2173 _xcu_send_ipi( (x<<Y_WIDTH) + y, 2174 p, 2175 (unsigned int)boot_init ); 2176 } 2096 2177 } 2097 2178 } … … 2104 2185 2105 2186 // all processor initialise SCHED register 2106 _set_sched( (unsigned int)_schedulers[ procid] );2187 _set_sched( (unsigned int)_schedulers[gpid] ); 2107 2188 2108 2189 // all processors (but Proc 0) activate MMU 2109 if ( procid != 0 )2190 if ( gpid != 0 ) 2110 2191 { 2111 2192 _set_mmu_ptpr( (unsigned int)(_ptabs_paddr[0]>>13) ); … … 2113 2194 2114 2195 _tty_get_lock( 0 ); 2115 _puts("\n[BOOT] Processor "); 2116 _putd( procid ); 2117 _puts(" MMU activation at cycle "); 2196 _puts("\n[BOOT] Processor["); 2197 _putd( cluster_xy >> Y_WIDTH ); 2198 _puts(","); 2199 _putd( cluster_xy & ((1<<Y_WIDTH)-1) ); 2200 _puts(","); 2201 _putd( lpid ); 2202 _puts("] : MMU activation at cycle "); 2118 2203 _putd(_get_proctime()); 2119 2204 _puts("\n"); 2120 2205 _tty_release_lock( 0 ); 2121 2122 2206 } 2123 2207 … … 2126 2210 2127 2211 _tty_get_lock( 0 ); 2128 _puts("\n[BOOT] Processor "); 2129 _putd( procid ); 2130 _puts(" enters kernel at cycle "); 2212 _puts("\n[BOOT] Processor["); 2213 _putd( cluster_xy >> Y_WIDTH ); 2214 _puts(","); 2215 _putd( cluster_xy & ((1<<Y_WIDTH)-1) ); 2216 _puts(","); 2217 _putd( lpid ); 2218 _puts("] enters kernel at cycle "); 2131 2219 _putd( _get_proctime() ); 2132 2220 _puts(" / kernel entry = ");
Note: See TracChangeset
for help on using the changeset viewer.