1/** 2 * \file 3 * \brief Adds information from CPUID for the core it is running on to the SKB 4 */ 5 6/* 7 * Copyright (c) 2007, 2008, 2009, ETH Zurich. 8 * All rights reserved. 9 * 10 * This file is distributed under the terms in the attached LICENSE file. 11 * If you do not find this file, copies can be found by writing to: 12 * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group. 13 */ 14 15#include <barrelfish/barrelfish.h> 16#include <stdio.h> 17#include <stdlib.h> 18#include <mm/mm.h> 19#include <cpuid/cpuid.h> 20#include <skb/skb.h> 21 22 23/* XXX: removed references to old sockeye generated code undil skate has feature parity */ 24 25//#include <schema/cpuid.h> 26 27#include "datagatherer.h" 28 29 30/******************************************************************************/ 31//main function to be called 32/******************************************************************************/ 33errval_t gather_cpuid_data(coreid_t core_id) 34{ 35 errval_t err; 36 err = cpuid_init(); 37 38 char buf[CPUID_PROC_NAME_LENGTH+1]; 39 err = cpuid_proc_name(buf, CPUID_PROC_NAME_LENGTH + 1); 40 if (err_is_fail(err)) { 41 DEBUG_ERR(err, "cpuid_proc_name"); 42 return err_push(err, SKB_DATAGATHERER_ERR_CPUID); 43 } 44 45 struct cpuid_proc_family family; 46 47 err = cpuid_proc_family(&family); 48 if (err_is_fail(err)) { 49 DEBUG_ERR(err, ""); 50 return err_push(err, SKB_DATAGATHERER_ERR_CPUID); 51 } 52 53// char *vendor_string = cpuid_vendor_string(); 54 55// cpuid__vendor_t vendor; 56// vendor.Core_ID = core_id; 57// vendor.vendor = vendor_string; 58 59 60 USER_PANIC("err = cpuid__vendor__add(&vendor);"); 61 if (err_is_fail(err)) { 62 DEBUG_ERR(err, "cpuid__vendor__add: %s", skb_get_error_output()); 63 return err_push(err, SKB_DATAGATHERER_ERR_CPUID); 64 } 65 66// cpuid__family_t f_family; 67// f_family.Core_ID = core_id; 68// f_family.Vendor_String = vendor_string; 69// f_family.Family = family.family; 70// f_family.Model = family.model; 71// f_family.Stepping = family.stepping; 72 73 USER_PANIC("err = cpuid__family__add(&f_family);"); 74 if (err_is_fail(err)) { 75 DEBUG_ERR(err, ""); 76 return err_push(err, SKB_DATAGATHERER_ERR_CPUID); 77 } 78 79 struct cpuid_threadinfo ti; 80 err = cpuid_thread_info(&ti); 81 if (err_is_fail(err)) { 82 DEBUG_ERR(err, ""); 83 return err_push(err, SKB_DATAGATHERER_ERR_CPUID); 84 } 85 86// cpuid__thread_t thread; 87// thread.Core_ID = core_id; 88// thread.Package = ti.package; 89// thread.Core = ti.core; 90// thread.HyperThread = ti.hyperthread; 91 92 USER_PANIC("err = cpuid__thread__add(&thread);"); 93 if (err_is_fail(err)) { 94 DEBUG_ERR(err, ""); 95 return err_push(err, SKB_DATAGATHERER_ERR_CPUID); 96 } 97 98 uint8_t i = 0; 99 struct cpuid_cacheinfo ci; 100 while((err = cpuid_cache_info(&ci, i)) == SYS_ERR_OK) { 101 102// cpuid__cache_t cache; 103// cache.Core_ID = core_id; 104// cache.Name = ci.name; 105// cache.Level = ci.level; 106// cache.type = cpuid_cache_type_string(ci.type); 107// cache.Size = ci.size; 108// cache.Associativity = ci.associativity; 109// cache.LineSize = ci.linesize; 110// cache.Shared = ci.shared; 111// cache.Inclusive = ci.inclusive; 112 113 USER_PANIC("err = cpuid__cache__add(&cache);"); 114 if (err_is_fail(err)) { 115 DEBUG_ERR(err, ""); 116 return err_push(err, SKB_DATAGATHERER_ERR_CPUID); 117 } 118 119 i++; 120 } 121 if (err_is_fail(err) && err != CPUID_ERR_INVALID_INDEX) { 122 DEBUG_ERR(err, ""); 123 return err_push(err, SKB_DATAGATHERER_ERR_CPUID); 124 } 125 126 127 i = 0; 128 struct cpuid_topologyinfo topo; 129 while((err = cpuid_topology_info(&topo, i)) == SYS_ERR_OK) { 130 131 // TODO Store topology in SKB 132 133 i++; 134 } 135 if (err_is_fail(err) && err != CPUID_ERR_INVALID_INDEX) { 136 DEBUG_ERR(err, ""); 137 return err_push(err, SKB_DATAGATHERER_ERR_CPUID); 138 } 139 140 i = 0; 141 struct cpuid_tlbinfo tlbi; 142 while((err = cpuid_tlb_info(&tlbi, i)) == SYS_ERR_OK) { 143 144// cpuid__tlb_t tlb; 145// tlb.Core_ID = core_id; 146// tlb.type = cpuid_cache_type_string(tlbi.type); 147// tlb.level = tlbi.level; 148// tlb.PageSize = tlbi.pagesize; 149// tlb.Entries = tlbi.entries; 150// tlb.Associativity = tlbi.associativity; 151 152 USER_PANIC("err = cpuid__tlb__add(&tlb);"); 153 if (err_is_fail(err)) { 154 DEBUG_ERR(err, ""); 155 return err_push(err, SKB_DATAGATHERER_ERR_CPUID); 156 } 157 158 i++; 159 } 160 if (err_is_fail(err)) { 161 switch (err) { 162 case CPUID_ERR_INVALID_INDEX: 163 // fall-through 164 case CPUID_ERR_UNSUPPORTED_FUNCTION: 165 break; 166 default: 167 DEBUG_ERR(err, ""); 168 return err_push(err, SKB_DATAGATHERER_ERR_CPUID); 169 } 170 } 171 172 struct cpuid_adressspaceinfo ai; 173 err = cpuid_address_space_info(&ai); 174 if (err_is_fail(err)) { 175 DEBUG_ERR(err, ""); 176 return err_push(err, SKB_DATAGATHERER_ERR_CPUID); 177 } 178 179// cpuid__addrspace_t addrspace; 180// addrspace.Core_ID = core_id; 181// addrspace.BitsPhys = ai.physical; 182// addrspace.BitsVirt = ai.virtual; 183// addrspace.BitsGuest = ai.guest_physical; 184 185 USER_PANIC("err = cpuid__addrspace__add(&addrspace);"); 186 if (err_is_fail(err)) { 187 DEBUG_ERR(err, ""); 188 return err_push(err, SKB_DATAGATHERER_ERR_CPUID); 189 } 190 191 return err; 192} 193