PERFORCE change 219906 for review
Brooks Davis
brooks at FreeBSD.org
Fri Dec 14 00:20:08 UTC 2012
http://p4web.freebsd.org/@@219906?ac=10
Change 219906 by brooks at brooks_zenith on 2012/12/14 00:19:39
Snapshot the cycle counter at four points in the png decoding
process:
- As the sandbox specific function is entered.
- As the core decoding function is entered and exited.
- As late as possible without waiting for a call to
read_png_finish() which may take an indefinite amout of time.
Add a pair of accessor functions to retrieve the total
runtime and the decoding time.
Affected files ...
.. //depot/projects/ctsrd/cheribsd/src/ctsrd-lib/libimagebox/decode_png.c#6 edit
.. //depot/projects/ctsrd/cheribsd/src/ctsrd-lib/libimagebox/imagebox.h#5 edit
.. //depot/projects/ctsrd/cheribsd/src/ctsrd-lib/libimagebox/pngbox.c#10 edit
.. //depot/projects/ctsrd/cheribsd/src/ctsrd/libexec/readpng-cheri/Makefile#3 edit
.. //depot/projects/ctsrd/cheribsd/src/ctsrd/libexec/readpng-cheri/readpng-cheri.c#7 edit
.. //depot/projects/ctsrd/cheribsd/src/ctsrd/libexec/readpng-cheri/sysarch.S#1 add
.. //depot/projects/ctsrd/cheribsd/src/ctsrd/libexec/readpng/readpng.c#5 edit
Differences ...
==== //depot/projects/ctsrd/cheribsd/src/ctsrd-lib/libimagebox/decode_png.c#6 (text+ko) ====
@@ -30,6 +30,8 @@
#include <sys/types.h>
+#include <machine/sysarch.h>
+
#include <png.h>
#include <stdlib.h>
#include <unistd.h>
@@ -53,6 +55,8 @@
png_infop end_info = NULL;
png_bytep *rows = NULL;
+ ids->is->times[1] = sysarch(MIPS_GET_COUNT, 0);
+
if ((png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING,
NULL, NULL, NULL)) == NULL) {
ids->is->error = 1;
@@ -125,6 +129,7 @@
error:
png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
close(ids->fd);
+ ids->is->times[2] = sysarch(MIPS_GET_COUNT, 0);
free(rows);
}
==== //depot/projects/ctsrd/cheribsd/src/ctsrd-lib/libimagebox/imagebox.h#5 (text+ko) ====
@@ -45,6 +45,7 @@
volatile uint32_t passes_remaining;
volatile uint32_t error;
volatile uint32_t *buffer;
+ volatile uint32_t times[4];
void *private;
};
@@ -53,6 +54,9 @@
void iboxstate_free(struct iboxstate *ps);
+uint32_t iboxstate_get_dtime(struct iboxstate *is);
+uint32_t iboxstate_get_ttime(struct iboxstate *is);
+
struct iboxstate* png_read_start(int pfd, uint32_t maxw, uint32_t maxh,
enum sbtype);
int png_read_finish(struct iboxstate *ps);
==== //depot/projects/ctsrd/cheribsd/src/ctsrd-lib/libimagebox/pngbox.c#10 (text+ko) ====
@@ -37,6 +37,7 @@
#include <machine/cheri.h>
#include <machine/cpuregs.h>
+#include <machine/sysarch.h>
#include <errno.h>
#include <fcntl.h>
@@ -70,6 +71,8 @@
decode_png(ids, NULL, NULL);
+ ids->is->times[3] = sysarch(MIPS_GET_COUNT, NULL);
+
free(ids);
pthread_exit(NULL);
@@ -89,6 +92,7 @@
is->width = width;
is->height = height;
is->passes_remaining = UINT32_MAX;
+ is->times[0] = sysarch(MIPS_GET_COUNT, NULL);
if ((pdp = malloc(sizeof(*pdp))) == NULL)
goto error;
@@ -145,6 +149,7 @@
is->width = width;
is->height = height;
is->passes_remaining = UINT32_MAX;
+ is->times[0] = sysarch(MIPS_GET_COUNT, NULL);
if ((bfd = shm_open(SHM_ANON, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR))
== -1)
@@ -219,7 +224,7 @@
/*
* XXX: rwatson reports that capabilities end up misaligned on the stack.
*/
-static struct chericap c1, c2;
+static struct chericap c1, c2, c3;
static struct iboxstate*
cheri_png_read_start(char *pngbuffer, size_t pnglen,
@@ -236,6 +241,7 @@
is->width = width;
is->height = height;
is->passes_remaining = UINT32_MAX;
+ is->times[0] = sysarch(MIPS_GET_COUNT, NULL);
if ((is->buffer = malloc(is->width * is->height *
sizeof(*is->buffer))) == NULL)
@@ -259,12 +265,18 @@
CHERI_CANDPERM(10, 10, CHERI_PERM_LOAD);
CHERI_CSC(10, 0, &c2, 0);
+ CHERI_CINCBASE(10, 0, is->times + 1);
+ CHERI_CSETLEN(10, 10, sizeof(uint32_t) * 2);
+ CHERI_CANDPERM(10, 10, CHERI_PERM_STORE);
+ CHERI_CSC(10, 0, &c3, 0);
+
v = sandbox_invoke(sandbox, width, height, pnglen, 0,
- &c1, &c2, NULL, NULL, NULL, NULL, NULL);
+ &c1, &c2, &c3, NULL, NULL, NULL, NULL);
if (ibox_verbose)
printf("%s: sandbox returned %ju\n", __func__, (uintmax_t)v);
is->valid_rows = height;
is->passes_remaining = 0;
+ is->times[3] = sysarch(MIPS_GET_COUNT, NULL);
return (is);
error:
munmap(pngbuffer, pnglen);
@@ -403,3 +415,25 @@
break;
}
}
+
+static uint32_t
+counter_diff(uint32_t first, uint32_t second)
+{
+
+ if (first < second)
+ return (second - first);
+ else
+ return (second + (UINT32_MAX - first));
+}
+
+uint32_t
+iboxstate_get_ttime(struct iboxstate *is) {
+
+ return (counter_diff(is->times[0], is->times[3]));
+}
+
+uint32_t
+iboxstate_get_dtime(struct iboxstate *is) {
+
+ return (counter_diff(is->times[1], is->times[2]));
+}
==== //depot/projects/ctsrd/cheribsd/src/ctsrd/libexec/readpng-cheri/Makefile#3 (text+ko) ====
@@ -14,6 +14,7 @@
setjmp.S \
strcpy.c \
execve.S \
+ sysarch.S \
cerror.S
.PATH: ${.CURDIR}/../../../ctsrd-lib/libimagebox
==== //depot/projects/ctsrd/cheribsd/src/ctsrd/libexec/readpng-cheri/readpng-cheri.c#7 (text+ko) ====
@@ -34,6 +34,7 @@
#include <sys/mman.h>
#include <machine/cheri.h>
+#include <machine/sysarch.h>
#include <png.h>
#include <stdlib.h>
@@ -108,5 +109,7 @@
if (is.error == 0)
memcpy_tocap(1, ids.buffer, 0, sizeof(uint32_t) * a0 * a1);
+ memcpy_tocap(3, is.times + 1, 0, sizeof(uint32_t) * 2);
+
return (is.error);
}
==== //depot/projects/ctsrd/cheribsd/src/ctsrd/libexec/readpng/readpng.c#5 (text+ko) ====
@@ -32,6 +32,8 @@
#include <sys/capability.h>
#include <sys/mman.h>
+#include <machine/sysarch.h>
+
#include <err.h>
#include <png.h>
#include <stdlib.h>
@@ -63,5 +65,6 @@
err(1, "mmap buffer");
decode_png(&ids, NULL, NULL);
+ ids.is->times[3] = sysarch(MIPS_GET_COUNT, NULL);
return (0);
}
More information about the p4-projects
mailing list