Rev 1757 | Rev 1767 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1757 | Rev 1760 | ||
---|---|---|---|
Line 926... | Line 926... | ||
926 | * @param order Allocate exactly 2^order frames. |
926 | * @param order Allocate exactly 2^order frames. |
927 | * @param flags Flags for host zone selection and address processing. |
927 | * @param flags Flags for host zone selection and address processing. |
928 | * @param status Allocation status (FRAME_OK on success), unused if NULL. |
928 | * @param status Allocation status (FRAME_OK on success), unused if NULL. |
929 | * @param pzone Preferred zone |
929 | * @param pzone Preferred zone |
930 | * |
930 | * |
931 | * @return Allocated frame. |
931 | * @return Physical address of the allocated frame. |
932 | * |
932 | * |
933 | */ |
933 | */ |
934 | pfn_t frame_alloc_generic(__u8 order, int flags, int *status, int *pzone) |
934 | void * frame_alloc_generic(__u8 order, int flags, int *status, int *pzone) |
935 | { |
935 | { |
936 | ipl_t ipl; |
936 | ipl_t ipl; |
937 | int freed; |
937 | int freed; |
938 | pfn_t v; |
938 | pfn_t v; |
939 | zone_t *zone; |
939 | zone_t *zone; |
Line 969... | Line 969... | ||
969 | 969 | ||
970 | if (flags & FRAME_ATOMIC) { |
970 | if (flags & FRAME_ATOMIC) { |
971 | ASSERT(status != NULL); |
971 | ASSERT(status != NULL); |
972 | if (status) |
972 | if (status) |
973 | *status = FRAME_NO_MEMORY; |
973 | *status = FRAME_NO_MEMORY; |
974 | return NULL; |
974 | return 0; |
975 | } |
975 | } |
976 | 976 | ||
977 | panic("Sleep not implemented.\n"); |
977 | panic("Sleep not implemented.\n"); |
978 | goto loop; |
978 | goto loop; |
979 | } |
979 | } |
Line 984... | Line 984... | ||
984 | spinlock_unlock(&zone->lock); |
984 | spinlock_unlock(&zone->lock); |
985 | interrupts_restore(ipl); |
985 | interrupts_restore(ipl); |
986 | 986 | ||
987 | if (status) |
987 | if (status) |
988 | *status = FRAME_OK; |
988 | *status = FRAME_OK; |
- | 989 | ||
- | 990 | if (flags & FRAME_KA) |
|
- | 991 | return (void *)PA2KA(PFN2ADDR(v)); |
|
989 | return v; |
992 | return (void *)PFN2ADDR(v); |
990 | } |
993 | } |
991 | 994 | ||
992 | /** Free a frame. |
995 | /** Free a frame. |
993 | * |
996 | * |
994 | * Find respective frame structure for supplied PFN. |
997 | * Find respective frame structure for supplied PFN. |
995 | * Decrement frame reference count. |
998 | * Decrement frame reference count. |
996 | * If it drops to zero, move the frame structure to free list. |
999 | * If it drops to zero, move the frame structure to free list. |
997 | * |
1000 | * |
998 | * @param pfn Frame number of the frame to be freed. |
1001 | * @param Frame Physical Address of of the frame to be freed. |
999 | */ |
1002 | */ |
1000 | void frame_free(pfn_t pfn) |
1003 | void frame_free(__address frame) |
1001 | { |
1004 | { |
1002 | ipl_t ipl; |
1005 | ipl_t ipl; |
1003 | zone_t *zone; |
1006 | zone_t *zone; |
- | 1007 | pfn_t pfn = ADDR2PFN(frame); |
|
1004 | 1008 | ||
1005 | ipl = interrupts_disable(); |
1009 | ipl = interrupts_disable(); |
1006 | 1010 | ||
1007 | /* |
1011 | /* |
1008 | * First, find host frame zone for addr. |
1012 | * First, find host frame zone for addr. |