Changes in / [512a7df:1d69c69] in mainline


Ignore:
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • kernel/genarch/src/acpi/acpi.c

    r512a7df r1d69c69  
    102102
    103103        /* Start with mapping the header only. */
    104         vhdr = (struct acpi_sdt_header *) km_map((uintptr_t) psdt,
     104        vhdr = (struct acpi_sdt_header *) km_map_structure((uintptr_t) psdt,
    105105            sizeof(struct acpi_sdt_header), PAGE_READ | PAGE_NOT_CACHEABLE);
    106106
    107107        /* Now we can map the entire structure. */
    108         vsdt = (struct acpi_sdt_header *) km_map((uintptr_t) psdt,
     108        vsdt = (struct acpi_sdt_header *) km_map_structure((uintptr_t) psdt,
    109109            vhdr->length, PAGE_WRITE | PAGE_NOT_CACHEABLE);
    110110       
  • kernel/generic/include/mm/km.h

    r512a7df r1d69c69  
    5050
    5151extern uintptr_t km_map(uintptr_t, size_t, unsigned int);
    52 extern void km_unmap(uintptr_t, size_t);
     52extern uintptr_t km_map_structure(uintptr_t, size_t, unsigned int);
    5353
    5454extern uintptr_t km_temporary_page_get(uintptr_t *, frame_flags_t);
  • kernel/generic/src/mm/km.c

    r512a7df r1d69c69  
    124124}
    125125
    126 static uintptr_t
    127 km_map_aligned(uintptr_t paddr, size_t size, unsigned int flags)
     126uintptr_t km_map(uintptr_t paddr, size_t size, unsigned int flags)
    128127{
    129128        uintptr_t vaddr;
     129        size_t asize;
    130130        size_t align;
    131131        uintptr_t offs;
    132132
    133         ASSERT(ALIGN_DOWN(paddr, FRAME_SIZE) == paddr);
    134         ASSERT(ALIGN_UP(size, FRAME_SIZE) == size);
    135 
     133        asize = ALIGN_UP(size, PAGE_SIZE);
    136134        align = ispwr2(size) ? size : (1U << (fnzb(size) + 1));
    137         vaddr = km_page_alloc(size, max(PAGE_SIZE, align));
     135        vaddr = km_page_alloc(asize, max(PAGE_SIZE, align));
    138136
    139137        page_table_lock(AS_KERNEL, true);
    140         for (offs = 0; offs < size; offs += PAGE_SIZE) {
     138        for (offs = 0; offs < asize; offs += PAGE_SIZE) {
    141139                page_mapping_insert(AS_KERNEL, vaddr + offs, paddr + offs,
    142140                    flags);
     
    147145}
    148146
    149 static void km_unmap_aligned(uintptr_t vaddr, size_t size)
    150 {
    151         uintptr_t offs;
    152         ipl_t ipl;
    153 
    154         ASSERT(ALIGN_DOWN(vaddr, PAGE_SIZE) == vaddr);
    155         ASSERT(ALIGN_UP(size, PAGE_SIZE) == size);
    156 
    157         page_table_lock(AS_KERNEL, true);
    158 
    159         ipl = tlb_shootdown_start(TLB_INVL_ASID, ASID_KERNEL, 0, 0);
    160 
    161         for (offs = 0; offs < size; offs += PAGE_SIZE)
    162                 page_mapping_remove(AS_KERNEL, vaddr + offs);
    163 
    164         tlb_invalidate_asid(ASID_KERNEL);
    165 
    166         as_invalidate_translation_cache(AS_KERNEL, 0, -1);
    167         tlb_shootdown_finalize(ipl);
    168         page_table_unlock(AS_KERNEL, true);
    169 
    170         km_page_free(vaddr, size);
    171 }
    172 
    173 /** Map a piece of physical address space into the virtual address space.
    174  *
    175  * @param paddr         Physical address to be mapped. May be unaligned.
    176  * @param size          Size of area starting at paddr to be mapped.
    177  * @param flags         Protection flags to be used for the mapping.
    178  *
    179  * @return New virtual address mapped to paddr.
    180  */
    181 uintptr_t km_map(uintptr_t paddr, size_t size, unsigned int flags)
    182 {
     147uintptr_t km_map_structure(uintptr_t paddr, size_t size, unsigned int flags)
     148{
     149        size_t offs = paddr - ALIGN_DOWN(paddr, FRAME_SIZE);
    183150        uintptr_t page;
    184         size_t offs;
    185 
    186         offs = paddr - ALIGN_DOWN(paddr, FRAME_SIZE);
    187         page = km_map_aligned(ALIGN_DOWN(paddr, FRAME_SIZE),
    188             ALIGN_UP(size + offs, FRAME_SIZE), flags);
    189 
     151
     152        page = km_map(ALIGN_DOWN(paddr, FRAME_SIZE), size + offs, flags);
    190153        return page + offs;
    191154}
    192155
    193 /** Unmap a piece of virtual address space.
    194  *
    195  * @param vaddr         Virtual address to be unmapped. May be unaligned, but
    196  *                      it must a value previously returned by km_map().
    197  * @param size          Size of area starting at vaddr to be unmapped.
    198  */
    199 void km_unmap(uintptr_t vaddr, size_t size)
    200 {
    201         size_t offs;
    202 
    203         offs = vaddr - ALIGN_DOWN(vaddr, PAGE_SIZE);
    204         km_unmap_aligned(ALIGN_DOWN(vaddr, PAGE_SIZE),
    205             ALIGN_UP(size + offs, PAGE_SIZE));
    206 }
    207 
    208 /** Unmap kernel non-identity page.
     156/** Unmap kernen non-identity page.
    209157 *
    210158 * @param[in] page      Non-identity page to be unmapped.
  • kernel/test/mm/mapping1.c

    r512a7df r1d69c69  
    6666                v = *((uint32_t *) page1);
    6767       
    68                 if (v != TEST_MAGIC) {
    69                         km_unmap(page0, PAGE_SIZE);
    70                         km_unmap(page1, PAGE_SIZE);
    71                         frame_free(frame);
     68                if (v != TEST_MAGIC)
    7269                        return "Criss-cross read does not match the value written.";
    73                 }
    7470
    7571                TPRINTF("Writing zero using the second virtual address.\n");
     
    8177                v = *((uint32_t *) page0);
    8278       
    83                 if (v != 0) {
    84                         km_unmap(page0, PAGE_SIZE);
    85                         km_unmap(page1, PAGE_SIZE);
    86                         frame_free(frame);
     79                if (v != 0)
    8780                        return "Criss-cross read does not match the value written.";
    88                 }
    8981        }
    9082
    91         km_unmap(page0, PAGE_SIZE);
    92         km_unmap(page1, PAGE_SIZE);
    93         frame_free(frame);
     83        // FIXME: do not leak frame, page0 and page1
    9484       
    9585        return NULL;
  • kernel/test/mm/mapping1.def

    r512a7df r1d69c69  
    33        "Mapping test",
    44        &test_mapping1,
    5         true   
     5        false
    66},
  • uspace/lib/drv/generic/driver.c

    r512a7df r1d69c69  
    595595
    596596/** Allocate driver-specific device data. */
    597 void *ddf_dev_data_alloc(ddf_dev_t *dev, size_t size)
     597extern void *ddf_dev_data_alloc(ddf_dev_t *dev, size_t size)
    598598{
    599599        void *data;
     
    657657
    658658/** Allocate driver-specific function data. */
    659 void *ddf_fun_data_alloc(ddf_fun_t *fun, size_t size)
     659extern void *ddf_fun_data_alloc(ddf_fun_t *fun, size_t size)
    660660{
    661661        void *data;
  • uspace/lib/nic/src/nic_ev.c

    r512a7df r1d69c69  
    6363
    6464/** Device state changed. */
    65 int nic_ev_device_state(async_sess_t *sess, sysarg_t state)
     65extern int nic_ev_device_state(async_sess_t *sess, sysarg_t state)
    6666{
    6767        int rc;
  • uspace/lib/posix/ctype.c

    r512a7df r1d69c69  
    112112 * @return Non-zero if character match the definition, zero otherwise.
    113113 */
    114 int posix_isascii(int c)
     114extern int posix_isascii(int c)
    115115{
    116116        return c >= 0 && c < 128;
     
    123123 * @return Coverted character.
    124124 */
    125 int posix_toascii(int c)
     125extern int posix_toascii(int c)
    126126{
    127127        return c & 0x7F;
Note: See TracChangeset for help on using the changeset viewer.