sv_magic -> scratchpad
authorCafe <cafe@not.applicable>
Thu, 27 Jul 2017 00:00:00 +0000 (00:00 +0000)
committerCafe <cafe@not.applicable>
Thu, 27 Jul 2017 19:06:08 +0000 (19:06 +0000)
re.c

diff --git a/re.c b/re.c
index 3fff209f10d733c2e4f3677a955c7e778eba8c65..44d4504adec00f7b6649b1ba35468b01443de299 100644 (file)
--- a/re.c
+++ b/re.c
@@ -12,6 +12,8 @@
 
 #define HEAP_FREE_ADDRESS 0x1DABE0000
 
+#define SV_OFFSET (0x4000)
+
 /* TODO: allocate these indices dynamically; message passing */
 
 #define INDEX_VERTEX 1
@@ -55,21 +57,20 @@ void *set_value_helper(int fd, uint64_t out) {
        return packet;
 }
 
-uint64_t make_mfbd(bool tiler, uint64_t sv_magic)
+uint64_t make_mfbd(bool tiler, uint64_t scratchpad)
 {
-       printf("sv_magic: %LX\n", sv_magic);
        struct tentative_mfbd *mfbd = galloc(sizeof(struct tentative_mfbd));
        memset(mfbd, 0, sizeof(struct tentative_mfbd));
 
        /* zeroes */
-       mfbd->block2[0] = sv_magic;
-       mfbd->block2[1] = sv_magic + 0x200;
-       mfbd->ugaT = /* (uint32_t) galloc(64) */ 0x5ABA0000;
-       mfbd->unknown_gpu_address = /* (uint32_t) galloc(64) */ 0x5ABA0100;
+       mfbd->block2[0] = scratchpad + SV_OFFSET;
+       mfbd->block2[1] = scratchpad + SV_OFFSET + 0x200;
+       mfbd->ugaT = /* (uint32_t) galloc(64) */ /* 0x5ABA0000 */ scratchpad;
+       mfbd->unknown_gpu_address = /* (uint32_t) galloc(64) */ /* 0x5ABA0100 */ 0;
 
        /* Unknown contents -- it's a mystery! */
        mfbd->unknown2 = /* (uint32_t) galloc(64) */ 0x5ABA0200;
-       mfbd->unknown_gpu_addressN = /* (uint32_t) galloc(64) */ 0x5ABA0300;
+       mfbd->unknown_gpu_addressN = /* (uint32_t) galloc(64) */ /* 0x5ABA0300 */ 0;
 
        /* Match traces. TODO decode */
        mfbd->flags = 0xF0;
@@ -95,16 +96,18 @@ uint64_t make_mfbd(bool tiler, uint64_t sv_magic)
        mfbd->block3[14] = 0x04000000;
        mfbd->block3[15] = 0x880A8899;*/
 
+       uint64_t sab0 = 0x5ABA5ABA00000000;
+
        uint64_t block3[] = {
                0x0000000000000000,
                0x0000000000030005,
-               0x00000000B27F1600,
-               0x0000000102024000,
+               sab0 /*0x00000000B27F1600*/,
+               mfbd->block2[0] /*0x0000000102024000*/,
                0x0000000000000003,
                0x0000000000000000,
                0x0000000000000000,
                0x0000000000000000,
-               0x00000000B27F1900
+               sab0 + 0x300 /* 0x00000000B27F1900 */
        };
 
        memcpy(mfbd->block3, block3, sizeof(block3));
@@ -112,7 +115,7 @@ uint64_t make_mfbd(bool tiler, uint64_t sv_magic)
        return (uint64_t ) (uint32_t) mfbd | MFBD | (tiler ? FBD_VERTEX_TILER : FBD_FRAGMENT);
 }
 
-int job_chain_fragment(int fd, uint64_t sv_magic) {
+int job_chain_fragment(int fd, uint64_t scratchpad) {
        void* packet = galloc(sizeof(struct job_descriptor_header) + sizeof(struct payload_fragment));
 
        struct job_descriptor_header header = {
@@ -131,7 +134,7 @@ int job_chain_fragment(int fd, uint64_t sv_magic) {
        struct payload_fragment payload = {
                .min_tile_coord = MAKE_TILE_COORD(0, 0, 0),
                .max_tile_coord = MAKE_TILE_COORD(29, 45, 0),
-               .fragment_fbd = make_mfbd(false, sv_magic)
+               .fragment_fbd = make_mfbd(false, scratchpad)
        };
 
        memcpy(packet, &header, sizeof(header));
@@ -397,9 +400,9 @@ void* vertex_tiler_helper(int fd, bool tiler, uint32_t fbd, uint32_t vertex_buff
        return packet;
 }
 
-int job_chain_vertex_tiler(int fd, uint64_t sv_magic) {
+int job_chain_vertex_tiler(int fd, uint64_t scratchpad) {
        uint32_t vertex_buffer = upload_vertices();
-       uint32_t vertex_fbd = (uint32_t) make_mfbd(true, sv_magic);
+       uint32_t vertex_fbd = (uint32_t) make_mfbd(true, scratchpad);
 
        uint32_t zero_buffer = (uint32_t) alloc_gpu_pages(fd, 0x20,
                        0x3800 | BASE_MEM_PROT_CPU_RD |
@@ -407,7 +410,7 @@ int job_chain_vertex_tiler(int fd, uint64_t sv_magic) {
        memset( (void*) zero_buffer, 0xDA, 0x20 << PAGE_SHIFT);
        sync_gpu(fd, (void*) zero_buffer, zero_buffer, 0x20 << PAGE_SHIFT);
 
-       void *set = set_value_helper(fd, sv_magic);
+       void *set = set_value_helper(fd, scratchpad + SV_OFFSET);
        void *vertex = vertex_tiler_helper(fd, false, vertex_fbd, vertex_buffer, zero_buffer);
        void *tiler = vertex_tiler_helper(fd, true, vertex_fbd, vertex_buffer, zero_buffer);
 
@@ -502,9 +505,9 @@ int main()
        framebuffer = 0x1CAFE0000;
        printf("Framebuffer: %LX\n", framebuffer);
 
-       uint64_t sv_magic = alloc_gpu_pages(fd, 8, 0xC);
-       job_chain_vertex_tiler(fd, sv_magic);
-       job_chain_fragment(fd, sv_magic);
+       uint64_t scratchpad = alloc_gpu_pages(fd, 8, 0xC);
+       job_chain_vertex_tiler(fd, scratchpad);
+       job_chain_fragment(fd, scratchpad);
        job_chain_replay(fd);
        sync_gpu(fd, (uint8_t*) cbma_top, cbma_top, cbma_bottom - cbma_top);
        flush_job_queue(fd);