summaryrefslogtreecommitdiff
path: root/components
diff options
context:
space:
mode:
Diffstat (limited to 'components')
-rw-r--r--components/drivers/block/blk.c5
-rw-r--r--components/drivers/clock_time/SConscript7
-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.c4
-rw-r--r--components/drivers/core/platform_ofw.c26
-rw-r--r--components/drivers/dma/dma_pool.c4
-rw-r--r--components/drivers/mfd/mfd-syscon.c2
-rw-r--r--components/drivers/ofw/fdt.c15
-rwxr-xr-xcomponents/drivers/ofw/io.c30
-rw-r--r--components/drivers/ofw/ofw.c10
-rwxr-xr-xcomponents/drivers/ofw/ofw_internal.h3
-rw-r--r--components/drivers/pci/ofw.c3
-rw-r--r--components/drivers/pci/pci.c12
-rwxr-xr-xcomponents/drivers/pic/Kconfig18
-rw-r--r--components/lwp/arch/risc-v/rv64/lwp_arch.c28
-rw-r--r--components/lwp/arch/risc-v/rv64/lwp_gcc.S25
-rw-r--r--components/mm/SConscript9
-rw-r--r--components/mm/ioremap-nommu.c21
-rw-r--r--components/mm/utest/test_cache_rv64.h2
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, &regs[0], &regs[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, &regs[0], &regs[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>