2023-09-29 01:03:19 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* @file map.c
|
2023-12-02 10:16:14 +08:00
|
|
|
|
* @author ATShining (1358745329@qq.com)
|
2023-10-02 00:22:13 +08:00
|
|
|
|
* @brief
|
2023-09-29 01:03:19 +08:00
|
|
|
|
* @version 0.1
|
|
|
|
|
|
* @date 2023-09-29
|
2023-10-02 00:22:13 +08:00
|
|
|
|
*
|
2023-09-29 01:03:19 +08:00
|
|
|
|
* @copyright Copyright (c) 2023
|
2023-10-02 00:22:13 +08:00
|
|
|
|
*
|
2023-09-29 01:03:19 +08:00
|
|
|
|
*/
|
2023-08-20 20:52:23 +08:00
|
|
|
|
#include "map.h"
|
|
|
|
|
|
#include "types.h"
|
|
|
|
|
|
#include "obj_space.h"
|
2023-08-28 22:11:49 +08:00
|
|
|
|
#include "kobject.h"
|
|
|
|
|
|
#include "assert.h"
|
2023-12-17 00:01:34 +08:00
|
|
|
|
#include "cpulock.h"
|
2023-09-09 14:39:48 +08:00
|
|
|
|
bool_t obj_map_root(kobject_t *kobj, obj_space_t *obj_space, ram_limit_t *ram, vpage_t page)
|
2023-08-20 20:52:23 +08:00
|
|
|
|
{
|
2023-12-17 00:01:34 +08:00
|
|
|
|
kobj_del_list_t kobj_list;
|
|
|
|
|
|
|
|
|
|
|
|
kobj_del_list_init(&kobj_list);
|
|
|
|
|
|
if (obj_space_lookup_kobj(obj_space, vpage_get_obj_handler(page)))
|
2025-03-18 21:18:26 +08:00
|
|
|
|
{ //!< 已经存在则删除
|
2023-12-17 00:01:34 +08:00
|
|
|
|
obj_unmap(obj_space, page, &kobj_list);
|
|
|
|
|
|
}
|
|
|
|
|
|
umword_t status = cpulock_lock();
|
|
|
|
|
|
|
|
|
|
|
|
kobj_del_list_to_do(&kobj_list);
|
|
|
|
|
|
cpulock_set(status);
|
2023-09-09 14:39:48 +08:00
|
|
|
|
obj_map_entry_t *map = obj_space_insert(obj_space, ram, kobj, vpage_get_obj_handler(page), vpage_get_attrs(page));
|
2023-08-20 20:52:23 +08:00
|
|
|
|
|
|
|
|
|
|
if (!map)
|
|
|
|
|
|
{
|
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
}
|
|
|
|
|
|
kobj->mappable.map_cnt++;
|
|
|
|
|
|
slist_add(&kobj->mappable.node, &map->node);
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
|
}
|
2023-09-21 21:44:17 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* @brief 从源映射到目的,如果目的中已经存在,则先解除目的映射然后在影视
|
2023-10-02 00:22:13 +08:00
|
|
|
|
*
|
|
|
|
|
|
* @param dst_space
|
|
|
|
|
|
* @param src_space
|
|
|
|
|
|
* @param dst_inx
|
|
|
|
|
|
* @param src_inx
|
|
|
|
|
|
* @param ram
|
|
|
|
|
|
* @param del_attrs
|
|
|
|
|
|
* @return int
|
2023-09-21 21:44:17 +08:00
|
|
|
|
*/
|
2023-09-03 15:55:06 +08:00
|
|
|
|
int obj_map_src_dst(obj_space_t *dst_space, obj_space_t *src_space,
|
|
|
|
|
|
obj_handler_t dst_inx, obj_handler_t src_inx,
|
2023-09-21 21:44:17 +08:00
|
|
|
|
ram_limit_t *ram, uint8_t del_attrs, kobj_del_list_t *del_list)
|
2023-09-03 15:55:06 +08:00
|
|
|
|
{
|
2023-09-09 14:39:48 +08:00
|
|
|
|
obj_map_entry_t *entry_obj =
|
|
|
|
|
|
obj_space_lookup(src_space, src_inx);
|
|
|
|
|
|
if (!entry_obj)
|
2023-09-03 15:55:06 +08:00
|
|
|
|
{
|
|
|
|
|
|
return -ENOENT;
|
|
|
|
|
|
}
|
2023-09-09 14:39:48 +08:00
|
|
|
|
if (!entry_obj->obj)
|
|
|
|
|
|
{
|
|
|
|
|
|
return -ENOENT;
|
|
|
|
|
|
}
|
2023-09-21 21:44:17 +08:00
|
|
|
|
|
2023-10-02 00:22:13 +08:00
|
|
|
|
if (obj_space_lookup_kobj(dst_space, dst_inx))
|
|
|
|
|
|
{ //!< 已经存在则解除注释
|
2023-09-21 21:44:17 +08:00
|
|
|
|
obj_unmap(dst_space, vpage_create3(0, 0, dst_inx), del_list);
|
2025-03-23 17:35:56 +08:00
|
|
|
|
printk("unmap:%d \n", dst_inx);
|
2023-09-21 21:44:17 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-09-09 14:39:48 +08:00
|
|
|
|
return obj_map(dst_space, dst_inx, obj_map_entry_kobj_get(entry_obj),
|
|
|
|
|
|
ram, obj_map_entry_get_attr(entry_obj) & (~(del_attrs & 0x3UL)));
|
2023-09-03 15:55:06 +08:00
|
|
|
|
}
|
2023-09-09 14:39:48 +08:00
|
|
|
|
int obj_map(obj_space_t *obj_space, obj_handler_t inx, kobject_t *insert_kobj, ram_limit_t *ram, uint8_t attrs)
|
2023-08-28 23:54:33 +08:00
|
|
|
|
{
|
|
|
|
|
|
obj_map_entry_t *entry = NULL;
|
2023-08-28 22:11:49 +08:00
|
|
|
|
|
2023-08-28 23:54:33 +08:00
|
|
|
|
entry = obj_space_lookup(obj_space, inx);
|
|
|
|
|
|
if (entry)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (obj_map_kobj_get(entry->obj))
|
|
|
|
|
|
{
|
|
|
|
|
|
return -EACCES;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-09-09 14:39:48 +08:00
|
|
|
|
obj_map_entry_t *map = obj_space_insert(obj_space, ram, insert_kobj, inx, attrs);
|
2023-08-28 23:54:33 +08:00
|
|
|
|
|
|
|
|
|
|
if (!map)
|
|
|
|
|
|
{
|
|
|
|
|
|
return -ENOMEM;
|
|
|
|
|
|
}
|
|
|
|
|
|
insert_kobj->mappable.map_cnt++;
|
|
|
|
|
|
slist_add(&insert_kobj->mappable.node, &map->node);
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
2023-09-09 14:39:48 +08:00
|
|
|
|
void obj_unmap(obj_space_t *obj_space, vpage_t vpage, kobj_del_list_t *del_list)
|
2023-08-28 22:11:49 +08:00
|
|
|
|
{
|
|
|
|
|
|
obj_map_entry_t *entry = NULL;
|
|
|
|
|
|
|
2023-09-09 14:39:48 +08:00
|
|
|
|
entry = obj_space_lookup(obj_space, vpage_get_obj_handler(vpage));
|
2023-08-28 22:11:49 +08:00
|
|
|
|
if (!entry)
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
2023-09-09 14:39:48 +08:00
|
|
|
|
kobject_t *kobj = obj_map_entry_kobj_get(entry);
|
2023-08-28 22:11:49 +08:00
|
|
|
|
if (!kobj)
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
2023-11-27 21:47:05 +08:00
|
|
|
|
if (kobj->unmap_func)
|
|
|
|
|
|
{
|
|
|
|
|
|
kobj->unmap_func(obj_space, kobj);
|
|
|
|
|
|
}
|
2023-09-09 14:39:48 +08:00
|
|
|
|
if ((vpage.attrs & KOBJ_DELETE_RIGHT) &&
|
|
|
|
|
|
(obj_map_entry_get_attr(entry) & KOBJ_DELETE_RIGHT))
|
|
|
|
|
|
{
|
|
|
|
|
|
//!< 代表删除所有
|
|
|
|
|
|
obj_map_entry_t *pos;
|
|
|
|
|
|
|
2023-11-27 21:47:05 +08:00
|
|
|
|
slist_foreach_not_next(pos, &kobj->mappable.node, node)
|
2023-09-09 14:39:48 +08:00
|
|
|
|
{
|
2023-11-27 21:47:05 +08:00
|
|
|
|
obj_map_entry_t *next = slist_next_entry(pos, &kobj->mappable.node, node);
|
2023-10-02 00:22:13 +08:00
|
|
|
|
slist_del(&pos->node);
|
2023-10-03 00:11:44 +08:00
|
|
|
|
pos->obj = NULL;
|
2023-09-09 14:39:48 +08:00
|
|
|
|
// 删除一个
|
|
|
|
|
|
kobj->mappable.map_cnt--;
|
|
|
|
|
|
if (kobj->mappable.map_cnt <= 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (del_list)
|
|
|
|
|
|
{
|
|
|
|
|
|
kobj_del_list_add(del_list, &kobj->del_node);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2023-11-27 21:47:05 +08:00
|
|
|
|
pos = next;
|
2023-09-09 14:39:48 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
2023-08-28 22:11:49 +08:00
|
|
|
|
{
|
2023-10-03 17:46:02 +08:00
|
|
|
|
assert(!slist_is_empty(&entry->node));
|
2023-09-09 14:39:48 +08:00
|
|
|
|
slist_del(&entry->node);
|
|
|
|
|
|
entry->obj = NULL;
|
|
|
|
|
|
// 删除一个
|
|
|
|
|
|
kobj->mappable.map_cnt--;
|
|
|
|
|
|
if (kobj->mappable.map_cnt <= 0)
|
2023-08-28 22:11:49 +08:00
|
|
|
|
{
|
2023-09-09 14:39:48 +08:00
|
|
|
|
if (del_list)
|
|
|
|
|
|
{
|
|
|
|
|
|
kobj_del_list_add(del_list, &kobj->del_node);
|
|
|
|
|
|
}
|
2023-08-28 22:11:49 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
void obj_unmap_all(obj_space_t *obj_space, kobj_del_list_t *del_list)
|
|
|
|
|
|
{
|
|
|
|
|
|
assert(obj_space);
|
|
|
|
|
|
for (umword_t i = 0; i < OBJ_MAP_MAX_ADDR; i++)
|
|
|
|
|
|
{
|
2023-09-09 14:39:48 +08:00
|
|
|
|
obj_unmap(obj_space, vpage_create3(KOBJ_DELETE_RIGHT /*执行删除操作*/, 0, i), del_list);
|
2023-08-28 22:11:49 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|