fn ipc_send(buffer_id, mem_addr, length){
    // set the ecall
    li64(r1, 3);
    // Set the buffer ID to be the BufferID
    li64(r2, buffer_id);
    lra(r3, r0, mem_addr);
    // set the length
    li64(r4, length);
    // ecall
    eca();
}


fn ipc_recv(buffer_id){
    li64(r1, 4);
    eca();
}


fn ipc_make_bound_buffer(length) {
    li64(r1, 1);
    li64(r2, 1);
    li64(r3, length);
    eca();

    // The ipc buffer id is in r1
}

private fn log(log_level, string){
    // This is NOT the final format
    let str = data::str(string + log_level);
    // 1 byte for the log level
    // 8 bytes for the length to the message
    // 8 bytes for the pointer to the string
    
    ipc_send(1, str, str.len);
}

fn Error(string) {log(0, string);}
fn Warn(string) {log(1, string);}
fn Info(string) {log(2, string);}
// Due to rhai limitations this cannot be debug
// because of this all of the log levels are upper case
fn Debug(string) {log(3, string);}
fn Trace(string) {log(4, string);}


fn open(string_path){
    let file_path = data::str(string_path);
    ipc_send(2, file_path, file_path.len);
}
fn write(){}
fn read(){}
fn close(){}