diff options
Diffstat (limited to 'components')
| -rw-r--r-- | components/drivers/block/blk.c | 5 | ||||
| -rw-r--r-- | components/drivers/clock_time/SConscript | 7 | ||||
| -rw-r--r-- | components/drivers/clock_time/arch/risc-v/cputimer.c (renamed from components/drivers/clock_time/arch/risc-v/virt64/cputimer.c) | 20 | ||||
| -rw-r--r-- | components/drivers/core/mnt.c | 4 | ||||
| -rw-r--r-- | components/drivers/core/platform_ofw.c | 26 | ||||
| -rw-r--r-- | components/drivers/dma/dma_pool.c | 4 | ||||
| -rw-r--r-- | components/drivers/mfd/mfd-syscon.c | 2 | ||||
| -rw-r--r-- | components/drivers/ofw/fdt.c | 15 | ||||
| -rwxr-xr-x | components/drivers/ofw/io.c | 30 | ||||
| -rw-r--r-- | components/drivers/ofw/ofw.c | 10 | ||||
| -rwxr-xr-x | components/drivers/ofw/ofw_internal.h | 3 | ||||
| -rw-r--r-- | components/drivers/pci/ofw.c | 3 | ||||
| -rw-r--r-- | components/drivers/pci/pci.c | 12 | ||||
| -rwxr-xr-x | components/drivers/pic/Kconfig | 18 | ||||
| -rw-r--r-- | components/lwp/arch/risc-v/rv64/lwp_arch.c | 28 | ||||
| -rw-r--r-- | components/lwp/arch/risc-v/rv64/lwp_gcc.S | 25 | ||||
| -rw-r--r-- | components/mm/SConscript | 9 | ||||
| -rw-r--r-- | components/mm/ioremap-nommu.c | 21 | ||||
| -rw-r--r-- | components/mm/utest/test_cache_rv64.h | 2 |
19 files changed, 181 insertions, 63 deletions
diff --git a/components/drivers/block/blk.c b/components/drivers/block/blk.c index 5f0d6b1f82..a0c18acca9 100644 --- a/components/drivers/block/blk.c +++ b/components/drivers/block/blk.c @@ -492,11 +492,12 @@ static const char *blk_get_mounted_path(struct rt_device *device) const char *convert_size(struct rt_device_blk_geometry *geome, rt_size_t sector_count, rt_size_t *out_cap, rt_size_t *out_minor) { - rt_size_t cap, minor = 0; + rt_uint64_t cap; + rt_size_t minor = 0; int size_index = 0; const char *size_name[] = { "B", "K", "M", "G", "T", "P", "E" }; - cap = geome->bytes_per_sector * sector_count; + cap = (rt_uint64_t)geome->bytes_per_sector * sector_count; for (size_index = 0; size_index < RT_ARRAY_SIZE(size_name) - 1; ++size_index) { diff --git a/components/drivers/clock_time/SConscript b/components/drivers/clock_time/SConscript index 111449276a..386ce7135d 100644 --- a/components/drivers/clock_time/SConscript +++ b/components/drivers/clock_time/SConscript @@ -25,7 +25,12 @@ if os.path.isdir(arch_dir): arch_list = os.listdir(arch_dir) if rtconfig.ARCH in arch_list: cpu_dir = os.path.join(arch_dir, rtconfig.ARCH, rtconfig.CPU) - if os.path.exists(cpu_dir): + if rtconfig.ARCH == 'risc-v': + if GetDepend('RT_USING_RISCV_NEW_COMMON'): + src += Glob("arch/risc-v/*.c") + elif os.path.exists(cpu_dir): + src += Glob("arch/%s/%s/*.c" % (rtconfig.ARCH, rtconfig.CPU)) + elif os.path.exists(cpu_dir): src += Glob("arch/%s/%s/*.c" % (rtconfig.ARCH, rtconfig.CPU)) else: src += Glob("arch/%s/*.c" % rtconfig.ARCH) diff --git a/components/drivers/clock_time/arch/risc-v/virt64/cputimer.c b/components/drivers/clock_time/arch/risc-v/cputimer.c index 7921716b7f..8941830f77 100644 --- a/components/drivers/clock_time/arch/risc-v/virt64/cputimer.c +++ b/components/drivers/clock_time/arch/risc-v/cputimer.c @@ -1,40 +1,40 @@ /* - * Copyright (c) 2006-2023, RT-Thread Development Team + * Copyright (c) 2006-2025, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2023-07-10 xqyjlj The first version. + * 2025-04-20 GuEe-GUI Port to common RISC-V timer. */ #include <drivers/clock_time.h> +#include <riscv_timer.h> -static volatile unsigned long _init_cnt = 0; +static volatile rt_uint64_t _init_cnt = 0; static rt_bool_t _riscv_clock_registered = RT_FALSE; static struct rt_clock_time_device _riscv_clock_dev; -extern rt_uint64_t rt_hw_get_clock_timer_freq(void); - static rt_uint64_t _riscv_clock_get_freq(struct rt_clock_time_device *dev) { RT_UNUSED(dev); - return rt_hw_get_clock_timer_freq(); + + return riscv_timer_get_frequency(); } static rt_uint64_t _riscv_clock_get_counter(struct rt_clock_time_device *dev) { - unsigned long time_elapsed; - RT_UNUSED(dev); - __asm__ __volatile__("rdtime %0" : "=r"(time_elapsed)); - return (rt_uint64_t)(time_elapsed - _init_cnt); + + return riscv_timer_rdtime() - _init_cnt; } static rt_err_t _riscv_clock_set_timeout(struct rt_clock_time_device *dev, rt_uint64_t delta) { RT_UNUSED(dev); RT_UNUSED(delta); + return -RT_ENOSYS; } @@ -47,7 +47,7 @@ static const struct rt_clock_time_ops _riscv_clock_ops = void rt_clock_time_source_init(void) { - __asm__ __volatile__("rdtime %0" : "=r"(_init_cnt)); + _init_cnt = riscv_timer_rdtime(); if (!_riscv_clock_registered) { diff --git a/components/drivers/core/mnt.c b/components/drivers/core/mnt.c index 02a68d46dd..d5c6cc5a4d 100644 --- a/components/drivers/core/mnt.c +++ b/components/drivers/core/mnt.c @@ -20,8 +20,10 @@ #ifdef RT_USING_FINSH #include <msh.h> #endif +#ifdef ARCH_MM_MMU #include <ioremap.h> #include <mm_memblock.h> +#endif #ifdef RT_USING_OFW #define bootargs_select rt_ofw_bootargs_select @@ -38,6 +40,7 @@ static int rootfs_mnt_init(void) const char *fstype = bootargs_select("rootfstype=", 0); const char *rw = bootargs_select("rw", 0); +#ifdef ARCH_MM_MMU if (!dev || !fstype) { const char *name = "initrd"; @@ -64,6 +67,7 @@ static int rootfs_mnt_init(void) } } } +#endif /* ARCH_MM_MMU */ if (fstype != cromfs_type && dev) { diff --git a/components/drivers/core/platform_ofw.c b/components/drivers/core/platform_ofw.c index 4bc2deed5d..7bcfd4ea6c 100644 --- a/components/drivers/core/platform_ofw.c +++ b/components/drivers/core/platform_ofw.c @@ -20,6 +20,7 @@ #include <drivers/platform.h> #include <drivers/core/bus.h> #include <drivers/core/dm.h> +#include <drivers/misc.h> #include "../ofw/ofw_internal.h" @@ -42,6 +43,20 @@ static const struct rt_ofw_node_id platform_ofw_ids[] = { /* sentinel */ } }; +static void ofw_address_to_string(char *buffer, rt_size_t size, rt_uint64_t address) +{ + rt_uint32_t address_hi = rt_upper_32_bits(address); + + if (address_hi) + { + rt_snprintf(buffer, size, "%x%08x", address_hi, rt_lower_32_bits(address)); + } + else + { + rt_snprintf(buffer, size, "%x", rt_lower_32_bits(address)); + } +} + static void ofw_device_rename(struct rt_device *dev) { rt_uint32_t mask; @@ -60,18 +75,21 @@ static void ofw_device_rename(struct rt_device *dev) { if (!rt_ofw_get_address(np, 0, &addr, RT_NULL)) { + char addr_str[sizeof(addr) * 2 + 1]; const char *node_name = rt_fdt_node_name(np->full_name); rt_size_t tag_len = strchrnul(node_name, '@') - node_name; + ofw_address_to_string(addr_str, sizeof(addr_str), addr); + if (!rt_ofw_prop_read_u32(np, "mask", &mask)) { - rt_dm_dev_set_name(dev, dev_name ? "%lx.%x.%.*s:%s" : "%lx.%x.%.*s", - addr, __rt_ffs(mask) - 1, tag_len, node_name, dev_name); + rt_dm_dev_set_name(dev, dev_name ? "%s.%x.%.*s:%s" : "%s.%x.%.*s", + addr_str, __rt_ffs(mask) - 1, tag_len, node_name, dev_name); } else { - rt_dm_dev_set_name(dev, dev_name ? "%lx.%.*s:%s" : "%lx.%.*s", - addr, tag_len, node_name, dev_name); + rt_dm_dev_set_name(dev, dev_name ? "%s.%.*s:%s" : "%s.%.*s", + addr_str, tag_len, node_name, dev_name); } return; diff --git a/components/drivers/dma/dma_pool.c b/components/drivers/dma/dma_pool.c index 75e28cced6..4b3e2055e2 100644 --- a/components/drivers/dma/dma_pool.c +++ b/components/drivers/dma/dma_pool.c @@ -1007,6 +1007,7 @@ rt_err_t rt_dma_sync_in_data(struct rt_device *dev, void *out_data, rt_size_t si */ static rt_err_t dma_pool_map_linear(struct rt_dma_pool *pool) { +#ifdef ARCH_MM_MMU rt_region_t *region = &pool->region; rt_size_t start = RT_ALIGN_DOWN(region->start, ARCH_PAGE_SIZE); rt_size_t end = RT_ALIGN(region->end, ARCH_PAGE_SIZE); @@ -1032,6 +1033,9 @@ static rt_err_t dma_pool_map_linear(struct rt_dma_pool *pool) (unsigned long)start, (unsigned long)end); return -RT_ERROR; } +#else + RT_UNUSED(pool); +#endif /* ARCH_MM_MMU */ return RT_EOK; } diff --git a/components/drivers/mfd/mfd-syscon.c b/components/drivers/mfd/mfd-syscon.c index d470e370ee..c99748f66e 100644 --- a/components/drivers/mfd/mfd-syscon.c +++ b/components/drivers/mfd/mfd-syscon.c @@ -182,7 +182,7 @@ static rt_err_t syscon_probe(struct rt_platform_device *pdev) } syscon->iomem_size = (rt_size_t)iomem_range[1]; - syscon->iomem_base = rt_ioremap((void *)iomem_range[0], syscon->iomem_size); + syscon->iomem_base = rt_ioremap((void *)(rt_ubase_t)iomem_range[0], syscon->iomem_size); if (!syscon->iomem_base) { diff --git a/components/drivers/ofw/fdt.c b/components/drivers/ofw/fdt.c index 23709be301..91679417f8 100644 --- a/components/drivers/ofw/fdt.c +++ b/components/drivers/ofw/fdt.c @@ -14,6 +14,7 @@ #include <drivers/ofw_fdt.h> #include <drivers/ofw_raw.h> #include <drivers/core/dm.h> +#include <drivers/misc.h> #ifdef RT_USING_MEMBLOCK #include <mm_memblock.h> @@ -39,12 +40,6 @@ static rt_phandle _phandle_max; static rt_size_t _root_size_cells; static rt_size_t _root_addr_cells; -#ifdef ARCH_CPU_64BIT -#define MIN_BIT 16 -#else -#define MIN_BIT 8 -#endif - const char *rt_fdt_node_name(const char *full_name) { const char *node_name = strrchr(full_name, '/'); @@ -367,11 +362,15 @@ static rt_err_t fdt_scan_memory(void) if (!err) { - LOG_I("Memory node(%d) ranges: 0x%.*lx - 0x%.*lx%s", no, MIN_BIT, base, MIN_BIT, base + size, ""); + LOG_I("Memory node(%d) ranges: 0x%08x%08x - 0x%08x%08x", no, + rt_upper_32_bits(base), rt_lower_32_bits(base), + rt_upper_32_bits(base + size), rt_lower_32_bits(base + size)); } else { - LOG_W("Memory node(%d) ranges: 0x%.*lx - 0x%.*lx%s", no, MIN_BIT, base, MIN_BIT, base + size, " unable to record"); + LOG_W("Memory node(%d) ranges: 0x%08x%08x - 0x%08x%08x unable to record", no, + rt_upper_32_bits(base), rt_lower_32_bits(base), + rt_upper_32_bits(base + size), rt_lower_32_bits(base + size)); } } } diff --git a/components/drivers/ofw/io.c b/components/drivers/ofw/io.c index ac8695aff1..a6bb5bbec7 100755 --- a/components/drivers/ofw/io.c +++ b/components/drivers/ofw/io.c @@ -526,22 +526,22 @@ rt_uint64_t rt_ofw_reverse_address(struct rt_ofw_node *np, const char *range_typ return address; } -#ifdef ARCH_CPU_64BIT -#define ofw_address_cpu_cast(np, address) (void *)(address) +static void *ofw_address_to_pointer(struct rt_ofw_node *np, rt_uint64_t address) +{ +#ifndef ARCH_CPU_64BIT + if (rt_upper_32_bits(address)) + { + LOG_W("%s found 64-bit address = %x%08x", + rt_ofw_node_full_name(np), + rt_upper_32_bits(address), rt_lower_32_bits(address)); + } #else -#define ofw_address_cpu_cast(np, address) \ - ({ \ - if (((address) >> 32)) \ - { \ - LOG_W("%s find 64 bits address = %x%x", \ - rt_ofw_node_full_name(np), \ - ofw_static_cast(rt_ubase_t, (address) >> 32), \ - ofw_static_cast(rt_ubase_t, (address))); \ - } \ - (void *)ofw_static_cast(rt_ubase_t, (address)); \ - }) + RT_UNUSED(np); #endif + return (void *)(rt_ubase_t)address; +} + void *rt_ofw_iomap(struct rt_ofw_node *np, int index) { void *iomem = RT_NULL; @@ -552,7 +552,7 @@ void *rt_ofw_iomap(struct rt_ofw_node *np, int index) if (!ofw_get_address(np, index, ®s[0], ®s[1])) { - iomem = rt_ioremap(ofw_address_cpu_cast(np, regs[0]), (size_t)regs[1]); + iomem = rt_ioremap(ofw_address_to_pointer(np, regs[0]), (size_t)regs[1]); } } @@ -569,7 +569,7 @@ void *rt_ofw_iomap_by_name(struct rt_ofw_node *np, const char *name) if (!ofw_get_address_by_name(np, name, ®s[0], ®s[1])) { - iomem = rt_ioremap(ofw_address_cpu_cast(np, regs[0]), (size_t)regs[1]); + iomem = rt_ioremap(ofw_address_to_pointer(np, regs[0]), (size_t)regs[1]); } } diff --git a/components/drivers/ofw/ofw.c b/components/drivers/ofw/ofw.c index 4e18de790e..762553f31d 100644 --- a/components/drivers/ofw/ofw.c +++ b/components/drivers/ofw/ofw.c @@ -13,6 +13,7 @@ #include <drivers/platform.h> #include <drivers/core/bus.h> #include <drivers/serial_dm.h> +#include <drivers/misc.h> #define DBG_TAG "rtdm.ofw" #define DBG_LVL DBG_INFO @@ -678,9 +679,12 @@ void rt_ofw_node_dump_dts(struct rt_ofw_node *np, rt_bool_t sibling_too) for (int i = header->rsvmap_nr - 1; i >= 0; --i) { - rt_kprintf("/memreserve/\t%p %p;\n", - ofw_static_cast(rt_size_t, fdt64_to_cpu(rsvmap->address)), - ofw_static_cast(rt_size_t, fdt64_to_cpu(rsvmap->size))); + rt_uint64_t address = fdt64_to_cpu(rsvmap->address); + rt_uint64_t size = fdt64_to_cpu(rsvmap->size); + + rt_kprintf("/memreserve/\t0x%08x%08x 0x%08x%08x;\n", + rt_upper_32_bits(address), rt_lower_32_bits(address), + rt_upper_32_bits(size), rt_lower_32_bits(size)); ++rsvmap; } diff --git a/components/drivers/ofw/ofw_internal.h b/components/drivers/ofw/ofw_internal.h index 7778dbc4c5..50240a3eb7 100755 --- a/components/drivers/ofw/ofw_internal.h +++ b/components/drivers/ofw/ofw_internal.h @@ -66,9 +66,6 @@ extern struct rt_ofw_node *ofw_node_reserved_memory; extern struct rt_fdt_earlycon fdt_earlycon; -#define ofw_static_cast(to_type, value) \ - (to_type)(((value) >> ((sizeof(value) - sizeof(to_type)) * 8))) - rt_err_t ofw_alias_scan(void); int ofw_alias_node_id(struct rt_ofw_node *np); rt_err_t ofw_phandle_hash_reset(rt_phandle min, rt_phandle max); diff --git a/components/drivers/pci/ofw.c b/components/drivers/pci/ofw.c index 7d0a476d8b..b6c1e6bacb 100644 --- a/components/drivers/pci/ofw.c +++ b/components/drivers/pci/ofw.c @@ -248,7 +248,8 @@ rt_err_t rt_pci_ofw_parse_ranges(struct rt_ofw_node *dev_np, struct rt_pci_host_bridge *host_bridge) { rt_err_t err; - int phy_addr_cells = -1, phy_size_cells = -1, cpu_addr_cells; + rt_int32_t phy_addr_cells = -1, phy_size_cells = -1; + int cpu_addr_cells; if (!dev_np || !host_bridge) { diff --git a/components/drivers/pci/pci.c b/components/drivers/pci/pci.c index e2fa293956..17545ef34f 100644 --- a/components/drivers/pci/pci.c +++ b/components/drivers/pci/pci.c @@ -534,12 +534,18 @@ rt_err_t rt_pci_region_setup(struct rt_pci_host_bridge *host_bridge) * according to PCI 2.1 and moreover. Use a reasonable starting value of * 0x1000 instead if the bus start address is below 0x1000. */ - region->bus_start = rt_max_t(rt_size_t, 0x1000, region->phy_addr); + region->bus_start = rt_max_t(rt_uint64_t, 0x1000, region->phy_addr); LOG_I("Bus %s region(%d):", region->flags == PCI_BUS_REGION_F_MEM ? "Memory" : (region->flags == PCI_BUS_REGION_F_PREFETCH ? "Prefetchable Mem" : (region->flags == PCI_BUS_REGION_F_IO ? "I/O" : "Unknown")), i); - LOG_I(" cpu: [%p, %p]", region->cpu_addr, (region->cpu_addr + region->size - 1)); - LOG_I(" physical: [%p, %p]", region->phy_addr, (region->phy_addr + region->size - 1)); + LOG_I(" cpu: [0x%08x%08x, 0x%08x%08x]", + rt_upper_32_bits(region->cpu_addr), rt_lower_32_bits(region->cpu_addr), + rt_upper_32_bits(region->cpu_addr + region->size - 1), + rt_lower_32_bits(region->cpu_addr + region->size - 1)); + LOG_I(" physical: [0x%08x%08x, 0x%08x%08x]", + rt_upper_32_bits(region->phy_addr), rt_lower_32_bits(region->phy_addr), + rt_upper_32_bits(region->phy_addr + region->size - 1), + rt_lower_32_bits(region->phy_addr + region->size - 1)); } return err; diff --git a/components/drivers/pic/Kconfig b/components/drivers/pic/Kconfig index 4ea164b50d..e5b81643da 100755 --- a/components/drivers/pic/Kconfig +++ b/components/drivers/pic/Kconfig @@ -18,21 +18,23 @@ config MAX_HANDLERS range 1 4294967294 default 256 -config RT_PIC_ARM_GIC - bool "ARM GICv2/v1" +config RT_PIC_ARM_NVIC + bool "ARM Cortex-M NVIC" depends on RT_USING_PIC + depends on ARCH_ARM_CORTEX_M select RT_USING_OFW default n -config RT_PIC_ARM_NVIC - bool "ARM Cortex-M NVIC" +config RT_PIC_ARM_GIC + bool "ARM GICv2/v1" depends on RT_USING_PIC - depends on ARCH_ARM_CORTEX_M select RT_USING_OFW default n config RT_PIC_ARM_GIC_V2M - bool "ARM GIC V2M" if RT_PIC_ARM_GIC && RT_PCI_MSI + bool "ARM GIC V2M" + depends on RT_USING_PIC + depends on RT_PCI_MSI depends on RT_USING_OFW default n @@ -43,7 +45,9 @@ config RT_PIC_ARM_GIC_V3 default n config RT_PIC_ARM_GIC_V3_ITS - bool "ARM GICv3 ITS (Interrupt Translation Service)" if RT_PIC_ARM_GIC_V3 && RT_PCI_MSI + bool "ARM GICv3 ITS (Interrupt Translation Service)" + depends on RT_PIC_ARM_GIC_V3 + depends on RT_PCI_MSI depends on RT_USING_OFW select RT_USING_ADT_REF default n diff --git a/components/lwp/arch/risc-v/rv64/lwp_arch.c b/components/lwp/arch/risc-v/rv64/lwp_arch.c index 62383f91fa..d14163be32 100644 --- a/components/lwp/arch/risc-v/rv64/lwp_arch.c +++ b/components/lwp/arch/risc-v/rv64/lwp_arch.c @@ -34,7 +34,11 @@ #include <page.h> #include <cpuport.h> +#ifdef RT_USING_RISCV_NEW_COMMON +#include <csr.h> +#else #include <encoding.h> +#endif #include <stack.h> #include <cache.h> @@ -113,7 +117,11 @@ int arch_user_space_init(struct rt_lwp *lwp) void *arch_kernel_mmu_table_get(void) { +#if defined(RT_USING_RISCV_NEW_COMMON) && defined(RT_USING_SMP) && RT_CPUS_NR > 1 + return (void *)((char *)MMUTable + rt_hw_cpu_id() * ARCH_PAGE_SIZE); +#else return (void *)((char *)MMUTable); +#endif } void arch_user_space_free(struct rt_lwp *lwp) @@ -165,15 +173,25 @@ int arch_set_thread_context(void (*exit)(void), void *new_thread_stack, RT_ASSERT(new_thread_stack != RT_NULL); RT_ASSERT(thread_sp != RT_NULL); struct rt_hw_stack_frame *syscall_frame; +#ifdef RT_USING_RISCV_NEW_COMMON + struct rt_hw_switch_frame *frame; +#else struct rt_hw_stack_frame *thread_frame; +#endif rt_uint8_t *stk; +#ifndef RT_USING_RISCV_NEW_COMMON rt_uint8_t *syscall_stk; +#endif stk = (rt_uint8_t *)new_thread_stack; /* reserve syscall context, all the registers are copyed from parent */ +#ifdef RT_USING_RISCV_NEW_COMMON + stk -= CTX_ALL_REG_NR * sizeof(void *); +#else stk -= CTX_REG_NR * REGBYTES; syscall_stk = stk; +#endif syscall_frame = (struct rt_hw_stack_frame *)stk; @@ -191,6 +209,15 @@ int arch_set_thread_context(void (*exit)(void), void *new_thread_stack, rt_thread_t thread = rt_container_of((unsigned long)thread_sp, struct rt_thread, sp); syscall_frame->tp = (rt_ubase_t)thread->thread_idr; +#ifdef RT_USING_RISCV_NEW_COMMON + frame = (struct rt_hw_switch_frame *)((rt_ubase_t)stk - sizeof(*frame)); + rt_memset(frame, 0, sizeof(*frame)); + + frame->regs[RT_HW_SWITCH_CONTEXT_RA] = (rt_ubase_t)exit; + frame->regs[RT_HW_SWITCH_CONTEXT_XSTATUS] = (csr_read(CSR_STATUS) | SR_PP) & ~SR_IE; + + stk = (void *)frame; +#else #ifdef ARCH_USING_NEW_CTX_SWITCH extern void *_rt_hw_stack_init(rt_ubase_t *sp, rt_ubase_t ra, rt_ubase_t sstatus); rt_ubase_t sstatus = read_csr(sstatus) | SSTATUS_SPP; @@ -221,6 +248,7 @@ int arch_set_thread_context(void (*exit)(void), void *new_thread_stack, thread_frame->user_sp_exc_stack = (rt_ubase_t)syscall_stk; #endif /* ARCH_USING_NEW_CTX_SWITCH */ +#endif /* RT_USING_RISCV_NEW_COMMON */ /* save new stack top */ *thread_sp = (void *)stk; diff --git a/components/lwp/arch/risc-v/rv64/lwp_gcc.S b/components/lwp/arch/risc-v/rv64/lwp_gcc.S index d9f3a29299..b74abe5da1 100644 --- a/components/lwp/arch/risc-v/rv64/lwp_gcc.S +++ b/components/lwp/arch/risc-v/rv64/lwp_gcc.S @@ -19,10 +19,27 @@ #define __ASSEMBLY__ #endif /* __ASSEMBLY__ */ +#ifdef RT_USING_RISCV_NEW_COMMON +#include "asm.h" +#include "csr.h" + +#define LOAD REG_L +#define STORE REG_S +#define REGBYTES SZREG +#define CTX_REG_NR CTX_ALL_REG_NR +#define FRAME_OFF_SSTATUS FRAME_OFF_XSTATUS +#define SSTATUS_SPP SR_PP +#define SSTATUS_SIE SR_IE +#define SSTATUS_SPIE SR_PIE +#define sstatus CSR_STATUS +#define sscratch CSR_SCRATCH +#define sepc CSR_EPC +#else #include "cpuport.h" #include "encoding.h" #include "stackframe.h" #include "asm-generic.h" +#endif .section .text.lwp @@ -267,13 +284,13 @@ copy_context_loop: LOAD t0, 0(t1) STORE t0, 0(t2) addi s0, s0, -1 - addi t1, t1, 8 - addi t2, t2, 8 + addi t1, t1, REGBYTES + addi t2, t2, REGBYTES bnez s0, copy_context_loop #endif /* ARCH_USING_NEW_CTX_SWITCH */ /* fetch SYSCALL ID */ - LOAD a7, 17 * REGBYTES(sp) + LOAD a7, FRAME_OFF_A7(sp) addi a7, a7, -0xfe beqz a7, arch_signal_quit @@ -307,7 +324,7 @@ dont_ret_to_user: call lwp_user_setting_restore /* after restore the reg `tp`, need modify context */ - STORE tp, 4 * REGBYTES(sp) + STORE tp, FRAME_OFF_TP(sp) #endif //restore context diff --git a/components/mm/SConscript b/components/mm/SConscript index f90f540ce2..cc205119f8 100644 --- a/components/mm/SConscript +++ b/components/mm/SConscript @@ -4,7 +4,14 @@ from building import * group = [] cwd = GetCurrentDir() -if GetDepend('ARCH_ARM_CORTEX_A') or GetDepend('ARCH_ARMV8') or GetDepend('ARCH_RISCV64'): +new_riscv_common = GetDepend('RT_USING_RISCV_NEW_COMMON') +legacy_mmu_arch = (GetDepend('ARCH_ARM_CORTEX_A') or + GetDepend('ARCH_ARMV8') or + (GetDepend('ARCH_RISCV64') and not new_riscv_common)) +new_riscv_mmu_arch = (new_riscv_common and + GetDepend('ARCH_MM_MMU')) + +if legacy_mmu_arch or new_riscv_mmu_arch: src = Glob('*.c') + Glob('*_gcc.S') SrcRemove(src, ['ioremap-nommu.c']) if not GetDepend('RT_USING_MEMBLOCK'): diff --git a/components/mm/ioremap-nommu.c b/components/mm/ioremap-nommu.c index d58b457dc4..9d75a37df9 100644 --- a/components/mm/ioremap-nommu.c +++ b/components/mm/ioremap-nommu.c @@ -7,10 +7,31 @@ #include <rtthread.h> #include <ioremap.h> +#include <mm_aspace.h> void *rt_ioremap_start; size_t rt_ioremap_size; +const rt_ubase_t rt_kmem_pvoff(void) +{ + return 0; +} + +void rt_kmem_pvoff_set(rt_ubase_t pvoff) +{ + RT_UNUSED(pvoff); +} + +void *rt_kmem_v2p(void *vaddr) +{ + return vaddr; +} + +void *rt_kmem_p2v(void *paddr) +{ + return paddr; +} + void *rt_ioremap_early(void *paddr, size_t size) { return size ? paddr : RT_NULL; diff --git a/components/mm/utest/test_cache_rv64.h b/components/mm/utest/test_cache_rv64.h index 3bd7fc26eb..72d7dd2527 100644 --- a/components/mm/utest/test_cache_rv64.h +++ b/components/mm/utest/test_cache_rv64.h @@ -12,7 +12,9 @@ #define __TEST_CACHE_RV64_H #ifdef ARCH_RISCV64 +#ifndef RT_USING_RISCV_NEW_COMMON #include "riscv_mmu.h" +#endif #include <utest.h> #include <cache.h> #include <page.h> |
