xref: /qemu/tests/qtest/libqos/rtas.c (revision eeddd59f59626302cdb7db2602140ac9a076dec9)
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