1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- /*
- * This file is part of the coreboot project.
- *
- * Copyright (C) 2013 The ChromiumOS Authors
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- */
- #ifndef _SPIKE_UTIL_H
- #define _SPIKE_UTIL_H
- #include <stdint.h>
- //#include <string.h>
- //#include <errno.h>
- #include <arch/encoding.h>
- #include <atomic.h>
- #define LOG_REGBYTES 3
- #define REGBYTES (1 << LOG_REGBYTES)
- #define STORE sd
- #define HLS_SIZE 64
- #define MENTRY_FRAME_SIZE HLS_SIZE
- #define TOHOST_CMD(dev, cmd, payload) \
- (((uint64_t)(dev) << 56) | ((uint64_t)(cmd) << 48) | (uint64_t)(payload))
- #define FROMHOST_DEV(fromhost_value) ((uint64_t)(fromhost_value) >> 56)
- #define FROMHOST_CMD(fromhost_value) ((uint64_t)(fromhost_value) << 8 >> 56)
- #define FROMHOST_DATA(fromhost_value) ((uint64_t)(fromhost_value) << 16 >> 16)
- typedef struct {
- unsigned long base;
- unsigned long size;
- unsigned long node_id;
- } memory_block_info;
- typedef struct {
- unsigned long dev;
- unsigned long cmd;
- unsigned long data;
- unsigned long sbi_private_data;
- } sbi_device_message;
- typedef struct {
- sbi_device_message* device_request_queue_head;
- unsigned long device_request_queue_size;
- sbi_device_message* device_response_queue_head;
- sbi_device_message* device_response_queue_tail;
- int hart_id;
- int ipi_pending;
- } hls_t;
- #define MACHINE_STACK_TOP() ({ \
- register uintptr_t sp asm ("sp"); \
- (void*)((sp + RISCV_PGSIZE) & -RISCV_PGSIZE); })
- // hart-local storage, at top of stack
- #define HLS() ((hls_t*)(MACHINE_STACK_TOP() - HLS_SIZE))
- #define OTHER_HLS(id) ((hls_t*)((void*)HLS() + RISCV_PGSIZE * ((id) - HLS()->hart_id)))
- #define MACHINE_STACK_SIZE RISCV_PGSIZE
- uintptr_t translate_address(uintptr_t vAddr);
- uintptr_t mcall_query_memory(uintptr_t id, memory_block_info *p);
- uintptr_t mcall_hart_id(void);
- uintptr_t htif_interrupt(uintptr_t mcause, uintptr_t* regs);
- uintptr_t mcall_console_putchar(uint8_t ch);
- void testPrint(void);
- uintptr_t mcall_dev_req(sbi_device_message *m);
- uintptr_t mcall_dev_resp(void);
- uintptr_t mcall_set_timer(unsigned long long when);
- uintptr_t mcall_clear_ipi(void);
- uintptr_t mcall_send_ipi(uintptr_t recipient);
- uintptr_t mcall_shutdown(void);
- void hls_init(uint32_t hart_id); // need to call this before launching linux
- #endif
|