Refactor out shim code
[chai.git] / re.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <memory.h>
4 #include <sys/mman.h>
5
6 #include "shim.h"
7 #include "jobs.h"
8 #include "../oolong/chai-notes.h"
9
10 int atom_count = 0;
11
12 int job_chain_set_value(int fd) {
13         uint64_t descriptor = alloc_gpu_pages(fd, 1,
14                         BASE_MEM_PROT_GPU_RD | BASE_MEM_PROT_GPU_WR);
15
16         uint64_t magic = alloc_gpu_pages(fd, 1, BASE_MEM_PROT_GPU_WR);
17         uint8_t* mag_buf = mmap_gpu(fd, magic, 1);
18
19         uint8_t* buffer = mmap_gpu(fd, descriptor, 1);
20
21         struct job_descriptor_header header = {
22                 .exception_status = JOB_NOT_STARTED,
23                 .first_incomplete_task = 0,
24                 .fault_pointer = 0,
25                 .job_descriptor_size = 1, /* 64-bit */
26                 .job_type = JOB_TYPE_SET_VALUE,
27                 .job_barrier = /* 1 */ 0, /* set for first in chain? */
28                 .job_index = atom_count,
29                 .job_dependency_index_1 = 0,
30                 .job_dependency_index_2 = 0,
31                 .next_job = 0 
32         };
33
34         struct payload_set_value payload = {
35                 .out = magic,
36                 .unknown = 0x03
37         };
38
39         memcpy(buffer, &header, sizeof(header));
40         memcpy(buffer + sizeof(header), &payload, sizeof(payload));
41
42         sync_gpu(fd, buffer, descriptor, 1);
43
44         /* Send a test job */
45
46         struct base_dependency depNoDep = {
47                 .atom_id = 0,
48                 .dependency_type = BASE_JD_DEP_TYPE_INVALID
49         };
50
51         struct base_jd_atom_v2 job = {
52                 .jc = descriptor, /* 0x80 aligned */
53                 .extres_list = NULL,
54                 .nr_extres = 0,
55                 .core_req = BASE_JD_REQ_V,
56                 .atom_number = ++atom_count,
57                 .prio = BASE_JD_PRIO_LOW,
58                 .device_nr = 0
59         };
60
61         job.pre_dep[0] = depNoDep;
62         job.pre_dep[1] = depNoDep;
63
64         submit_job(fd, &job, 1);
65
66         memcpy(&header, buffer, sizeof(header));
67
68         munmap(buffer, PAGE_SIZE);
69         munmap(mag_buf, PAGE_SIZE);
70
71         free_gpu(fd, descriptor);
72         free_gpu(fd, magic);
73
74         return header.exception_status;
75 }
76
77 int main()
78 {
79         int fd = open_kernel_module();
80
81         job_chain_set_value(fd);
82
83         /* Hang to prevent the tracer from going bananas */
84
85         while(1);
86
87         return 0;
88 }