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