• Jeffrey Lee's avatar
    Add Service_PagesUnsafe64 & PagesSafe64 · 15a7d5ee
    Jeffrey Lee authored
    These use a page block with a 64bit address fields (matching OS_Memory
    64). The page list(s) contain the full list of pages involved in the
    operation, unlike the 32bit PagesUnsafe / PagesSafe calls, which only
    list pages which have 32bit addresses. The kernel issues the service
    calls in the following order:
    
    1. Service_PagesUnsafe64
    2. Service_PagesUnsafe
    3. Service_PagesSafe
    4. Service_PagesSafe64
    
    Since only one PagesUnsafe operation can occur at a time, a program
    which supports both service calls can safely ignore the PagesUnsafe /
    PagesSafe calls if a PagesUnsafe64 operation is in progress (the
    PagesUnsafe call will only list a subset of the pages from the
    PagesUnsafe64 call). The 32bit PagesUnsafe / PagesSafe calls will be
    skipped if no 32bit pages are being replaced.
    
    The addition of these calls means that NeedsSpecificPages DAs (and PMPs)
    can now request pages which have large physical addresses.
    
    Note that the page replacement logic now has the restriction that pages
    which have 32bit physical addresses can only be replaced by other pages
    which have 32bit physical addresses. This is necessary to ensure that
    users of the old 32bit APIs see the page replacement take place. However
    it does mean that programs will be unable to claim pages of low RAM
    which are in use if there are not enough free low RAM pages in the free
    pool.
    
    A future optimisation would be to update the service calls so that they
    don't list required pages which are in the free pool; if all the
    required pages are in the free pool this would allow the service calls
    (and FIQ claiming) to be skipped completely.
    15a7d5ee
ChangeDyn 263 KB