xref: /onnv-gate/usr/src/cmd/fps/fptest/fps_ereport_mod.c (revision 11102:b91faef0c984)
16429Svs195195 /*
26429Svs195195  * CDDL HEADER START
36429Svs195195  *
46429Svs195195  * The contents of this file are subject to the terms of the
56429Svs195195  * Common Development and Distribution License (the "License").
66429Svs195195  * You may not use this file except in compliance with the License.
76429Svs195195  *
86429Svs195195  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
96429Svs195195  * or http://www.opensolaris.org/os/licensing.
106429Svs195195  * See the License for the specific language governing permissions
116429Svs195195  * and limitations under the License.
126429Svs195195  *
136429Svs195195  * When distributing Covered Code, include this CDDL HEADER in each
146429Svs195195  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
156429Svs195195  * If applicable, add the following below this CDDL HEADER, with the
166429Svs195195  * fields enclosed by brackets "[]" replaced with your own identifying
176429Svs195195  * information: Portions Copyright [yyyy] [name of copyright owner]
186429Svs195195  *
196429Svs195195  * CDDL HEADER END
206429Svs195195  */
216429Svs195195 
226429Svs195195 /*
238537SEric.Schrock@Sun.COM  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
246429Svs195195  * Use is subject to license terms.
256429Svs195195  */
266429Svs195195 
276429Svs195195 #include <kstat.h>
286429Svs195195 #include <libnvpair.h>
296429Svs195195 #include <libsysevent.h>
306429Svs195195 #include <stdarg.h>
316429Svs195195 #include <stdio.h>
326429Svs195195 #include <string.h>
336429Svs195195 #include <sys/fm/protocol.h>
346429Svs195195 #include <sys/fm/util.h>
356429Svs195195 #include <sys/types.h>
366429Svs195195 #include <sys/processor.h>
376429Svs195195 #include <unistd.h>
386429Svs195195 #include <fp.h>
396429Svs195195 #include <fps_defines.h>
406429Svs195195 #include <fps_ereport.h>
416429Svs195195 #include <fpst-defines.h>
426429Svs195195 
436429Svs195195 #define	CLASS_HEAD "ereport.cpu"
446429Svs195195 #define	CLASS_TAIL "fpu.fpscrub"
456429Svs195195 
466429Svs195195 /* nvlist */
476429Svs195195 static nvlist_t *fps_nvlist_create();
486429Svs195195 
496429Svs195195 /* ereport piece generators */
506429Svs195195 static int fps_fmri_cpu_set(nvlist_t *fmri_cpu, uint32_t cpu_id);
516429Svs195195 static int fps_fmri_svc_set(nvlist_t *fmri_svc, const char *svc_fmri);
526429Svs195195 static int fps_post_ereport(nvlist_t *ereport);
536429Svs195195 static uint64_t fps_ena_generate(uint64_t timestamp, uint32_t cpuid,
546429Svs195195 		uchar_t format);
556429Svs195195 
566429Svs195195 /* cpu check and name convert */
576429Svs195195 static char *fps_get_cpu_brand(uint32_t cpu_id);
586429Svs195195 static char *fps_convert_cpu_brand(char *brand);
596429Svs195195 
606429Svs195195 /* ereport struct functions */
616429Svs195195 int fps_generate_ereport_struct(struct fps_test_ereport *report);
626429Svs195195 void setup_fps_test_struct(int mask, struct fps_test_ereport *rep, ...);
636429Svs195195 void initialize_fps_test_struct(struct fps_test_ereport *init_me);
646429Svs195195 
656429Svs195195 /*
666429Svs195195  * fps_nvlist_create() allocates the memory for an
676429Svs195195  * nvlist.
686429Svs195195  */
696429Svs195195 static nvlist_t *
fps_nvlist_create()706429Svs195195 fps_nvlist_create()
716429Svs195195 {
726429Svs195195 	int nr_malloc;
736429Svs195195 	nvlist_t *nvl;
746429Svs195195 	struct timeval timeout;
756429Svs195195 
766429Svs195195 	timeout.tv_sec = 0;
776429Svs195195 	timeout.tv_usec = 10000;
786429Svs195195 	nr_malloc = 0;
796429Svs195195 
806429Svs195195 	nvl = NULL;
816429Svs195195 	(void) nvlist_alloc(&nvl, NV_UNIQUE_NAME, 0);
826429Svs195195 
836429Svs195195 	while (nvl == NULL && nr_malloc < 10) {
847186Skk158166 		(void) select(1, NULL, NULL, NULL, &timeout);
857186Skk158166 		(void) nvlist_alloc(&nvl, NV_UNIQUE_NAME, 0);
866429Svs195195 		nr_malloc++;
876429Svs195195 	}
886429Svs195195 
896429Svs195195 	return (nvl);
906429Svs195195 }
916429Svs195195 
926429Svs195195 /*
936429Svs195195  * fps_ena_generate(uint64_t timestamp, processorid_t cpuid,
946429Svs195195  * uchar_t format)creates the ENA for the ereport.
956429Svs195195  */
966429Svs195195 static uint64_t
fps_ena_generate(uint64_t timestamp,uint32_t cpuid,uchar_t format)976429Svs195195 fps_ena_generate(uint64_t timestamp, uint32_t cpuid, uchar_t format)
986429Svs195195 {
996429Svs195195 	uint64_t ena = 0;
1006429Svs195195 
1016429Svs195195 	switch (format) {
1026429Svs195195 	case FM_ENA_FMT1:
1036429Svs195195 		if (timestamp) {
1046429Svs195195 			ena = (uint64_t)((format & ENA_FORMAT_MASK) |
1056429Svs195195 			    ((cpuid << ENA_FMT1_CPUID_SHFT) &
1066429Svs195195 			    ENA_FMT1_CPUID_MASK) |
1076429Svs195195 			    ((timestamp << ENA_FMT1_TIME_SHFT) &
1086429Svs195195 			    ENA_FMT1_TIME_MASK));
1096429Svs195195 		} else {
1106429Svs195195 			ena = (uint64_t)((format & ENA_FORMAT_MASK) |
1116429Svs195195 			    ((cpuid << ENA_FMT1_CPUID_SHFT) &
1126429Svs195195 			    ENA_FMT1_CPUID_MASK) |
1136429Svs195195 			    ((gethrtime() << ENA_FMT1_TIME_SHFT) &
1146429Svs195195 			    ENA_FMT1_TIME_MASK));
1156429Svs195195 		}
1166429Svs195195 		break;
1176429Svs195195 	case FM_ENA_FMT2:
1186429Svs195195 		ena = (uint64_t)((format & ENA_FORMAT_MASK) |
1196429Svs195195 		    ((timestamp << ENA_FMT2_TIME_SHFT) & ENA_FMT2_TIME_MASK));
1206429Svs195195 		break;
1216429Svs195195 	default:
1226429Svs195195 		break;
1236429Svs195195 	}
1246429Svs195195 
1256429Svs195195 	return (ena);
1266429Svs195195 }
1276429Svs195195 
1286429Svs195195 /*
1296429Svs195195  * fps_fmri_svc_set(nvlist_t *fmri_svc, const char *svc_fmri)
1306429Svs195195  * adds the detector data to fmri_svc.
1316429Svs195195  */
1326429Svs195195 static int
fps_fmri_svc_set(nvlist_t * fmri_svc,const char * svc_fmri)1336429Svs195195 fps_fmri_svc_set(nvlist_t *fmri_svc, const char *svc_fmri)
1346429Svs195195 {
1356429Svs195195 	if (fmri_svc == NULL)
1366429Svs195195 		return (1);
1376429Svs195195 
1386429Svs195195 	if (svc_fmri == NULL)
1396429Svs195195 		return (1);
1406429Svs195195 
1418537SEric.Schrock@Sun.COM 	if (nvlist_add_uint8(fmri_svc, FM_VERSION, FM_SVC_SCHEME_VERSION) != 0)
1426429Svs195195 		return (1);
1436429Svs195195 
1446429Svs195195 	if (nvlist_add_string(fmri_svc, FM_FMRI_SCHEME,
1456429Svs195195 	    FM_FMRI_SCHEME_SVC) != 0)
1466429Svs195195 		return (1);
1476429Svs195195 
1486429Svs195195 	if (nvlist_add_string(fmri_svc, FM_FMRI_SVC_NAME,
1496429Svs195195 	    svc_fmri) != 0)
1506429Svs195195 		return (1);
1516429Svs195195 
1526429Svs195195 	return (0);
1536429Svs195195 }
1546429Svs195195 
1556429Svs195195 /*
1566429Svs195195  * fps_fmri_cpu_set(nvlist_t *fmri_cpu, uint32_t cpu_id)
1576429Svs195195  * adds the resource data to fmri_cpu.
1586429Svs195195  */
1596429Svs195195 static int
fps_fmri_cpu_set(nvlist_t * fmri_cpu,uint32_t cpu_id)1606429Svs195195 fps_fmri_cpu_set(nvlist_t *fmri_cpu, uint32_t cpu_id)
1616429Svs195195 {
1626429Svs195195 	if (fmri_cpu == NULL)
1636429Svs195195 		return (1);
1646429Svs195195 
1656429Svs195195 	if (nvlist_add_uint8(fmri_cpu, FM_VERSION,
1666429Svs195195 	    FM_CPU_SCHEME_VERSION) != 0)
1676429Svs195195 		return (1);
1686429Svs195195 
1696429Svs195195 	if (nvlist_add_string(fmri_cpu, FM_FMRI_SCHEME,
1706429Svs195195 	    FM_FMRI_SCHEME_CPU) != 0)
1716429Svs195195 		return (1);
1726429Svs195195 
1736429Svs195195 	if (nvlist_add_uint32(fmri_cpu, FM_FMRI_CPU_ID, cpu_id) != 0)
1746429Svs195195 		return (1);
1756429Svs195195 	return (0);
1766429Svs195195 }
1776429Svs195195 
1786429Svs195195 /*
1796429Svs195195  * fps_post_ereport(nvlist_t *ereport) posts an
1806429Svs195195  * ereport to the sysevent error channel.  The error
1816429Svs195195  * channel is assumed to be established by fps-transport.so.
1826429Svs195195  */
1836429Svs195195 static int
fps_post_ereport(nvlist_t * ereport)1846429Svs195195 fps_post_ereport(nvlist_t *ereport)
1856429Svs195195 {
1866429Svs195195 	evchan_t *scp;
1876429Svs195195 
1886429Svs195195 	if (sysevent_evc_bind(CHANNEL, &scp, BIND_FLAGS) != 0) {
1896429Svs195195 		return (1);
1906429Svs195195 	}
1916429Svs195195 
1926429Svs195195 	if (sysevent_evc_publish(scp, CLASS, SUBCLASS, VENDOR,
1936429Svs195195 	    PUBLISHER, ereport, EVCH_NOSLEEP) != 0) {
1946429Svs195195 		return (1);
1956429Svs195195 	}
1966429Svs195195 
1976429Svs195195 	(void) sleep(1);
1986429Svs195195 
1997186Skk158166 	(void) fflush(NULL);
200*11102SGavin.Maltby@Sun.COM 	(void) sysevent_evc_unbind(scp);
2016429Svs195195 
2026429Svs195195 	return (0);
2036429Svs195195 }
2046429Svs195195 /*
2056429Svs195195  * fps_convert_cpu_brand(char *brand) changes
2066429Svs195195  * the kstat data to match the ereport class
2076429Svs195195  * names.
2086429Svs195195  */
2096429Svs195195 static char *
fps_convert_cpu_brand(char * brand)2106429Svs195195 fps_convert_cpu_brand(char *brand)
2116429Svs195195 {
2126429Svs195195 	if (brand == NULL)
2136429Svs195195 		return (NULL);
2146429Svs195195 
2156429Svs195195 	if (strcasecmp(brand, USIII_KSTAT) == 0)
2166429Svs195195 		return (USIII);
2176429Svs195195 	else if (strcasecmp(brand, USIIIi_KSTAT) == 0)
2186429Svs195195 		return (USIIIi);
2196429Svs195195 	else if (strcasecmp(brand, USIIIP_KSTAT) == 0)
2206429Svs195195 		return (USIIIP);
2216429Svs195195 	else if (strcasecmp(brand, USIV_KSTAT) == 0)
2226429Svs195195 		return (USIV);
2236429Svs195195 	else if (strcasecmp(brand, USIVP_KSTAT) == 0)
2246429Svs195195 		return (USIVP);
2256429Svs195195 	else
2266429Svs195195 		return (NULL);
2276429Svs195195 }
2286429Svs195195 
2296429Svs195195 /*
2306429Svs195195  * get_cpu_brand(uint32_t cpu_id)gets the
2316429Svs195195  * brand of the CPU and returns the CPU
2326429Svs195195  * name to use in the ereport class name.
2336429Svs195195  */
2346429Svs195195 static char *
fps_get_cpu_brand(uint32_t cpu_id)2356429Svs195195 fps_get_cpu_brand(uint32_t cpu_id)
2366429Svs195195 {
2376429Svs195195 	char *brand;
2386429Svs195195 	kstat_ctl_t *kc;
2396429Svs195195 	kstat_t *ksp;
2406429Svs195195 	kstat_named_t *knp;
2416429Svs195195 
2426429Svs195195 	kc = kstat_open();
2436429Svs195195 	if (kc == NULL) {
2446429Svs195195 		return (NULL);
2456429Svs195195 	}
2466429Svs195195 
2476429Svs195195 	if ((ksp = kstat_lookup(kc, "cpu_info", (int)cpu_id, NULL)) == NULL) {
2487186Skk158166 		(void) kstat_close(kc);
2496429Svs195195 		return (NULL);
2506429Svs195195 	}
2516429Svs195195 
2526429Svs195195 	if ((kstat_read(kc, ksp, NULL)) == -1) {
2537186Skk158166 		(void) kstat_close(kc);
2546429Svs195195 		return (NULL);
2556429Svs195195 	}
2566429Svs195195 
2576429Svs195195 	if ((knp = kstat_data_lookup(ksp, "brand")) == NULL) {
2587186Skk158166 		(void) kstat_close(kc);
2596429Svs195195 		return (NULL);
2606429Svs195195 	}
2616429Svs195195 
2626429Svs195195 	brand = fps_convert_cpu_brand(KSTAT_NAMED_STR_PTR(knp));
2637186Skk158166 	(void) kstat_close(kc);
2646429Svs195195 
2656429Svs195195 	if (brand == NULL)
2666429Svs195195 		return (NULL);
2676429Svs195195 
2686429Svs195195 	return (brand);
2696429Svs195195 }
2706429Svs195195 
2716429Svs195195 /*
2726429Svs195195  * fps_generate_ereport_struct(struct fps_test_ereport *report)
2736429Svs195195  * takes report and constructs an nvlist that will be used
2746429Svs195195  * for the ereport.
2756429Svs195195  */
2766429Svs195195 int
fps_generate_ereport_struct(struct fps_test_ereport * report)2776429Svs195195 fps_generate_ereport_struct(struct fps_test_ereport *report)
2786429Svs195195 {
2796429Svs195195 	char class_name[FM_MAX_CLASS];
2806429Svs195195 	char *cpu_brand;
2816429Svs195195 	char *string_data;
2826429Svs195195 	int expect_size;
2836429Svs195195 	int is_valid_cpu;
2846429Svs195195 	int mask;
2856429Svs195195 	int observe_size;
2866429Svs195195 	int ret;
2876429Svs195195 	nvlist_t *detector;
2886429Svs195195 	nvlist_t *ereport;
2896429Svs195195 	nvlist_t *resource;
2906429Svs195195 	uint32_t cpu_id;
2916429Svs195195 	uint32_t test;
2926429Svs195195 	uint8_t fps_ver;
2936429Svs195195 	uint64_t ena;
2946429Svs195195 	uint64_t ereport_time;
2956429Svs195195 	uint64_t *expect;
2966429Svs195195 	uint64_t *observe;
2976429Svs195195 
2986429Svs195195 	if (report == NULL)
2996863Sia112686 		return (FPU_EREPORT_FAIL);
3006429Svs195195 
3016863Sia112686 	ret = FPU_FOROFFLINE;
3026429Svs195195 	cpu_id = report->cpu_id;
3036429Svs195195 	test = report->test_id;
3046429Svs195195 	mask = report->mask;
3056429Svs195195 	is_valid_cpu = report->is_valid_cpu;
3066429Svs195195 	expect_size = report->expected_size;
3076429Svs195195 	expect = report->expected;
3086429Svs195195 	observe_size = report->observed_size;
3096429Svs195195 	observe = report->observed;
3106429Svs195195 	string_data = report->info;
3116429Svs195195 
3126429Svs195195 	/* allocate nvlists */
3136429Svs195195 	if ((ereport = fps_nvlist_create()) == NULL)
3146429Svs195195 		_exit(FPU_EREPORT_FAIL);
3156429Svs195195 
3166429Svs195195 	if ((detector = fps_nvlist_create()) == NULL) {
3177203Sia112686 		_exit(FPU_EREPORT_FAIL);
3186429Svs195195 	}
3196429Svs195195 
3206429Svs195195 	/* setup class */
3216429Svs195195 	if ((cpu_brand = fps_get_cpu_brand(cpu_id)) == NULL)
3226429Svs195195 		_exit(FPU_EREPORT_FAIL);
3236429Svs195195 
3246429Svs195195 	if ((snprintf(class_name, FM_MAX_CLASS, "%s.%s.%s",
3256429Svs195195 	    CLASS_HEAD, cpu_brand, CLASS_TAIL)) < 0)
3266429Svs195195 		_exit(FPU_EREPORT_FAIL);
3276429Svs195195 
3286429Svs195195 	/* setup ena */
3296429Svs195195 	ereport_time = gethrtime();
3306429Svs195195 	ena = fps_ena_generate(ereport_time, cpu_id, FM_ENA_FMT1);
3316429Svs195195 
3326429Svs195195 	/* setup detector */
3336429Svs195195 	if (fps_fmri_svc_set(detector, getenv("SMF_FMRI")) != 0) {
3347203Sia112686 		_exit(FPU_EREPORT_FAIL);
3356429Svs195195 	}
3366429Svs195195 
3376429Svs195195 	/* setup fps-version */
3386429Svs195195 	fps_ver = FPS_VERSION;
3396429Svs195195 
3406429Svs195195 	/* setup resource */
3416429Svs195195 	if (is_valid_cpu) {
3426429Svs195195 		resource = fps_nvlist_create();
3436429Svs195195 
3446429Svs195195 		if (fps_fmri_cpu_set(resource, cpu_id)) {
3456429Svs195195 			_exit(FPU_EREPORT_FAIL);
3466429Svs195195 		}
3476429Svs195195 	} else {
3486429Svs195195 		resource = NULL;
3496429Svs195195 	}
3506429Svs195195 
3516429Svs195195 	/* put it together */
3526429Svs195195 	if (nvlist_add_string(ereport, NAME_FPS_CLASS, class_name) != 0)
3536429Svs195195 		_exit(FPU_EREPORT_FAIL);
3546429Svs195195 
3556429Svs195195 	if (ena != 0) {
3566429Svs195195 		if (nvlist_add_uint64(ereport, NAME_FPS_ENA, ena) != 0)
3577203Sia112686 			_exit(FPU_EREPORT_FAIL);
3586429Svs195195 	} else
3597203Sia112686 		_exit(FPU_EREPORT_FAIL);
3606429Svs195195 
3617203Sia112686 	if (nvlist_add_nvlist(ereport, NAME_FPS_DETECTOR,
3627203Sia112686 	    (nvlist_t *)detector) != 0)
3637203Sia112686 		_exit(FPU_EREPORT_FAIL);
3646429Svs195195 
3656429Svs195195 	if (nvlist_add_uint8(ereport, NAME_FPS_VERSION, fps_ver) != 0)
3666429Svs195195 		_exit(FPU_EREPORT_FAIL);
3676429Svs195195 
3686429Svs195195 	if (nvlist_add_uint32(ereport, NAME_FPS_TEST_ID, test) != 0)
3697203Sia112686 		ret = FPU_EREPORT_INCOM;
3706429Svs195195 
3716429Svs195195 	if (nvlist_add_uint64_array(ereport, NAME_FPS_EXPECTED_VALUE,
3726429Svs195195 	    expect, expect_size) != 0)
3736429Svs195195 		ret = FPU_EREPORT_INCOM;
3746429Svs195195 
3756429Svs195195 	if (nvlist_add_uint64_array(ereport, NAME_FPS_OBSERVED_VALUE,
3766429Svs195195 	    observe, observe_size) != 0)
3776429Svs195195 		ret = FPU_EREPORT_INCOM;
3786429Svs195195 
3796429Svs195195 	if (mask & IS_EREPORT_INFO) {
3806429Svs195195 		if (nvlist_add_string(ereport, NAME_FPS_STRING_DATA,
3816429Svs195195 		    string_data) != 0)
3826429Svs195195 			ret = FPU_EREPORT_INCOM;
3836429Svs195195 	}
3846429Svs195195 
3856429Svs195195 	if (is_valid_cpu) {
3866429Svs195195 		if (nvlist_add_nvlist(ereport, NAME_FPS_RESOURCE,
3876429Svs195195 		    (nvlist_t *)resource) != 0)
3886429Svs195195 			_exit(FPU_EREPORT_FAIL);
3896429Svs195195 	}
3906429Svs195195 
3916429Svs195195 	/* publish */
3926429Svs195195 	if (fps_post_ereport(ereport)) {
3937203Sia112686 		ret = FPU_EREPORT_FAIL;
3946429Svs195195 	}
3956429Svs195195 
3966429Svs195195 	/* free nvlists */
3976429Svs195195 	nvlist_free(ereport);
3986429Svs195195 
3996429Svs195195 	if (resource != NULL)
4006429Svs195195 		nvlist_free(resource);
4016429Svs195195 
4026429Svs195195 	if (detector != NULL)
4036429Svs195195 		nvlist_free(detector);
4046429Svs195195 
4056429Svs195195 	return (ret);
4066429Svs195195 }
4076429Svs195195 
4086429Svs195195 /*
4096429Svs195195  * initialize_fps_test_struct(struct fps_test_ereport *init_me)
4106429Svs195195  * creates the initial values for the init_me.
4116429Svs195195  */
4126429Svs195195 void
initialize_fps_test_struct(struct fps_test_ereport * init_me)4136429Svs195195 initialize_fps_test_struct(struct fps_test_ereport *init_me)
4146429Svs195195 {
4156429Svs195195 	if (init_me == NULL)
4166429Svs195195 		return;
4176429Svs195195 
4186429Svs195195 	init_me->cpu_id = 0;
4196429Svs195195 	init_me->test_id = 0;
4206429Svs195195 	init_me->observed_size = 0;
4216429Svs195195 	init_me->expected_size = 0;
4226429Svs195195 	init_me->is_valid_cpu = 1;
4236429Svs195195 	init_me->info[0] = '\0';
4246429Svs195195 	init_me->mask = NO_EREPORT_INFO;
4256429Svs195195 }
4266429Svs195195 
4276429Svs195195 /*
4286429Svs195195  * setup_fps_test_struct(int mask, struct fps_test_ereport *rep,
4296429Svs195195  * ...) takes a variable amount of input and stores it in rep
4306429Svs195195  * based on mask provided.
4316429Svs195195  */
4326429Svs195195 void
setup_fps_test_struct(int mask,struct fps_test_ereport * rep,...)4336429Svs195195 setup_fps_test_struct(int mask, struct fps_test_ereport *rep, ...)
4346429Svs195195 {
4356429Svs195195 	char *data;
4366429Svs195195 	int i;
4376429Svs195195 	uint64_t *exp_arg;
4386429Svs195195 	uint64_t *obs_arg;
4396429Svs195195 	va_list argptr;
4406429Svs195195 
4416429Svs195195 	if (rep == NULL)
4426429Svs195195 		return;
4436429Svs195195 
4446429Svs195195 	/* begin parsing args */
4456429Svs195195 	va_start(argptr, rep);
4466429Svs195195 
4476429Svs195195 	/* test id */
4486429Svs195195 	rep->test_id = va_arg(argptr, int);
4496429Svs195195 
4506429Svs195195 	/* observed */
4516429Svs195195 	obs_arg = va_arg(argptr, uint64_t *);
4526429Svs195195 
4536429Svs195195 	/* expected */
4546429Svs195195 	exp_arg = va_arg(argptr, uint64_t *);
4556429Svs195195 
4566429Svs195195 	/* observed size */
4576429Svs195195 	rep->observed_size = va_arg(argptr, int);
4586429Svs195195 
4596429Svs195195 	/* expected size */
4606429Svs195195 	rep->expected_size = va_arg(argptr, int);
4616429Svs195195 
4626429Svs195195 	/* copy arrays of observed and expected */
4636429Svs195195 	if (rep->observed_size < 1 || rep->expected_size < 1)
4646429Svs195195 		return;
4656429Svs195195 
4666429Svs195195 	if (obs_arg == NULL || exp_arg == NULL)
4676429Svs195195 		return;
4686429Svs195195 
4696429Svs195195 	for (i = 0; i < rep->observed_size; i++)
4706429Svs195195 		rep->observed[i] = obs_arg[i];
4716429Svs195195 
4726429Svs195195 	for (i = 0; i < rep->expected_size; i++)
4736429Svs195195 		rep->expected[i] = exp_arg[i];
4746429Svs195195 
4756429Svs195195 	rep->mask = mask;
4766429Svs195195 
4776429Svs195195 	/* copy string data if there */
4786429Svs195195 	if (mask & IS_EREPORT_INFO)	{
4796429Svs195195 		data = va_arg(argptr, char *);
4806429Svs195195 
4816429Svs195195 		if (data == NULL) {
4826429Svs195195 			va_end(argptr);
4836429Svs195195 
4846429Svs195195 			return;
4856429Svs195195 		}
4866429Svs195195 
4877186Skk158166 		(void) strlcpy(rep->info, data, MAX_INFO_SIZE-1);
4886429Svs195195 	}
4896429Svs195195 
4906429Svs195195 	va_end(argptr);
4916429Svs195195 }
492