/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef __xpv
#error "This file is for i86xpv only"
#endif
#include <sys/archsystm.h>
#include <sys/hypervisor.h>
#include "../../i86pc/cpu/generic_cpu/gcpu.h"
extern xpv_mca_panic_data_t *xpv_mca_panic_data;
enum mctelem_direction {
};
void
{
if (gcpu_xpv_bankregs == NULL) {
sizeof (cmi_mca_regs_t);
}
}
static void
{
int tried = 0;
int nbanks, j;
/* Skip over the MC_TYPE_GLOBAL record */
idx++;
/*
* Process all MC_TYPE_BANK and MC_TYPE_EXTENDED records that
* follow the MC_TYPE_GLOBAL record, ending when we reach any
* other record type or when we're out of record.
*
* We skip over MC_TYPE_EXTENDED for now - nothing consumes
* the extended MSR data even in native Solaris.
*/
goto next_record;
} else {
}
goto next_record;
} else {
}
}
mcrp++;
mcrp++;
mcrp++;
idx++;
}
/*
* If we found some telemetry and a handle to associate it with
* then "forward" that telemetry into the MSR interpose layer
* and then request logout which will find that interposed
* telemetry. Indicate that logout code should clear bank
* status registers so that it can invalidate them in the interpose
* layer - they won't actually make it as far as real MSR writes.
*/
}
/*
* We must move the index on at least one record or our caller
* may loop forever; our initial increment over the global
* record assures this.
*/
}
/*
* Process a struct mc_info.
*
* There are x86_mcinfo_nentries(mi) entries. An entry of type
* MC_TYPE_GLOBAL precedes a number (potentially zero) of
* entries of type MC_TYPE_BANK for telemetry from MCA banks
* of the resource identified in the MC_TYPE_GLOBAL entry.
* I think there can be multiple MC_TYPE_GLOBAL entries per buffer.
*/
void
{
int idx;
idx = 0;
} else {
idx++;
}
}
}
int
{
long err;
return (0);
}
return (1);
} else {
*idp = 0;
return (0);
}
}
void
{
}
static void
{
}
}
/*
* Callback made from panicsys. We may have reached panicsys from a
* Solaris-initiated panic or a hypervisor-initiated panic; for the
* latter we may not perform any hypercalls. Our task is to retrieve
* unprocessed MCA telemetry from the hypervisor and shovel it into
* errorqs for later processing during panic.
*/
void
gcpu_xpv_panic_callback(void)
{
if (IN_XPV_PANIC()) {
return;
B_TRUE);
B_TRUE);
B_TRUE);
B_FALSE);
B_FALSE);
B_FALSE);
} else {
int i;
while (gcpu_xpv_telem_read(&gcpu_mce_data,
}
}
}
}