581ce57c20fcea168d4cc42fe888cfed91be9924
[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 /* CBMA -- Cafe's Bad Memory Allocator */
11
12 #define CBMA_PAGES 1024
13 uint64_t cbma_bottom;
14
15 void init_cbma(int fd) {
16         cbma_bottom = alloc_gpu_pages(fd, CBMA_PAGES, BASE_MEM_PROT_GPU_RD | BASE_MEM_PROT_GPU_WR | BASE_MEM_SAME_VA);
17 }
18
19 void* galloc(size_t sz) {
20         cbma_bottom &= 0xFFFFFF00;
21         cbma_bottom += 0x100;
22         cbma_bottom += sz;
23         return (void*) (uint32_t) (cbma_bottom - sz);
24 }
25
26 void gfree(void* ptr) {
27         printf("gfree %p", ptr);
28         /* TODO */
29 }
30
31 int atom_count = 0;
32
33 int job_chain_set_value(int fd) {
34         void* packet = galloc(sizeof(struct job_descriptor_header) + sizeof(struct payload_set_value));
35         void* magic = galloc(16);
36
37         struct job_descriptor_header header = {
38                 .exception_status = JOB_NOT_STARTED,
39                 .first_incomplete_task = 0,
40                 .fault_pointer = 0,
41                 .job_descriptor_size = 1, /* 64-bit */
42                 .job_type = JOB_TYPE_SET_VALUE,
43                 .job_barrier = /* 1 */ 0, /* set for first in chain? */
44                 .job_index = atom_count,
45                 .job_dependency_index_1 = 0,
46                 .job_dependency_index_2 = 0,
47                 .next_job = 0 
48         };
49
50         struct payload_set_value payload = {
51                 .out = (uint32_t) magic,
52                 .unknown = 0x03
53         };
54
55         memcpy(packet, &header, sizeof(header));
56         memcpy(packet + sizeof(header), &payload, sizeof(payload));
57
58         sync_gpu(fd, packet, (uint32_t) packet, 1);
59
60         /* Send a test job */
61
62         struct base_dependency depNoDep = {
63                 .atom_id = 0,
64                 .dependency_type = BASE_JD_DEP_TYPE_INVALID
65         };
66
67         struct base_jd_atom_v2 job = {
68                 .jc = (uint32_t) packet, /* 0x80 aligned */
69                 .extres_list = NULL,
70                 .nr_extres = 0,
71                 .core_req = BASE_JD_REQ_V,
72                 .atom_number = ++atom_count,
73                 .prio = BASE_JD_PRIO_LOW,
74                 .device_nr = 0
75         };
76
77         job.pre_dep[0] = depNoDep;
78         job.pre_dep[1] = depNoDep;
79
80         submit_job(fd, &job, 1);
81
82         gfree(packet);
83         gfree(magic);
84
85         return 0;
86 }
87
88 int main()
89 {
90         int fd = open_kernel_module();
91
92         init_cbma(fd);
93
94         job_chain_set_value(fd);
95
96         /* Hang to prevent the tracer from going bananas */
97
98         while(1);
99
100         return 0;
101 }