#include "smp.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern uint64_t hhdmoffset; uacpi_status uacpi_kernel_get_rsdp(uacpi_phys_addr *out_rsdp_address){ extern struct limine_rsdp_request rsdp_request; assert(rsdp_request.response != NULL); out_rsdp_address = (uacpi_phys_addr*)rsdp_request.response->address; return UACPI_STATUS_OK; } void uacpi_kernel_log(uacpi_log_level l, const uacpi_char* str){ char* level; switch(l){ case UACPI_LOG_ERROR: kprintf("{k}[uACPI] {sk}\n", ANSI_COLOR_RED, str, ANSI_COLOR_RESET); break; case UACPI_LOG_WARN: kprintf("{k}[uACPI] {sk}\n", ANSI_COLOR_YELLOW, str, ANSI_COLOR_RESET); break; case UACPI_LOG_INFO: kprintf("{k}[uACPI]{k} {s}\n", ANSI_COLOR_MAGENTA, ANSI_COLOR_RESET, str); break; default: kprintf("[uACPI] {s}\n", str); } } uacpi_status uacpi_kernel_pci_device_open(uacpi_pci_address address, uacpi_handle *out_handle){ *out_handle = kzalloc(sizeof(uacpi_pci_address)); memcpy(*out_handle, &address, sizeof(uacpi_pci_address)); return UACPI_STATUS_OK; } void uacpi_kernel_pci_device_close(uacpi_handle handle){ free(handle); return; } uacpi_status uacpi_kernel_pci_read8(uacpi_handle device, uacpi_size offset, uacpi_u8 *value){ *value = *(uint8_t*)((uint64_t)device + offset); return UACPI_STATUS_OK; } uacpi_status uacpi_kernel_pci_read16(uacpi_handle device, uacpi_size offset, uacpi_u16 *value){ *value = *(uint16_t*)((uint64_t)device + offset); return UACPI_STATUS_OK; } uacpi_status uacpi_kernel_pci_read32(uacpi_handle device, uacpi_size offset, uacpi_u32 *value){ *value = *(uint32_t*)((uint64_t)device + offset); return UACPI_STATUS_OK; } uacpi_status uacpi_kernel_pci_write8(uacpi_handle device, uacpi_size offset, uacpi_u8 value){ *(uint8_t*)((uint64_t)device + offset + get_kinfo()->hhdmoffset) = value; return UACPI_STATUS_OK; } uacpi_status uacpi_kernel_pci_write16(uacpi_handle device, uacpi_size offset, uacpi_u16 value){ *(uint16_t*)((uint64_t)device + offset + get_kinfo()->hhdmoffset) = value; return UACPI_STATUS_OK; } uacpi_status uacpi_kernel_pci_write32(uacpi_handle device, uacpi_size offset, uacpi_u32 value){ *(uint32_t*)((uint64_t)device + offset + get_kinfo()->hhdmoffset) = value; return UACPI_STATUS_OK; } uacpi_status uacpi_kernel_io_map(uacpi_io_addr base, uacpi_size len, uacpi_handle *out_handle){ return UACPI_STATUS_UNIMPLEMENTED; } void uacpi_kernel_io_unmap(uacpi_handle handle){ asm("nop"); } uacpi_status uacpi_kernel_io_read8(uacpi_handle handle, uacpi_size offset, uacpi_u8 *out_value){ *out_value = inb(((uint16_t)handle + offset)); return UACPI_STATUS_OK; } uacpi_status uacpi_kernel_io_read16(uacpi_handle handle, uacpi_size offset, uacpi_u16 *out_value){ *out_value = inw(((uint16_t)handle + offset)); return UACPI_STATUS_OK; } uacpi_status uacpi_kernel_io_read32(uacpi_handle handle, uacpi_size offset, uacpi_u32 *out_value){ *out_value = inl(((uint16_t)handle + offset)); return UACPI_STATUS_OK; } uacpi_status uacpi_kernel_io_write8(uacpi_handle handle, uacpi_size offset, uacpi_u8 in_value){ outb(((uint16_t)handle + offset), in_value); return UACPI_STATUS_OK; } uacpi_status uacpi_kernel_io_write16(uacpi_handle handle, uacpi_size offset, uacpi_u16 in_value){ outw(((uint16_t)handle + offset), in_value); return UACPI_STATUS_OK; } uacpi_status uacpi_kernel_io_write32(uacpi_handle handle, uacpi_size offset, uacpi_u32 in_value){ outb(((uint16_t)handle + offset), in_value); return UACPI_STATUS_OK; } uacpi_status uacpi_kernel_io_write(uacpi_handle handle, uacpi_size offset, uacpi_u8 byte_width, uacpi_u64 value){ if(byte_width == 1){ outb((uint16_t)offset, value); }else if(byte_width == 2){ outw((uint16_t)offset, value); }else if(byte_width == 4){ outl((uint16_t)offset, value); }else{ return UACPI_STATUS_INTERNAL_ERROR; } return UACPI_STATUS_OK; } void *uacpi_kernel_map(uacpi_phys_addr addr, uacpi_size len){ uint64_t offset = addr % PAGE_SIZE; kmap_pages((void*)addr, len, 0); return (void*)addr + get_kinfo()->hhdmoffset + offset; } void uacpi_kernel_unmap(void *addr, uacpi_size len){ kunmap_pages(addr, len); } void *uacpi_kernel_alloc(uacpi_size size){ void *ret = kmalloc(size); if(ret == NULL){ klog(__func__, "Unable to kmalloc!"); } return ret; } void uacpi_kernel_free(void *mem){ if(mem == NULL){ return; } kfree(mem); } uacpi_u64 uacpi_kernel_get_nanoseconds_since_boot(void){ return get_timestamp_us() * 1000; } void uacpi_kernel_stall(uacpi_u8 usec){ sleep(usec / 1000); } void uacpi_kernel_sleep(uacpi_u64 msec){ sleep(msec); } uacpi_handle uacpi_kernel_create_mutex(){ return kmalloc(sizeof(atomic_flag)); } void uacpi_kernel_free_mutex(uacpi_handle handle){ free(handle); return; } uacpi_handle uacpi_kernel_create_event(void){ return kmalloc(sizeof(uint64_t)); } void uacpi_kernel_free_event(uacpi_handle handle){ kfree(handle); } uacpi_thread_id uacpi_kernel_get_thread_id(void){ return get_current_cpu_state(); } uacpi_status uacpi_kernel_acquire_mutex(uacpi_handle handle, uacpi_u16 t){ atomic_flag *flg = handle; }