Subversion Repositories HelenOS

Rev

Rev 1822 | Rev 1851 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1822 Rev 1823
Line 33... Line 33...
33
 */
33
 */
34
 
34
 
35
#ifndef __sparc64_TLB_H__
35
#ifndef __sparc64_TLB_H__
36
#define __sparc64_TLB_H__
36
#define __sparc64_TLB_H__
37
 
37
 
38
#include <arch/mm/tte.h>
-
 
39
#include <arch/mm/mmu.h>
-
 
40
#include <arch/mm/page.h>
-
 
41
#include <arch/asm.h>
-
 
42
#include <arch/barrier.h>
-
 
43
#include <arch/types.h>
-
 
44
#include <typedefs.h>
-
 
45
 
38
 
46
#define ITLB_ENTRY_COUNT        64
39
#define ITLB_ENTRY_COUNT        64
47
#define DTLB_ENTRY_COUNT        64
40
#define DTLB_ENTRY_COUNT        64
48
 
41
 
-
 
42
#define MEM_CONTEXT_KERNEL      0
-
 
43
#define MEM_CONTEXT_TEMP        1
-
 
44
 
49
/** Page sizes. */
45
/** Page sizes. */
50
#define PAGESIZE_8K 0
46
#define PAGESIZE_8K 0
51
#define PAGESIZE_64K    1
47
#define PAGESIZE_64K    1
52
#define PAGESIZE_512K   2
48
#define PAGESIZE_512K   2
53
#define PAGESIZE_4M 3
49
#define PAGESIZE_4M 3
54
 
50
 
55
/** Bit width of the TLB-locked portion of kernel address space. */
51
/** Bit width of the TLB-locked portion of kernel address space. */
56
#define KERNEL_PAGE_WIDTH       22  /* 4M */
52
#define KERNEL_PAGE_WIDTH       22  /* 4M */
57
 
53
 
-
 
54
/* TLB Demap Operation types. */
-
 
55
#define TLB_DEMAP_PAGE      0
-
 
56
#define TLB_DEMAP_CONTEXT   1
-
 
57
 
-
 
58
#define TLB_DEMAP_TYPE_SHIFT    6
-
 
59
 
-
 
60
/* TLB Demap Operation Context register encodings. */
-
 
61
#define TLB_DEMAP_PRIMARY   0
-
 
62
#define TLB_DEMAP_SECONDARY 1
-
 
63
#define TLB_DEMAP_NUCLEUS   2
-
 
64
 
-
 
65
#define TLB_DEMAP_CONTEXT_SHIFT 4
-
 
66
 
-
 
67
/* TLB Tag Access shifts */
-
 
68
#define TLB_TAG_ACCESS_CONTEXT_SHIFT    0
-
 
69
#define TLB_TAG_ACCESS_VPN_SHIFT    13
-
 
70
 
-
 
71
#ifndef __ASM__
-
 
72
 
-
 
73
#include <arch/mm/tte.h>
-
 
74
#include <arch/mm/mmu.h>
-
 
75
#include <arch/mm/page.h>
-
 
76
#include <arch/asm.h>
-
 
77
#include <arch/barrier.h>
-
 
78
#include <arch/types.h>
-
 
79
#include <typedefs.h>
-
 
80
 
58
union tlb_context_reg {
81
union tlb_context_reg {
59
    uint64_t v;
82
    uint64_t v;
60
    struct {
83
    struct {
61
        unsigned long : 51;
84
        unsigned long : 51;
62
        unsigned context : 13;      /**< Context/ASID. */
85
        unsigned context : 13;      /**< Context/ASID. */
Line 88... Line 111...
88
    } __attribute__ ((packed));
111
    } __attribute__ ((packed));
89
};
112
};
90
typedef union tlb_tag_read_reg tlb_tag_read_reg_t;
113
typedef union tlb_tag_read_reg tlb_tag_read_reg_t;
91
typedef union tlb_tag_read_reg tlb_tag_access_reg_t;
114
typedef union tlb_tag_read_reg tlb_tag_access_reg_t;
92
 
115
 
93
/** TLB Demap Operation types. */
-
 
94
#define TLB_DEMAP_PAGE      0
-
 
95
#define TLB_DEMAP_CONTEXT   1
-
 
96
 
-
 
97
/** TLB Demap Operation Context register encodings. */
-
 
98
#define TLB_DEMAP_PRIMARY   0
-
 
99
#define TLB_DEMAP_SECONDARY 1
-
 
100
#define TLB_DEMAP_NUCLEUS   2
-
 
101
 
116
 
102
/** TLB Demap Operation Address. */
117
/** TLB Demap Operation Address. */
103
union tlb_demap_addr {
118
union tlb_demap_addr {
104
    uint64_t value;
119
    uint64_t value;
105
    struct {
120
    struct {
Line 382... Line 397...
382
   
397
   
383
    da.type = type;
398
    da.type = type;
384
    da.context = context_encoding;
399
    da.context = context_encoding;
385
    da.vpn = pg.vpn;
400
    da.vpn = pg.vpn;
386
   
401
   
387
    asi_u64_write(ASI_IMMU_DEMAP, da.value, 0);
402
    asi_u64_write(ASI_IMMU_DEMAP, da.value, 0); /* da.value is the address within the ASI */
388
    flush();
403
    flush();
389
}
404
}
390
 
405
 
391
/** Perform DMMU TLB Demap Operation.
406
/** Perform DMMU TLB Demap Operation.
392
 *
407
 *
Line 404... Line 419...
404
   
419
   
405
    da.type = type;
420
    da.type = type;
406
    da.context = context_encoding;
421
    da.context = context_encoding;
407
    da.vpn = pg.vpn;
422
    da.vpn = pg.vpn;
408
   
423
   
409
    asi_u64_write(ASI_DMMU_DEMAP, da.value, 0);
424
    asi_u64_write(ASI_DMMU_DEMAP, da.value, 0); /* da.value is the address within the ASI */
410
    membar();
425
    membar();
411
}
426
}
412
 
427
 
413
extern void fast_instruction_access_mmu_miss(void);
428
extern void fast_instruction_access_mmu_miss(void);
414
extern void fast_data_access_mmu_miss(void);
429
extern void fast_data_access_mmu_miss(void);
415
extern void fast_data_access_protection(void);
430
extern void fast_data_access_protection(void);
416
 
431
 
417
extern void dtlb_insert_mapping(uintptr_t page, uintptr_t frame, int pagesize, bool locked, bool cacheable);
432
extern void dtlb_insert_mapping(uintptr_t page, uintptr_t frame, int pagesize, bool locked, bool cacheable);
418
 
433
 
-
 
434
#endif /* !def __ASM__ */
-
 
435
 
419
#endif
436
#endif
420
 
437
 
421
/** @}
438
/** @}
422
 */
439
 */