Sfoglia il codice sorgente

Merge branch 'rt-smart' of https://gitee.com/rtthread/rt-thread into rt-smart

jasonhu 4 anni fa
parent
commit
2642d6e500

+ 3 - 5
libcpu/aarch64/common/page.c

@@ -196,7 +196,6 @@ static int _pages_ref_get(struct page *p, uint32_t size_bits)
 static int _pages_free(struct page *p, uint32_t size_bits)
 {
     uint32_t level = size_bits;
-    uint32_t high = ARCH_PAGE_LIST_SIZE - size_bits - 1;
     struct page *buddy;
 
     RT_ASSERT(p->ref_cnt > 0);
@@ -208,7 +207,7 @@ static int _pages_free(struct page *p, uint32_t size_bits)
         return 0;
     }
 
-    while (level < high)
+    while (level < ARCH_PAGE_LIST_SIZE)
     {
         buddy = buddy_get(p, level);
         if (buddy && buddy->size_bits == level)
@@ -238,16 +237,15 @@ static struct page *_pages_alloc(uint32_t size_bits)
     else
     {
         uint32_t level;
-        uint32_t high = ARCH_PAGE_LIST_SIZE - size_bits - 1;
 
-        for (level = size_bits + 1; level <= high; level++)
+        for (level = size_bits + 1; level < ARCH_PAGE_LIST_SIZE; level++)
         {
             if (page_list[level])
             {
                 break;
             }
         }
-        if (level == high + 1)
+        if (level == ARCH_PAGE_LIST_SIZE)
         {
             return 0;
         }

+ 3 - 5
libcpu/arm/cortex-a/page.c

@@ -179,7 +179,6 @@ static void _pages_ref_inc(struct page *p, uint32_t size_bits)
 static int _pages_free(struct page *p, uint32_t size_bits)
 {
     uint32_t level = size_bits;
-    uint32_t high = ARCH_PAGE_LIST_SIZE - size_bits - 1;
     struct page *buddy;
 
     RT_ASSERT(p->ref_cnt > 0);
@@ -191,7 +190,7 @@ static int _pages_free(struct page *p, uint32_t size_bits)
         return 0;
     }
 
-    while (level < high)
+    while (level < ARCH_PAGE_LIST_SIZE)
     {
         buddy = buddy_get(p, level);
         if (buddy && buddy->size_bits == level)
@@ -221,16 +220,15 @@ static struct page *_pages_alloc(uint32_t size_bits)
     else
     {
         uint32_t level;
-        uint32_t high = ARCH_PAGE_LIST_SIZE - size_bits - 1;
 
-        for (level = size_bits + 1; level <= high; level++)
+        for (level = size_bits + 1; level < ARCH_PAGE_LIST_SIZE; level++)
         {
             if (page_list[level])
             {
                 break;
             }
         }
-        if (level == high + 1)
+        if (level == ARCH_PAGE_LIST_SIZE)
         {
             return 0;
         }

+ 3 - 5
libcpu/risc-v/t-head/c906/page.c

@@ -196,7 +196,6 @@ static int _pages_ref_get(struct page *p, uint32_t size_bits)
 static int _pages_free(struct page *p, uint32_t size_bits)
 {
     uint32_t level = size_bits;
-    uint32_t high = ARCH_PAGE_LIST_SIZE - size_bits - 1;
     struct page *buddy;
 
     RT_ASSERT(p->ref_cnt > 0);
@@ -208,7 +207,7 @@ static int _pages_free(struct page *p, uint32_t size_bits)
         return 0;
     }
 
-    while (level < high)
+    while (level < ARCH_PAGE_LIST_SIZE)
     {
         buddy = buddy_get(p, level);
         if (buddy && buddy->size_bits == level)
@@ -238,16 +237,15 @@ static struct page *_pages_alloc(uint32_t size_bits)
     else
     {
         uint32_t level;
-        uint32_t high = ARCH_PAGE_LIST_SIZE - size_bits - 1;
 
-        for (level = size_bits + 1; level <= high; level++)
+        for (level = size_bits + 1; level < ARCH_PAGE_LIST_SIZE; level++)
         {
             if (page_list[level])
             {
                 break;
             }
         }
-        if (level == high + 1)
+        if (level == ARCH_PAGE_LIST_SIZE)
         {
             return 0;
         }

+ 3 - 5
libcpu/risc-v/virt64/page.c

@@ -196,7 +196,6 @@ static int _pages_ref_get(struct page *p, uint32_t size_bits)
 static int _pages_free(struct page *p, uint32_t size_bits)
 {
     uint32_t level = size_bits;
-    uint32_t high = ARCH_PAGE_LIST_SIZE - size_bits - 1;
     struct page *buddy;
 
     RT_ASSERT(p->ref_cnt > 0);
@@ -208,7 +207,7 @@ static int _pages_free(struct page *p, uint32_t size_bits)
         return 0;
     }
 
-    while (level < high)
+    while (level < ARCH_PAGE_LIST_SIZE)
     {
         buddy = buddy_get(p, level);
         if (buddy && buddy->size_bits == level)
@@ -238,16 +237,15 @@ static struct page *_pages_alloc(uint32_t size_bits)
     else
     {
         uint32_t level;
-        uint32_t high = ARCH_PAGE_LIST_SIZE - size_bits - 1;
 
-        for (level = size_bits + 1; level <= high; level++)
+        for (level = size_bits + 1; level < ARCH_PAGE_LIST_SIZE; level++)
         {
             if (page_list[level])
             {
                 break;
             }
         }
-        if (level == high + 1)
+        if (level == ARCH_PAGE_LIST_SIZE)
         {
             return 0;
         }

+ 31 - 1
libcpu/x86/i386/page.c

@@ -176,6 +176,23 @@ static void _pages_ref_inc(struct page *p, uint32_t size_bits)
     page_head->ref_cnt++;
 }
 
+static int _pages_ref_get(struct page *p, uint32_t size_bits)
+{
+    struct page *page_head;
+    int idx;
+
+    /* find page group head */
+    idx = p - page_start;
+    if (idx < 0 || idx >= page_nr)
+    {
+        return 0;
+    }
+    idx = idx & ~((1UL << size_bits) - 1);
+
+    page_head = page_start + idx;
+    return page_head->ref_cnt;
+}
+
 static int _pages_free(struct page *p, uint32_t size_bits)
 {
     uint32_t level = size_bits;
@@ -249,6 +266,19 @@ static struct page *_pages_alloc(uint32_t size_bits)
     return p;
 }
 
+int rt_page_ref_get(void *addr, uint32_t size_bits)
+{
+    struct page *p;
+    rt_base_t level;
+    int ref;
+
+    p = addr_to_page(addr);
+    level = rt_hw_interrupt_disable();
+    ref = _pages_ref_get(p, size_bits);
+    rt_hw_interrupt_enable(level);
+    return ref;
+}
+
 void rt_page_ref_inc(void *addr, uint32_t size_bits)
 {
     struct page *p;
@@ -304,7 +334,7 @@ void list_page(void)
         while (p)
         {
             total += (1UL << i);
-            rt_kprintf("[0x%08x]", page_to_addr(p));
+            rt_kprintf("[0x%08p]", page_to_addr(p));
             p = p->next;
         }
         rt_kprintf("\n");