From 98ccb3a2d41015b42d46d8b382decc755a003c3f Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Tue, 4 Jun 2024 13:41:11 -0400 Subject: project: Initial commit Signed-off-by: Ian Moffett --- sys/include/dev/cons/cons.h | 54 ++++++++++++++++++++++++++++++++++++++++++ sys/include/dev/cons/font.h | 40 +++++++++++++++++++++++++++++++ sys/include/dev/video/fbdev.h | 55 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 149 insertions(+) create mode 100644 sys/include/dev/cons/cons.h create mode 100644 sys/include/dev/cons/font.h create mode 100644 sys/include/dev/video/fbdev.h (limited to 'sys/include/dev') diff --git a/sys/include/dev/cons/cons.h b/sys/include/dev/cons/cons.h new file mode 100644 index 0000000..15a7f59 --- /dev/null +++ b/sys/include/dev/cons/cons.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2023-2024 Ian Marco Moffett and the Osmora Team. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Hyra nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _DEV_CONS_H_ +#define _DEV_CONS_H_ + +#include +#include + +struct cons_screen { + struct fbdev fbdev; + uint32_t fg; + uint32_t bg; + + /* Private */ + uint32_t *fb_mem; + uint32_t nrows; + uint32_t ncols; + uint32_t ch_col; /* Current col */ + uint32_t ch_row; /* Current row */ +}; + +void cons_init(void); +int cons_putch(struct cons_screen *scr, char c); + +extern struct cons_screen g_root_scr; + +#endif /* !_DEV_CONS_H_ */ diff --git a/sys/include/dev/cons/font.h b/sys/include/dev/cons/font.h new file mode 100644 index 0000000..b9130fd --- /dev/null +++ b/sys/include/dev/cons/font.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2023-2024 Ian Marco Moffett and the Osmora Team. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Hyra nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _CONS_FONT_H_ +#define _CONS_FONT_H_ + +#include + +#define FONT_WIDTH 8 +#define FONT_HEIGHT 16 + +extern const uint8_t CONS_FONT[]; + +#endif /* !_CONS_FONT_H_ */ diff --git a/sys/include/dev/video/fbdev.h b/sys/include/dev/video/fbdev.h new file mode 100644 index 0000000..33f8547 --- /dev/null +++ b/sys/include/dev/video/fbdev.h @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2023-2024 Ian Marco Moffett and the Osmora Team. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Hyra nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _DEV_FBDEV_H_ +#define _DEV_FBDEV_H_ + +#include +#include + +struct fbdev { + uint32_t *mem; + uint32_t width; + uint32_t height; + uint32_t pitch; +}; + +/* + * Get the index into the framebuffer with an x and y + * position. + */ +__always_inline static inline size_t +fbdev_get_index(const struct fbdev *fbdev, uint32_t x, uint32_t y) +{ + return x + y * (fbdev->pitch / 4); +} + +struct fbdev fbdev_get(void); + +#endif /* !_DEV_FBDEV_H_ */ -- cgit v1.2.3 From d6f85b7c3f4c4d28d1a80799618535786af24b8f Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Tue, 4 Jun 2024 15:49:22 -0400 Subject: kernel: Add timer abstraction Signed-off-by: Ian Moffett --- sys/dev/timer.c | 112 ++++++++++++++++++++++++++++++++++++++++++++++++ sys/include/dev/timer.h | 87 +++++++++++++++++++++++++++++++++++++ 2 files changed, 199 insertions(+) create mode 100644 sys/dev/timer.c create mode 100644 sys/include/dev/timer.h (limited to 'sys/include/dev') diff --git a/sys/dev/timer.c b/sys/dev/timer.c new file mode 100644 index 0000000..4293508 --- /dev/null +++ b/sys/dev/timer.c @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2023-2024 Ian Marco Moffett and the Osmora Team. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Hyra nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include + +/* + * When a timer on the machine has been registered + * to the Hyra kernel, they'll be added to the Hyra timer + * registry. + */ +static const struct timer *tmr_registry[TIMER_ID_COUNT] = { 0 }; + +/* + * Returns true if the timer ID given + * is valid. + * + * @id: ID to verify. + */ +static inline bool +is_timer_id_valid(timer_id_t id) +{ + return id < TIMER_ID_COUNT; +} + +/* + * Adds timer on the machine to the timer registry. To be specific, + * this function writes information about the specific timer to the + * timer registry. However, it will not overwrite an entry. To do this + * you must use tmr_registry_overwrite(), of course with caution. + * + * @id: ID of timer to register. + * @tmr: Timer descriptor to register. + */ +tmrr_status_t +register_timer(timer_id_t id, const struct timer *tmr) +{ + if (!is_timer_id_valid(id)) + return TMRR_INVALID_TYPE; + + if (tmr_registry[id] != NULL) + return TMRR_HAS_ENTRY; + + tmr_registry[id] = tmr; + return TMRR_SUCCESS; +} + +/* + * Overwrites an entry within the timer registery. + * Use with caution. + * + * @id: ID of entry to overwrite. + * @tmr: Timer descriptor to write. + */ +tmrr_status_t +tmr_registry_overwrite(timer_id_t id, const struct timer *tmr) +{ + if (!is_timer_id_valid(id)) + return TMRR_INVALID_TYPE; + + tmr_registry[id] = tmr; + return TMRR_SUCCESS; +} + +/* + * Requests a specific timer descriptor + * with a specific ID. + * + * @id: ID to request. + * @tmr_out: Pointer to memory that'll hold the + * requested descriptor. + */ +tmrr_status_t +req_timer(timer_id_t id, struct timer *tmr_out) +{ + if (!is_timer_id_valid(id)) + return TMRR_INVALID_TYPE; + + if (tmr_registry[id] == NULL) + return TMRR_EMPTY_ENTRY; + + if (tmr_out == NULL) + return TMRR_INVALID_ARG; + + *tmr_out = *tmr_registry[id]; + return TMRR_SUCCESS; +} diff --git a/sys/include/dev/timer.h b/sys/include/dev/timer.h new file mode 100644 index 0000000..813f2aa --- /dev/null +++ b/sys/include/dev/timer.h @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2023-2024 Ian Marco Moffett and the Osmora Team. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Hyra nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _DEV_TIMER_H_ +#define _DEV_TIMER_H_ + +#include + +/* Timer IDs */ +#define TIMER_SCHED 0x00000000U /* Scheduler reserved timer */ +#define TIMER_GP 0x00000001U /* General purpose timer */ + +/* Number of timer IDs, adjust when adding timer IDs */ +#define TIMER_ID_COUNT 2 + +/* Timer registry status */ +#define TMRR_SUCCESS 0x00000000U /* Successful */ +#define TMRR_HAS_ENTRY 0x00000001U /* Already has an entry */ +#define TMRR_INVALID_TYPE 0x00000002U /* Invalid timer id */ +#define TMRR_EMPTY_ENTRY 0x00000003U /* Entry is empty */ +#define TMRR_INVALID_ARG 0x00000004U /* Invalid iface arg */ + +/* See timer ID defines */ +typedef uint8_t timer_id_t; + +/* See timer registry status */ +typedef int tmrr_status_t; + +/* + * Represents a timer, pointer fields + * are optional and may be set to NULL, therefore + * it is paramount to verify any function or general + * pointer field within this struct is checked for + * a NULL value. Fields should be NULL if the timer + * driver implementation doesn't implement support + * for a functionality. + * + * XXX: The msleep, usleep, ... functions must return + * either EXIT_SUCCESS and EXIT_FAILURE from sys/errno.h + * ONLY. + */ +struct timer { + const char *name; /* e.g "HPET" */ + size_t(*calibrate)(void); /* Returns frequency, 0 for unspecified */ + size_t(*get_time_usec)(void); /* Time since init (microseconds) */ + size_t(*get_time_sec)(void); /* Time since init (seconds) */ + int(*msleep)(size_t ms); + int(*usleep)(size_t us); + int(*nsleep)(size_t ns); + void(*periodic_ms)(size_t ms); + void(*periodic_us)(size_t ms); + void(*oneshot_ms)(size_t ms); + void(*oneshot_us)(size_t ms); + void(*stop)(void); +}; + +tmrr_status_t register_timer(timer_id_t id, const struct timer *tmr); +tmrr_status_t tmr_registry_overwrite(timer_id_t, const struct timer *tmr); +tmrr_status_t req_timer(timer_id_t id, struct timer *tmr_out); + +#endif /* !_DEV_TIMER_H_ */ -- cgit v1.2.3 From 996e41f4d86d9369d62700383ab090bdba2be9a7 Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Tue, 4 Jun 2024 15:50:57 -0400 Subject: kernel: Add initial ACPI code Signed-off-by: Ian Moffett --- sys/dev/acpi/acpi_init.c | 110 ++++++++++++++++++++++++++++++++++ sys/dev/acpi/acpi_subr.c | 82 ++++++++++++++++++++++++++ sys/include/dev/acpi/acpi.h | 36 ++++++++++++ sys/include/dev/acpi/acpivar.h | 40 +++++++++++++ sys/include/dev/acpi/tables.h | 130 +++++++++++++++++++++++++++++++++++++++++ sys/kern/init_main.c | 4 ++ 6 files changed, 402 insertions(+) create mode 100644 sys/dev/acpi/acpi_init.c create mode 100644 sys/dev/acpi/acpi_subr.c create mode 100644 sys/include/dev/acpi/acpi.h create mode 100644 sys/include/dev/acpi/acpivar.h create mode 100644 sys/include/dev/acpi/tables.h (limited to 'sys/include/dev') diff --git a/sys/dev/acpi/acpi_init.c b/sys/dev/acpi/acpi_init.c new file mode 100644 index 0000000..a8423e4 --- /dev/null +++ b/sys/dev/acpi/acpi_init.c @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2023-2024 Ian Marco Moffett and the Osmora Team. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Hyra nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#if defined(__x86_64__) +#include +#endif /* __x86_64__ */ + +#define pr_trace(fmt, ...) kprintf("acpi: " fmt, ##__VA_ARGS__) + +static struct acpi_root_sdt *root_sdt = NULL; +static size_t root_sdt_entries = 0; +static volatile struct limine_rsdp_request rsdp_req = { + .id = LIMINE_RSDP_REQUEST, + .revision = 0 +}; + +/* + * Writes out OEMID of ACPI header. + * + * @type: Type of structure (e.g RSDP) + * @oemid: OEMID of structure. + */ +static void +acpi_print_oemid(const char *type, char oemid[OEMID_SIZE]) +{ + if (type != NULL) { + pr_trace("%s OEMID: ", type); + } + + for (size_t i = 0; i < OEMID_SIZE; ++i) { + kprintf(OMIT_TIMESTAMP "%c", oemid[i]); + } + + kprintf(OMIT_TIMESTAMP "\n"); +} + +struct acpi_root_sdt * +acpi_get_root_sdt(void) +{ + return root_sdt; +} + +size_t +acpi_get_root_sdt_len(void) +{ + return root_sdt_entries; +} + +void +acpi_init(void) +{ + struct acpi_rsdp *rsdp; + + if (rsdp_req.response == NULL) { + panic("RSDP request has no response\n"); + } + + /* Fetch the RSDP */ + rsdp = rsdp_req.response->address; + acpi_print_oemid("RSDP", rsdp->oemid); + + /* Fetch the root SDT */ + if (rsdp->revision >= 2) { + root_sdt = PHYS_TO_VIRT(rsdp->xsdt_addr); + pr_trace("Using XSDT as root SDT\n"); + } else { + root_sdt = PHYS_TO_VIRT(rsdp->rsdt_addr); + pr_trace("Using RSDT as root SDT\n"); + } + + if (acpi_checksum(&root_sdt->hdr) != 0) { + panic("Root SDT checksum is invalid!\n"); + } + + root_sdt_entries = (root_sdt->hdr.length - sizeof(root_sdt->hdr)) / 4; +} diff --git a/sys/dev/acpi/acpi_subr.c b/sys/dev/acpi/acpi_subr.c new file mode 100644 index 0000000..7cf3287 --- /dev/null +++ b/sys/dev/acpi/acpi_subr.c @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2023-2024 Ian Marco Moffett and the Osmora Team. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Hyra nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include +#include + +/* + * Compute the ACPI checksum of a header. + * + * @hdr: HDR to check. + * + * Must return zero to be a valid checksum! + */ +uint8_t +acpi_checksum(struct acpi_header *hdr) +{ + uint8_t sum = 0; + + for (int i = 0; i < hdr->length; ++i) { + sum += ((char *)hdr)[i]; + } + + return sum; +} + +/* + * Looks up an ACPI table with a specific + * signature e.g "APIC" for MADT (if present). + * + * @query: The specific query to make e.g "APIC" + */ +void * +acpi_query(const char *query) +{ + struct acpi_header *hdr; + struct acpi_root_sdt *root_sdt; + size_t root_sdt_len, signature_len; + + root_sdt = acpi_get_root_sdt(); + root_sdt_len = acpi_get_root_sdt_len(); + signature_len = sizeof(hdr->signature); + + for (size_t i = 0; i < root_sdt_len; ++i) { + hdr = (struct acpi_header *)PHYS_TO_VIRT(root_sdt->tables[i]); + + if (memcmp(hdr->signature, query, signature_len) == 0) { + return (void *)hdr; + } + } + + return NULL; +} diff --git a/sys/include/dev/acpi/acpi.h b/sys/include/dev/acpi/acpi.h new file mode 100644 index 0000000..4c5b7d9 --- /dev/null +++ b/sys/include/dev/acpi/acpi.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2023-2024 Ian Marco Moffett and the Osmora Team. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Hyra nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _ACPI_H_ +#define _ACPI_H_ + +void *acpi_query(const char *query); +void acpi_init(void); + +#endif /* !_ACPI_H_ */ diff --git a/sys/include/dev/acpi/acpivar.h b/sys/include/dev/acpi/acpivar.h new file mode 100644 index 0000000..9a37dfb --- /dev/null +++ b/sys/include/dev/acpi/acpivar.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2023-2024 Ian Marco Moffett and the Osmora Team. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Hyra nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _ACPI_ACPIVAR_H_ +#define _ACPI_ACPIVAR_H_ + +#include +#include + +uint8_t acpi_checksum(struct acpi_header *hdr); +struct acpi_root_sdt *acpi_get_root_sdt(void); +size_t acpi_get_root_sdt_len(void); + +#endif /* !_ACPI_ACPIVAR_H_ */ diff --git a/sys/include/dev/acpi/tables.h b/sys/include/dev/acpi/tables.h new file mode 100644 index 0000000..d5bfd52 --- /dev/null +++ b/sys/include/dev/acpi/tables.h @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2023-2024 Ian Marco Moffett and the Osmora Team. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Hyra nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _ACPI_TABLES_H_ +#define _ACPI_TABLES_H_ + +#include +#include + +#define OEMID_SIZE 6 + +struct __packed acpi_header { + char signature[4]; /* ASCII signature string */ + uint32_t length; /* Length of table in bytes */ + uint8_t revision; /* Revision of the structure */ + uint8_t checksum; /* Checksum of the header */ + char oemid[OEMID_SIZE]; /* OEM-supplied string that IDs the OEM */ + char oem_table_id[8]; /* OEM-supplied string (used by OEM) */ + uint32_t oem_revision; /* OEM-supplied revision number */ + uint32_t creator_id; /* Vendor ID of creator utility */ + uint32_t creator_revision; /* Revision of creator utility */ +}; + +struct __packed acpi_rsdp { + uint64_t signature; /* RSD PTR */ + uint8_t checksum; /* Structure checksum */ + char oemid[OEMID_SIZE]; /* OEM-supplied string that IDs the OEM */ + uint8_t revision; /* Revision of the structure */ + uint32_t rsdt_addr; /* RSDT physical address */ + + /* Reserved if revision < 2 */ + uint32_t length; /* Length of table in bytes */ + uint64_t xsdt_addr; /* XSDT physical address */ + uint8_t ext_checksum; /* Extended checksum */ + uint8_t reserved[3]; +}; + +/* + * XSDT or RSDT depending + * on what revision the header + * says. + */ +struct __packed acpi_root_sdt { + struct acpi_header hdr; + uint32_t tables[]; +}; + +struct __packed acpi_madt { + struct acpi_header hdr; + uint32_t lapic_addr; + uint32_t flags; +}; + +struct __packed apic_header { + uint8_t type; + uint8_t length; +}; + +struct __packed local_apic { + struct apic_header hdr; + uint8_t processor_id; + uint8_t apic_id; + uint32_t flags; +}; + +struct __packed ioapic { + struct apic_header hdr; + uint8_t ioapic_id; + uint8_t reserved; + uint32_t ioapic_addr; + uint32_t gsi_base; +}; + +struct __packed interrupt_override { + struct apic_header hdr; + uint8_t bus; + uint8_t source; /* IRQ */ + uint32_t interrupt; /* GSI */ + uint16_t flags; +}; + +struct __packed acpi_gas { + uint8_t address_space_id; + uint8_t register_bit_width; + uint8_t register_bit_offset; + uint8_t reserved; + uint64_t address; +}; + +struct __packed acpi_hpet { + struct acpi_header hdr; + uint8_t hardware_rev_id; + uint8_t comparator_count : 5; + uint8_t counter_size : 1; + uint8_t reserved : 1; + uint8_t legacy_replacement : 1; + uint16_t pci_vendor_id; + struct acpi_gas gas; + uint8_t hpet_number; + uint16_t minimum_tick; + uint8_t page_protection; +}; + +#endif /* _ACPI_TABLES_H_ */ diff --git a/sys/kern/init_main.c b/sys/kern/init_main.c index d520542..0071a20 100644 --- a/sys/kern/init_main.c +++ b/sys/kern/init_main.c @@ -30,6 +30,7 @@ #include #include #include +#include #include int @@ -40,6 +41,9 @@ main(void) kprintf("Starting Hyra/%s v%s: %s\n", HYRA_ARCH, HYRA_VERSION, HYRA_BUILDDATE); + /* Start the ACPI subsystem */ + acpi_init(); + /* Startup the BSP */ cpu_startup(); -- cgit v1.2.3 From efb3cd0e2ad09f409d66534d44ff07a55e9f1171 Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Tue, 4 Jun 2024 22:17:28 -0400 Subject: kernel/amd64: acpi: Support parsing MADT Signed-off-by: Ian Moffett --- sys/arch/amd64/amd64/acpi_machdep.c | 74 +++++++++++++++++++++++++++++++++++++ sys/dev/acpi/acpi_init.c | 1 + sys/include/dev/acpi/acpivar.h | 2 + sys/include/dev/acpi/tables.h | 5 +++ 4 files changed, 82 insertions(+) create mode 100644 sys/arch/amd64/amd64/acpi_machdep.c (limited to 'sys/include/dev') diff --git a/sys/arch/amd64/amd64/acpi_machdep.c b/sys/arch/amd64/amd64/acpi_machdep.c new file mode 100644 index 0000000..5f3b3bf --- /dev/null +++ b/sys/arch/amd64/amd64/acpi_machdep.c @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2023-2024 Ian Marco Moffett and the Osmora Team. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Hyra nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include + +#define pr_trace(fmt, ...) kprintf("acpi: " fmt, ##__VA_ARGS__) + +int +acpi_init_madt(void) +{ + struct acpi_madt *madt = acpi_query("APIC"); + struct apic_header *apichdr; + struct ioapic *ioapic = NULL; + uint8_t *cur, *end; + + if (madt == NULL) { + panic("Could not find MADT!\n"); + } + + cur = (uint8_t *)(madt + 1); + end = (uint8_t *)madt + madt->hdr.length; + + while (cur < end) { + apichdr = (void *)cur; + if (apichdr->type == APIC_TYPE_IO_APIC) { + /* + * TODO: Figure out how to use multiple I/O APICs + */ + if (ioapic != NULL) { + pr_trace("Skipping I/O APIC with ID %d\n", ioapic->ioapic_id); + break; + } + + ioapic = (struct ioapic *)cur; + pr_trace("Detected I/O APIC (id=%d, gsi_base=%d)\n", + ioapic->ioapic_id, ioapic->gsi_base); + } + + cur += apichdr->length; + } + + return 0; + +} diff --git a/sys/dev/acpi/acpi_init.c b/sys/dev/acpi/acpi_init.c index f445d95..4c0ae1b 100644 --- a/sys/dev/acpi/acpi_init.c +++ b/sys/dev/acpi/acpi_init.c @@ -118,4 +118,5 @@ acpi_init(void) root_sdt_entries = (root_sdt->hdr.length - sizeof(root_sdt->hdr)) / 4; acpi_init_hpet(); + acpi_init_madt(); } diff --git a/sys/include/dev/acpi/acpivar.h b/sys/include/dev/acpi/acpivar.h index 9a37dfb..9cfe945 100644 --- a/sys/include/dev/acpi/acpivar.h +++ b/sys/include/dev/acpi/acpivar.h @@ -35,6 +35,8 @@ uint8_t acpi_checksum(struct acpi_header *hdr); struct acpi_root_sdt *acpi_get_root_sdt(void); + size_t acpi_get_root_sdt_len(void); +int acpi_init_madt(void); #endif /* !_ACPI_ACPIVAR_H_ */ diff --git a/sys/include/dev/acpi/tables.h b/sys/include/dev/acpi/tables.h index d5bfd52..1dca890 100644 --- a/sys/include/dev/acpi/tables.h +++ b/sys/include/dev/acpi/tables.h @@ -33,6 +33,11 @@ #include #include +/* MADT APIC header types */ +#define APIC_TYPE_LOCAL_APIC 0 +#define APIC_TYPE_IO_APIC 1 +#define APIC_TYPE_INTERRUPT_OVERRIDE 2 + #define OEMID_SIZE 6 struct __packed acpi_header { -- cgit v1.2.3