{"action":"created","comment":{"url":"https://api.github.com/repos/OP-TEE/optee_test/pulls/comments/78547289","id":78547289,"diff_hunk":"@@ -0,0 +1,480 @@\n+/*\n+ * Copyright (c) 2015, Linaro Limited\n+ * All rights reserved.\n+ *\n+ * Redistribution and use in source and binary forms, with or without\n+ * modification, are permitted provided that the following conditions are met:\n+ *\n+ * 1. Redistributions of source code must retain the above copyright notice,\n+ * this list of conditions and the following disclaimer.\n+ *\n+ * 2. Redistributions in binary form must reproduce the above copyright notice,\n+ * this list of conditions and the following disclaimer in the documentation\n+ * and/or other materials provided with the distribution.\n+ *\n+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n+ * POSSIBILITY OF SUCH DAMAGE.\n+ */\n+\n+#include <sys/types.h>\n+#include <sys/stat.h>\n+#include <fcntl.h>\n+#include <math.h>\n+#include <stdint.h>\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <string.h>\n+#include <strings.h>\n+#include <time.h>\n+#include <unistd.h>\n+\n+#include <tee_client_api.h>\n+#include \"ta_sha_perf.h\"\n+#include \"sha_perf.h\"\n+\n+#define _verbose(lvl, ...)\t\t\t\\\n+\tdo {\t\t\t\t\t\\\n+\t\tif (verbosity >= lvl) {\t\t\\\n+\t\t\tprintf(__VA_ARGS__);\t\\\n+\t\t\tfflush(stdout);\t\t\\\n+\t\t}\t\t\t\t\\\n+\t} while (0)\n+\n+#define verbose(...)  _verbose(1, __VA_ARGS__)\n+#define vverbose(...) _verbose(2, __VA_ARGS__)\n+\n+/*\n+ * TEE client stuff\n+ */\n+\n+static TEEC_Context ctx;\n+static TEEC_Session sess;\n+static TEEC_SharedMemory in_shm = {\n+\t.flags = TEEC_MEM_INPUT\n+};\n+static TEEC_SharedMemory out_shm = {\n+\t.flags = TEEC_MEM_OUTPUT\n+};\n+\n+static void errx(const char *msg, TEEC_Result res)\n+{\n+\tfprintf(stderr, \"%s: 0x%08x\", msg, res);\n+\texit (1);\n+}\n+\n+static void check_res(TEEC_Result res, const char *errmsg)\n+{\n+\tif (res != TEEC_SUCCESS)\n+\t\terrx(errmsg, res);\n+}\n+\n+static void open_ta(void)\n+{\n+\tTEEC_Result res;\n+\tTEEC_UUID uuid = TA_SHA_PERF_UUID;\n+\tuint32_t err_origin;\n+\n+\tres = TEEC_InitializeContext(NULL, &ctx);\n+\tcheck_res(res,\"TEEC_InitializeContext\");\n+\n+\tres = TEEC_OpenSession(&ctx, &sess, &uuid, TEEC_LOGIN_PUBLIC, NULL,\n+\t\t\t       NULL, &err_origin);\n+\tcheck_res(res,\"TEEC_OpenSession\");\n+}\n+\n+/*\n+ * Statistics\n+ *\n+ * We want to compute min, max, mean and standard deviation of processing time\n+ */\n+\n+struct statistics {\n+\tint n;\n+\tdouble m;\n+\tdouble M2;\n+\tdouble min;\n+\tdouble max;\n+\tint initialized;\n+};\n+\n+/* Take new sample into account (Knuth/Welford algorithm) */\n+static void update_stats(struct statistics *s, uint64_t t)\n+{\n+\tdouble x = (double)t;\n+\tdouble delta = x - s->m;\n+\n+\ts->n++;\n+\ts->m += delta/s->n;\n+\ts->M2 += delta*(x - s->m);\n+\tif (!s->initialized) {\n+\t\ts->min = s->max = x;\n+\t\ts->initialized = 1;\n+\t} else {\n+\t\tif (s->min > x)\n+\t\t\ts->min = x;\n+\t\tif (s->max < x)\n+\t\t\ts->max = x;\n+\t}\n+}\n+\n+static double stddev(struct statistics *s)\n+{\n+\tif (s->n < 2)\n+\t\treturn NAN;\n+\treturn sqrt(s->M2/s->n);\n+}\n+\n+static const char *algo_str(uint32_t algo)\n+{\n+\tswitch (algo) {\n+\tcase TA_SHA_SHA1:\n+\t\treturn \"SHA1\";\n+\tcase TA_SHA_SHA224:\n+\t\treturn \"SHA224\";\n+\tcase TA_SHA_SHA256:\n+\t\treturn \"SHA256\";\n+\tcase TA_SHA_SHA384:\n+\t\treturn \"SHA384\";\n+\tcase TA_SHA_SHA512:\n+\t\treturn \"SHA512\";\n+\tdefault:\n+\t\treturn \"???\";\n+\t}\n+}\n+\n+static int hash_size(uint32_t algo)\n+{\n+\tswitch (algo) {\n+\tcase TA_SHA_SHA1:\n+\t\treturn 20;\n+\tcase TA_SHA_SHA224:\n+\t\treturn 28;\n+\tcase TA_SHA_SHA256:\n+\t\treturn 32;\n+\tcase TA_SHA_SHA384:\n+\t\treturn 48;\n+\tcase TA_SHA_SHA512:\n+\t\treturn 64;\n+\tdefault:\n+\t\treturn 0;\n+\t}\n+}\n+\n+#define _TO_STR(x) #x\n+#define TO_STR(x) _TO_STR(x)\n+\n+\n+static void alloc_shm(size_t sz, uint32_t algo, int offset)\n+{\n+\tTEEC_Result res;\n+\n+\tin_shm.buffer = NULL;\n+\tin_shm.size = sz + offset;\n+\tres = TEEC_AllocateSharedMemory(&ctx, &in_shm);\n+\tcheck_res(res, \"TEEC_AllocateSharedMemory\");\n+\n+\tout_shm.buffer = NULL;\n+\tout_shm.size = hash_size(algo);\n+\tres = TEEC_AllocateSharedMemory(&ctx, &out_shm);\n+\tcheck_res(res, \"TEEC_AllocateSharedMemory\");\n+}\n+\n+static void free_shm(void)\n+{\n+\tTEEC_ReleaseSharedMemory(&in_shm);\n+\tTEEC_ReleaseSharedMemory(&out_shm);\n+}\n+\n+static ssize_t read_random(void *in, size_t rsize)\n+{\n+\tstatic int rnd;\n+\tssize_t s;\n+\n+\tif (!rnd) {\n+\t\trnd = open(\"/dev/urandom\", O_RDONLY);\n+\t\tif (rnd < 0) {\n+\t\t\tperror(\"open\");\n+\t\t\treturn 1;\n+\t\t}\n+\t}\n+\ts = read(rnd, in, rsize);\n+\tif (s < 0) {\n+\t\tperror(\"read\");\n+\t\treturn 1;\n+\t}\n+\tif ((size_t)s != rsize) {\n+\t\tprintf(\"read: requested %zu bytes, got %zd\\n\",\n+\t\t       rsize, s);\n+\t}\n+\treturn 0;\n+}\n+\n+static long get_current_time(struct timespec *ts)\n+{\n+\tif (clock_gettime(CLOCK_MONOTONIC, ts) < 0) {\n+\t\tperror(\"clock_gettime\");\n+\t\texit(1);\n+\t}\n+\treturn 0;\n+}\n+\n+static uint64_t timespec_diff_ns(struct timespec *start, struct timespec *end)\n+{\n+\tuint64_t ns = 0;\n+\n+\tif (end->tv_nsec < start->tv_nsec) {\n+\t\tns += 1000000000 * (end->tv_sec - start->tv_sec - 1);\n+\t\tns += 1000000000 - start->tv_nsec + end->tv_nsec;\n+\t} else {\n+\t\tns += 1000000000 * (end->tv_sec - start->tv_sec);\n+\t\tns += end->tv_nsec - start->tv_nsec;\n+\t}\n+\treturn ns;\n+}\n+\n+static uint64_t run_test_once(void *in, size_t size,  int random_in, TEEC_Operation *op)\n+{\n+\tstruct timespec t0, t1;\n+\tTEEC_Result res;\n+\tuint32_t ret_origin;\n+\n+\tif (random_in)\n+\t\tread_random(in, size);\n+\tget_current_time(&t0);\n+\tres = TEEC_InvokeCommand(&sess, TA_SHA_PERF_CMD_PROCESS, op,\n+\t\t\t\t &ret_origin);\n+\tcheck_res(res, \"TEEC_InvokeCommand\");\n+\tget_current_time(&t1);\n+\n+\treturn timespec_diff_ns(&t0, &t1);\n+}\n+\n+static void prepare_op(int algo)\n+{\n+\tTEEC_Result res;\n+\tuint32_t ret_origin;\n+\tTEEC_Operation op;\n+\n+\tmemset(&op, 0, sizeof(op));\n+\top.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,\n+\t\t\t\t\t TEEC_NONE, TEEC_NONE);\n+\top.params[0].value.a = algo;\n+\tres = TEEC_InvokeCommand(&sess, TA_SHA_PERF_CMD_PREPARE_OP, &op,\n+\t\t\t\t &ret_origin);\n+\tcheck_res(res, \"TEEC_InvokeCommand\");\n+}\n+\n+static void do_warmup(int warmup)\n+{\n+\tstruct timespec t0, t;\n+\tint i;\n+\n+\tget_current_time(&t0);\n+\tdo {\n+\t\tfor (i = 0; i < 100000; i++)\n+\t\t\t;\n+\t\tget_current_time(&t);\n+\t} while (timespec_diff_ns(&t0, &t) < (uint64_t)warmup * 1000000000);\n+}\n+\n+static const char *yesno(int v)\n+{\n+\treturn (v ? \"yes\" : \"no\");\n+}\n+\n+static double mb_per_sec(size_t size, double usec)\n+{\n+\treturn (1000000000/usec)*((double)size/(1024*1024));\n+}\n+\n+/* Hash test: buffer of size byte. Run test n times.\n+ * Entry point for running SHA benchmark \n+ * Params: \n+ * algo - Algorithm\n+ * size - Buffer size\n+ * n - Number of measurements\n+ * l - Amount of inner loops\n+ * random_in - Get input from /dev/urandom\n+ * offset - Buffer offset wrt. alloc-ed address\n+ * warmup - Start with a-second busy loop\n+ * verbosity - Verbosity level */\n+extern void sha_perf_run_test(int algo, size_t size, unsigned int n, \n+\t\t\t\tunsigned int l, int random_in, int offset, \n+\t\t\t\tint warmup, int verbosity)\n+{\n+\tuint64_t t;\n+\tstruct statistics stats;\n+\tTEEC_Operation op;\n+\tint n0 = n;\n+\tstruct timespec ts;\n+\n+\tvverbose(\"sha-perf version %s\\n\", TO_STR(VERSION));\n+\tif (clock_getres(CLOCK_MONOTONIC, &ts) < 0) {\n+\t\tperror(\"clock_getres\");\n+\t\treturn;\n+\t}\n+\tvverbose(\"Clock resolution is %lu ns\\n\", ts.tv_sec*1000000000 +\n+\t\tts.tv_nsec);\n+\n+\topen_ta();\n+\tprepare_op(algo);\n+\t\n+\t\n+\talloc_shm(size, algo, offset);\n+\n+\tif (!random_in)\n+\t\tmemset((uint8_t *)in_shm.buffer + offset, 0, size);\n+\n+\tmemset(&op, 0, sizeof(op));\n+\top.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_PARTIAL_INPUT,\n+\t\t\t\t\t TEEC_MEMREF_PARTIAL_OUTPUT,\n+\t\t\t\t\t TEEC_VALUE_INPUT, TEEC_NONE);\n+\top.params[0].memref.parent = &in_shm;\n+\top.params[0].memref.offset = 0;\n+\top.params[0].memref.size = size + offset;\n+\top.params[1].memref.parent = &out_shm;\n+\top.params[1].memref.offset = 0;\n+\top.params[1].memref.size = hash_size(algo);\n+\top.params[2].value.a = l;\n+\top.params[2].value.b = offset;\n+\n+\tverbose(\"Starting test: %s, size=%zu bytes, \",\n+\t\talgo_str(algo), size);\n+\tverbose(\"random=%s, \", yesno(random_in));\n+\tverbose(\"unaligned=%s, \", yesno(offset));\n+\tverbose(\"inner loops=%u, loops=%u, warm-up=%u s\\n\", l, n, warmup);\n+\n+\tif (warmup)\n+\t\tdo_warmup(warmup);\n+\n+\tmemset(&stats, 0, sizeof(stats));\n+\twhile (n-- > 0) {\n+\t\tt = run_test_once((uint8_t *)in_shm.buffer + offset, size, random_in, &op);\n+\t\tupdate_stats(&stats, t);\n+\t\tif (n % (n0/10) == 0)\n+\t\t\tvverbose(\"#\");\n+\t}\n+\tvverbose(\"\\n\");\n+\tprintf(\"min=%gμs max=%gμs mean=%gμs stddev=%gμs (%gMiB/s)\\n\",\n+\t       stats.min/1000, stats.max/1000, stats.m/1000,\n+\t       stddev(&stats)/1000, mb_per_sec(size, stats.m));\n+\tfree_shm();\n+}\n+\n+static void usage(const char *progname)\n+{\n+\tfprintf(stderr, \"SHA performance testing tool for OP-TEE (%s)\\n\\n\",","path":"host/xtest/sha_perf.c","position":375,"original_position":375,"commit_id":"68ecf4250668e923c00ce40564cd1350d45675b0","original_commit_id":"68ecf4250668e923c00ce40564cd1350d45675b0","user":{"login":"jforissier","id":8288195,"avatar_url":"https://avatars.githubusercontent.com/u/8288195?v=3","gravatar_id":"","url":"https://api.github.com/users/jforissier","html_url":"https://github.com/jforissier","followers_url":"https://api.github.com/users/jforissier/followers","following_url":"https://api.github.com/users/jforissier/following{/other_user}","gists_url":"https://api.github.com/users/jforissier/gists{/gist_id}","starred_url":"https://api.github.com/users/jforissier/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jforissier/subscriptions","organizations_url":"https://api.github.com/users/jforissier/orgs","repos_url":"https://api.github.com/users/jforissier/repos","events_url":"https://api.github.com/users/jforissier/events{/privacy}","received_events_url":"https://api.github.com/users/jforissier/received_events","type":"User","site_admin":false},"body":"Ah, I did not notice that. Yes I think it's important to print the default values. Otherwise how do you know which argument you need to provide?","created_at":"2016-09-13T12:23:25Z","updated_at":"2016-09-13T12:23:25Z","html_url":"https://github.com/OP-TEE/optee_test/pull/125#discussion_r78547289","pull_request_url":"https://api.github.com/repos/OP-TEE/optee_test/pulls/125","_links":{"self":{"href":"https://api.github.com/repos/OP-TEE/optee_test/pulls/comments/78547289"},"html":{"href":"https://github.com/OP-TEE/optee_test/pull/125#discussion_r78547289"},"pull_request":{"href":"https://api.github.com/repos/OP-TEE/optee_test/pulls/125"}}},"pull_request":{"url":"https://api.github.com/repos/OP-TEE/optee_test/pulls/125","id":85025552,"html_url":"https://github.com/OP-TEE/optee_test/pull/125","diff_url":"https://github.com/OP-TEE/optee_test/pull/125.diff","patch_url":"https://github.com/OP-TEE/optee_test/pull/125.patch","issue_url":"https://api.github.com/repos/OP-TEE/optee_test/issues/125","number":125,"state":"open","locked":false,"title":"[RFC] Inclusion of sha-perf into xtest (for details see SWG-185)","user":{"login":"igoropaniuk","id":22025908,"avatar_url":"https://avatars.githubusercontent.com/u/22025908?v=3","gravatar_id":"","url":"https://api.github.com/users/igoropaniuk","html_url":"https://github.com/igoropaniuk","followers_url":"https://api.github.com/users/igoropaniuk/followers","following_url":"https://api.github.com/users/igoropaniuk/following{/other_user}","gists_url":"https://api.github.com/users/igoropaniuk/gists{/gist_id}","starred_url":"https://api.github.com/users/igoropaniuk/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/igoropaniuk/subscriptions","organizations_url":"https://api.github.com/users/igoropaniuk/orgs","repos_url":"https://api.github.com/users/igoropaniuk/repos","events_url":"https://api.github.com/users/igoropaniuk/events{/privacy}","received_events_url":"https://api.github.com/users/igoropaniuk/received_events","type":"User","site_admin":false},"body":"Please, read comments before reading code\r\n\r\n1. Removed all global variables from sha-perf.c, now all these params\r\nare passed as function arguments\r\n 58 static size_t size = 1024;  /* Buffer size (-s) */\r\n 59 static unsigned int n = 5000;   /* Number of measurements (-n) */\r\n 60 static unsigned int l = 1;  /* Inner loops (-l) */\r\n 61 static int verbosity = 0;   /* Verbosity (-v) */\r\n 62 static int algo = TA_SHA_SHA1;  /* Algorithm (-a) */\r\n 63 static int random_in = 0;   /* Get input data from /dev/urandom (-r)\r\n*/\r\n 64 static int warmup = 2;      /* Start with a 2-second busy loop (-w)\r\n*/\r\n 65 static int offset = 0;          /* Buffer offset wrt. alloc'ed\r\naddress (-u) */\r\n2. Because of strict rules (-Werror params are set almost for everything),\r\nadded some minor fixes to get sha-perf.c compiled\r\n3. Now we have two entry points for running sha-perf tests:\r\n\"sha_perf_runner_cmd_parser\" - where we bypass all params from cmdline to\r\nsupport old-school running of sha-perf test (for the backward\r\ncompability).\r\nThis function just parses cmdline params and calls sha_perf_run_test.\r\n\"sha_perf_run_test\" - entry point for starting any sha-based test. We can\r\nuse this function in any defined ADBG testsuite in xtest\r\n4. Now we can run sha-perf tests like this. I can also add analyzing of\r\nargv[0], so we could call it like \"busybox-way\"\r\n$ xtest sha-perf -a SHA1 -s 131072\r\n5. I haven't divided yet sha-perf TA on two pieces (ta_entry.c and\r\nsha-perf.c) to have the same file hierarchy as we have in other TAs.\r\n\r\nIt's just a POC, I'm going to add additional checks + change some code\r\nin aes-perf. I just try be sure that I'm moving in the right direction","created_at":"2016-09-13T10:50:38Z","updated_at":"2016-09-13T12:23:25Z","closed_at":null,"merged_at":null,"merge_commit_sha":"0a8d23bc5aa003edfe23e26bb327eb3f758d73cc","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/OP-TEE/optee_test/pulls/125/commits","review_comments_url":"https://api.github.com/repos/OP-TEE/optee_test/pulls/125/comments","review_comment_url":"https://api.github.com/repos/OP-TEE/optee_test/pulls/comments{/number}","comments_url":"https://api.github.com/repos/OP-TEE/optee_test/issues/125/comments","statuses_url":"https://api.github.com/repos/OP-TEE/optee_test/statuses/68ecf4250668e923c00ce40564cd1350d45675b0","head":{"label":"igoropaniuk:master","ref":"master","sha":"68ecf4250668e923c00ce40564cd1350d45675b0","user":{"login":"igoropaniuk","id":22025908,"avatar_url":"https://avatars.githubusercontent.com/u/22025908?v=3","gravatar_id":"","url":"https://api.github.com/users/igoropaniuk","html_url":"https://github.com/igoropaniuk","followers_url":"https://api.github.com/users/igoropaniuk/followers","following_url":"https://api.github.com/users/igoropaniuk/following{/other_user}","gists_url":"https://api.github.com/users/igoropaniuk/gists{/gist_id}","starred_url":"https://api.github.com/users/igoropaniuk/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/igoropaniuk/subscriptions","organizations_url":"https://api.github.com/users/igoropaniuk/orgs","repos_url":"https://api.github.com/users/igoropaniuk/repos","events_url":"https://api.github.com/users/igoropaniuk/events{/privacy}","received_events_url":"https://api.github.com/users/igoropaniuk/received_events","type":"User","site_admin":false},"repo":{"id":67713434,"name":"optee_test","full_name":"igoropaniuk/optee_test","owner":{"login":"igoropaniuk","id":22025908,"avatar_url":"https://avatars.githubusercontent.com/u/22025908?v=3","gravatar_id":"","url":"https://api.github.com/users/igoropaniuk","html_url":"https://github.com/igoropaniuk","followers_url":"https://api.github.com/users/igoropaniuk/followers","following_url":"https://api.github.com/users/igoropaniuk/following{/other_user}","gists_url":"https://api.github.com/users/igoropaniuk/gists{/gist_id}","starred_url":"https://api.github.com/users/igoropaniuk/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/igoropaniuk/subscriptions","organizations_url":"https://api.github.com/users/igoropaniuk/orgs","repos_url":"https://api.github.com/users/igoropaniuk/repos","events_url":"https://api.github.com/users/igoropaniuk/events{/privacy}","received_events_url":"https://api.github.com/users/igoropaniuk/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/igoropaniuk/optee_test","description":"Test suite","fork":true,"url":"https://api.github.com/repos/igoropaniuk/optee_test","forks_url":"https://api.github.com/repos/igoropaniuk/optee_test/forks","keys_url":"https://api.github.com/repos/igoropaniuk/optee_test/keys{/key_id}","collaborators_url":"https://api.github.com/repos/igoropaniuk/optee_test/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/igoropaniuk/optee_test/teams","hooks_url":"https://api.github.com/repos/igoropaniuk/optee_test/hooks","issue_events_url":"https://api.github.com/repos/igoropaniuk/optee_test/issues/events{/number}","events_url":"https://api.github.com/repos/igoropaniuk/optee_test/events","assignees_url":"https://api.github.com/repos/igoropaniuk/optee_test/assignees{/user}","branches_url":"https://api.github.com/repos/igoropaniuk/optee_test/branches{/branch}","tags_url":"https://api.github.com/repos/igoropaniuk/optee_test/tags","blobs_url":"https://api.github.com/repos/igoropaniuk/optee_test/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/igoropaniuk/optee_test/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/igoropaniuk/optee_test/git/refs{/sha}","trees_url":"https://api.github.com/repos/igoropaniuk/optee_test/git/trees{/sha}","statuses_url":"https://api.github.com/repos/igoropaniuk/optee_test/statuses/{sha}","languages_url":"https://api.github.com/repos/igoropaniuk/optee_test/languages","stargazers_url":"https://api.github.com/repos/igoropaniuk/optee_test/stargazers","contributors_url":"https://api.github.com/repos/igoropaniuk/optee_test/contributors","subscribers_url":"https://api.github.com/repos/igoropaniuk/optee_test/subscribers","subscription_url":"https://api.github.com/repos/igoropaniuk/optee_test/subscription","commits_url":"https://api.github.com/repos/igoropaniuk/optee_test/commits{/sha}","git_commits_url":"https://api.github.com/repos/igoropaniuk/optee_test/git/commits{/sha}","comments_url":"https://api.github.com/repos/igoropaniuk/optee_test/comments{/number}","issue_comment_url":"https://api.github.com/repos/igoropaniuk/optee_test/issues/comments{/number}","contents_url":"https://api.github.com/repos/igoropaniuk/optee_test/contents/{+path}","compare_url":"https://api.github.com/repos/igoropaniuk/optee_test/compare/{base}...{head}","merges_url":"https://api.github.com/repos/igoropaniuk/optee_test/merges","archive_url":"https://api.github.com/repos/igoropaniuk/optee_test/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/igoropaniuk/optee_test/downloads","issues_url":"https://api.github.com/repos/igoropaniuk/optee_test/issues{/number}","pulls_url":"https://api.github.com/repos/igoropaniuk/optee_test/pulls{/number}","milestones_url":"https://api.github.com/repos/igoropaniuk/optee_test/milestones{/number}","notifications_url":"https://api.github.com/repos/igoropaniuk/optee_test/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/igoropaniuk/optee_test/labels{/name}","releases_url":"https://api.github.com/repos/igoropaniuk/optee_test/releases{/id}","deployments_url":"https://api.github.com/repos/igoropaniuk/optee_test/deployments","created_at":"2016-09-08T15:03:05Z","updated_at":"2016-09-08T15:03:07Z","pushed_at":"2016-09-13T10:44:54Z","git_url":"git://github.com/igoropaniuk/optee_test.git","ssh_url":"git@github.com:igoropaniuk/optee_test.git","clone_url":"https://github.com/igoropaniuk/optee_test.git","svn_url":"https://github.com/igoropaniuk/optee_test","homepage":null,"size":3174,"stargazers_count":0,"watchers_count":0,"language":"C","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"OP-TEE:master","ref":"master","sha":"327672cda23a15b5aa743177f839099c003d9482","user":{"login":"OP-TEE","id":7488961,"avatar_url":"https://avatars.githubusercontent.com/u/7488961?v=3","gravatar_id":"","url":"https://api.github.com/users/OP-TEE","html_url":"https://github.com/OP-TEE","followers_url":"https://api.github.com/users/OP-TEE/followers","following_url":"https://api.github.com/users/OP-TEE/following{/other_user}","gists_url":"https://api.github.com/users/OP-TEE/gists{/gist_id}","starred_url":"https://api.github.com/users/OP-TEE/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/OP-TEE/subscriptions","organizations_url":"https://api.github.com/users/OP-TEE/orgs","repos_url":"https://api.github.com/users/OP-TEE/repos","events_url":"https://api.github.com/users/OP-TEE/events{/privacy}","received_events_url":"https://api.github.com/users/OP-TEE/received_events","type":"Organization","site_admin":false},"repo":{"id":38317938,"name":"optee_test","full_name":"OP-TEE/optee_test","owner":{"login":"OP-TEE","id":7488961,"avatar_url":"https://avatars.githubusercontent.com/u/7488961?v=3","gravatar_id":"","url":"https://api.github.com/users/OP-TEE","html_url":"https://github.com/OP-TEE","followers_url":"https://api.github.com/users/OP-TEE/followers","following_url":"https://api.github.com/users/OP-TEE/following{/other_user}","gists_url":"https://api.github.com/users/OP-TEE/gists{/gist_id}","starred_url":"https://api.github.com/users/OP-TEE/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/OP-TEE/subscriptions","organizations_url":"https://api.github.com/users/OP-TEE/orgs","repos_url":"https://api.github.com/users/OP-TEE/repos","events_url":"https://api.github.com/users/OP-TEE/events{/privacy}","received_events_url":"https://api.github.com/users/OP-TEE/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/OP-TEE/optee_test","description":"Test suite","fork":false,"url":"https://api.github.com/repos/OP-TEE/optee_test","forks_url":"https://api.github.com/repos/OP-TEE/optee_test/forks","keys_url":"https://api.github.com/repos/OP-TEE/optee_test/keys{/key_id}","collaborators_url":"https://api.github.com/repos/OP-TEE/optee_test/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/OP-TEE/optee_test/teams","hooks_url":"https://api.github.com/repos/OP-TEE/optee_test/hooks","issue_events_url":"https://api.github.com/repos/OP-TEE/optee_test/issues/events{/number}","events_url":"https://api.github.com/repos/OP-TEE/optee_test/events","assignees_url":"https://api.github.com/repos/OP-TEE/optee_test/assignees{/user}","branches_url":"https://api.github.com/repos/OP-TEE/optee_test/branches{/branch}","tags_url":"https://api.github.com/repos/OP-TEE/optee_test/tags","blobs_url":"https://api.github.com/repos/OP-TEE/optee_test/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/OP-TEE/optee_test/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/OP-TEE/optee_test/git/refs{/sha}","trees_url":"https://api.github.com/repos/OP-TEE/optee_test/git/trees{/sha}","statuses_url":"https://api.github.com/repos/OP-TEE/optee_test/statuses/{sha}","languages_url":"https://api.github.com/repos/OP-TEE/optee_test/languages","stargazers_url":"https://api.github.com/repos/OP-TEE/optee_test/stargazers","contributors_url":"https://api.github.com/repos/OP-TEE/optee_test/contributors","subscribers_url":"https://api.github.com/repos/OP-TEE/optee_test/subscribers","subscription_url":"https://api.github.com/repos/OP-TEE/optee_test/subscription","commits_url":"https://api.github.com/repos/OP-TEE/optee_test/commits{/sha}","git_commits_url":"https://api.github.com/repos/OP-TEE/optee_test/git/commits{/sha}","comments_url":"https://api.github.com/repos/OP-TEE/optee_test/comments{/number}","issue_comment_url":"https://api.github.com/repos/OP-TEE/optee_test/issues/comments{/number}","contents_url":"https://api.github.com/repos/OP-TEE/optee_test/contents/{+path}","compare_url":"https://api.github.com/repos/OP-TEE/optee_test/compare/{base}...{head}","merges_url":"https://api.github.com/repos/OP-TEE/optee_test/merges","archive_url":"https://api.github.com/repos/OP-TEE/optee_test/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/OP-TEE/optee_test/downloads","issues_url":"https://api.github.com/repos/OP-TEE/optee_test/issues{/number}","pulls_url":"https://api.github.com/repos/OP-TEE/optee_test/pulls{/number}","milestones_url":"https://api.github.com/repos/OP-TEE/optee_test/milestones{/number}","notifications_url":"https://api.github.com/repos/OP-TEE/optee_test/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/OP-TEE/optee_test/labels{/name}","releases_url":"https://api.github.com/repos/OP-TEE/optee_test/releases{/id}","deployments_url":"https://api.github.com/repos/OP-TEE/optee_test/deployments","created_at":"2015-06-30T15:40:48Z","updated_at":"2016-08-05T22:05:16Z","pushed_at":"2016-09-13T10:50:38Z","git_url":"git://github.com/OP-TEE/optee_test.git","ssh_url":"git@github.com:OP-TEE/optee_test.git","clone_url":"https://github.com/OP-TEE/optee_test.git","svn_url":"https://github.com/OP-TEE/optee_test","homepage":null,"size":3236,"stargazers_count":17,"watchers_count":17,"language":"C","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":31,"mirror_url":null,"open_issues_count":6,"forks":31,"open_issues":6,"watchers":17,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/OP-TEE/optee_test/pulls/125"},"html":{"href":"https://github.com/OP-TEE/optee_test/pull/125"},"issue":{"href":"https://api.github.com/repos/OP-TEE/optee_test/issues/125"},"comments":{"href":"https://api.github.com/repos/OP-TEE/optee_test/issues/125/comments"},"review_comments":{"href":"https://api.github.com/repos/OP-TEE/optee_test/pulls/125/comments"},"review_comment":{"href":"https://api.github.com/repos/OP-TEE/optee_test/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/OP-TEE/optee_test/pulls/125/commits"},"statuses":{"href":"https://api.github.com/repos/OP-TEE/optee_test/statuses/68ecf4250668e923c00ce40564cd1350d45675b0"}}}}
{"actor":{"display_login":"jforissier"}}