X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/e2fac8b15b12a7979f72090454d850e612fc5b13..b0d623f7f2ae71ed96e60569f61f9a9a27016e80:/tools/tests/libMicro/memset.c diff --git a/tools/tests/libMicro/memset.c b/tools/tests/libMicro/memset.c new file mode 100644 index 000000000..8a6345409 --- /dev/null +++ b/tools/tests/libMicro/memset.c @@ -0,0 +1,172 @@ +/* + * 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 + * src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * 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 2005 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +/* + * memset + */ + +#include +#include +#include +#include + +#include "libmicro.h" + +#define DEFS 8192 + +static long long opts = DEFS; +static int opta = 0; +static int optu = 0; + +static char *optas = "4k"; + +typedef struct { + char *ts_buff; + int ts_size; + int ts_offset; +} tsd_t; + +int +benchmark_init() +{ + lm_tsdsize = sizeof (tsd_t); + + (void) sprintf(lm_optstr, "a:us:"); + + (void) sprintf(lm_usage, + " [-s buffer-size (default %d)]\n" + " [-a alignment (force buffer alignment)]\n" + " [-u (try to always use uncached memory)]" + "notes: measures memset()\n", + DEFS); + + (void) sprintf(lm_header, "%8s%16s", "size", "alignment"); + + return (0); +} + +int +benchmark_optswitch(int opt, char *optarg) +{ + switch (opt) { + case 'u': + optu = 1; + break; + case 's': + opts = sizetoll(optarg); + break; + case 'a': + opta = sizetoll(optarg); + if (opta > 4096) + opta = 0; + else + optas = optarg; + break; + default: + return (-1); + } + return (0); +} + +int +benchmark_initworker(void *tsd) +{ + tsd_t *ts = (tsd_t *)tsd; + int errors = 0; + int i; + + if (optu) { + ts->ts_size = 1024 * 1024 * 64; + ts->ts_offset = opta; + } else { + ts->ts_size = opta + opts; + ts->ts_offset = opta; + } + + if ((ts->ts_buff = (char *)valloc(ts->ts_size)) == NULL) + errors++; + + for (i = 0; i < ts->ts_size; i++) + ts->ts_buff[i] = 0; + return (errors); +} + +/*ARGSUSED*/ +int +benchmark(void *tsd, result_t *res) +{ + int i; + tsd_t *ts = (tsd_t *)tsd; + + + if (optu) { + char *buf = ts->ts_buff + ts->ts_offset; + char *end = ts->ts_buff + ts->ts_size; + int offset = ts->ts_offset; + + unsigned long tmp; + + for (i = 0; i < lm_optB; i ++) { + (void) memset(buf, 0, opts); + tmp = (((unsigned long)buf + opts + 4095) & ~4095) + offset; + buf = (char *) tmp; + if (buf + opts > end) + buf = ts->ts_buff + offset; + } + } else { + char *buf = ts->ts_buff + ts->ts_offset; + + for (i = 0; i < lm_optB; i += 10) { + (void) memset(buf, 0, opts); + (void) memset(buf, 0, opts); + (void) memset(buf, 0, opts); + (void) memset(buf, 0, opts); + (void) memset(buf, 0, opts); + (void) memset(buf, 0, opts); + (void) memset(buf, 0, opts); + (void) memset(buf, 0, opts); + (void) memset(buf, 0, opts); + (void) memset(buf, 0, opts); + } + } + res->re_count = i; + + return (0); +} + +char * +benchmark_result() +{ + static char result[256]; + + (void) sprintf(result, "%8lld%12s", opts, optas); + + return (result); +}