1*eeddd59fSLaurent Vivier /* 2*eeddd59fSLaurent Vivier * This work is licensed under the terms of the GNU GPL, version 2 or later. 3*eeddd59fSLaurent Vivier * See the COPYING file in the top-level directory. 4*eeddd59fSLaurent Vivier */ 5*eeddd59fSLaurent Vivier 6*eeddd59fSLaurent Vivier #include "qemu/osdep.h" 7*eeddd59fSLaurent Vivier #include "libqtest.h" 8*eeddd59fSLaurent Vivier #include "libqos/rtas.h" 9*eeddd59fSLaurent Vivier 10*eeddd59fSLaurent Vivier static void qrtas_copy_args(uint64_t target_args, uint32_t nargs, 11*eeddd59fSLaurent Vivier uint32_t *args) 12*eeddd59fSLaurent Vivier { 13*eeddd59fSLaurent Vivier int i; 14*eeddd59fSLaurent Vivier 15*eeddd59fSLaurent Vivier for (i = 0; i < nargs; i++) { 16*eeddd59fSLaurent Vivier writel(target_args + i * sizeof(uint32_t), args[i]); 17*eeddd59fSLaurent Vivier } 18*eeddd59fSLaurent Vivier } 19*eeddd59fSLaurent Vivier 20*eeddd59fSLaurent Vivier static void qrtas_copy_ret(uint64_t target_ret, uint32_t nret, uint32_t *ret) 21*eeddd59fSLaurent Vivier { 22*eeddd59fSLaurent Vivier int i; 23*eeddd59fSLaurent Vivier 24*eeddd59fSLaurent Vivier for (i = 0; i < nret; i++) { 25*eeddd59fSLaurent Vivier ret[i] = readl(target_ret + i * sizeof(uint32_t)); 26*eeddd59fSLaurent Vivier } 27*eeddd59fSLaurent Vivier } 28*eeddd59fSLaurent Vivier 29*eeddd59fSLaurent Vivier static uint64_t qrtas_call(QGuestAllocator *alloc, const char *name, 30*eeddd59fSLaurent Vivier uint32_t nargs, uint32_t *args, 31*eeddd59fSLaurent Vivier uint32_t nret, uint32_t *ret) 32*eeddd59fSLaurent Vivier { 33*eeddd59fSLaurent Vivier uint64_t res; 34*eeddd59fSLaurent Vivier uint64_t target_args, target_ret; 35*eeddd59fSLaurent Vivier 36*eeddd59fSLaurent Vivier target_args = guest_alloc(alloc, nargs * sizeof(uint32_t)); 37*eeddd59fSLaurent Vivier target_ret = guest_alloc(alloc, nret * sizeof(uint32_t)); 38*eeddd59fSLaurent Vivier 39*eeddd59fSLaurent Vivier qrtas_copy_args(target_args, nargs, args); 40*eeddd59fSLaurent Vivier res = qtest_rtas_call(global_qtest, name, 41*eeddd59fSLaurent Vivier nargs, target_args, nret, target_ret); 42*eeddd59fSLaurent Vivier qrtas_copy_ret(target_ret, nret, ret); 43*eeddd59fSLaurent Vivier 44*eeddd59fSLaurent Vivier guest_free(alloc, target_ret); 45*eeddd59fSLaurent Vivier guest_free(alloc, target_args); 46*eeddd59fSLaurent Vivier 47*eeddd59fSLaurent Vivier return res; 48*eeddd59fSLaurent Vivier } 49*eeddd59fSLaurent Vivier 50*eeddd59fSLaurent Vivier int qrtas_get_time_of_day(QGuestAllocator *alloc, struct tm *tm, uint32_t *ns) 51*eeddd59fSLaurent Vivier { 52*eeddd59fSLaurent Vivier int res; 53*eeddd59fSLaurent Vivier uint32_t ret[8]; 54*eeddd59fSLaurent Vivier 55*eeddd59fSLaurent Vivier res = qrtas_call(alloc, "get-time-of-day", 0, NULL, 8, ret); 56*eeddd59fSLaurent Vivier if (res != 0) { 57*eeddd59fSLaurent Vivier return res; 58*eeddd59fSLaurent Vivier } 59*eeddd59fSLaurent Vivier 60*eeddd59fSLaurent Vivier res = ret[0]; 61*eeddd59fSLaurent Vivier memset(tm, 0, sizeof(*tm)); 62*eeddd59fSLaurent Vivier tm->tm_year = ret[1] - 1900; 63*eeddd59fSLaurent Vivier tm->tm_mon = ret[2] - 1; 64*eeddd59fSLaurent Vivier tm->tm_mday = ret[3]; 65*eeddd59fSLaurent Vivier tm->tm_hour = ret[4]; 66*eeddd59fSLaurent Vivier tm->tm_min = ret[5]; 67*eeddd59fSLaurent Vivier tm->tm_sec = ret[6]; 68*eeddd59fSLaurent Vivier *ns = ret[7]; 69*eeddd59fSLaurent Vivier 70*eeddd59fSLaurent Vivier return res; 71*eeddd59fSLaurent Vivier } 72