Subversion Repositories HelenOS

Rev

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

Rev 3635 Rev 3763
Line 133... Line 133...
133
    switch (b) {
133
    switch (b) {
134
    case 0: /*cnt 1-3*/
134
    case 0: /*cnt 1-3*/
135
        ps = PAGE_WIDTH;
135
        ps = PAGE_WIDTH;
136
        break;
136
        break;
137
    case 1: /*cnt 4-15*/
137
    case 1: /*cnt 4-15*/
138
        /*cnt=((cnt-1)/4)+1;*/
-
 
139
        ps = PAGE_WIDTH+2;
138
        ps = PAGE_WIDTH+2;
140
        va &= ~((1<<ps)-1);
139
        va &= ~((1<<ps)-1);
141
        break;
140
        break;
142
    case 2: /*cnt 16-63*/
141
    case 2: /*cnt 16-63*/
143
        /*cnt=((cnt-1)/16)+1;*/
-
 
144
        ps = PAGE_WIDTH+4;
142
        ps = PAGE_WIDTH+4;
145
        va &= ~((1<<ps)-1);
143
        va &= ~((1<<ps)-1);
146
        break;
144
        break;
147
    case 3: /*cnt 64-255*/
145
    case 3: /*cnt 64-255*/
148
        /*cnt=((cnt-1)/64)+1;*/
-
 
149
        ps = PAGE_WIDTH+6;
146
        ps = PAGE_WIDTH+6;
150
        va &= ~((1<<ps)-1);
147
        va &= ~((1<<ps)-1);
151
        break;
148
        break;
152
    case 4: /*cnt 256-1023*/
149
    case 4: /*cnt 256-1023*/
153
        /*cnt=((cnt-1)/256)+1;*/
-
 
154
        ps = PAGE_WIDTH+8;
150
        ps = PAGE_WIDTH+8;
155
        va &= ~((1<<ps)-1);
151
        va &= ~((1<<ps)-1);
156
        break;
152
        break;
157
    case 5: /*cnt 1024-4095*/
153
    case 5: /*cnt 1024-4095*/
158
        /*cnt=((cnt-1)/1024)+1;*/
-
 
159
        ps = PAGE_WIDTH+10;
154
        ps = PAGE_WIDTH+10;
160
        va &= ~((1<<ps)-1);
155
        va &= ~((1<<ps)-1);
161
        break;
156
        break;
162
    case 6: /*cnt 4096-16383*/
157
    case 6: /*cnt 4096-16383*/
163
        /*cnt=((cnt-1)/4096)+1;*/
-
 
164
        ps = PAGE_WIDTH+12;
158
        ps = PAGE_WIDTH+12;
165
        va &= ~((1<<ps)-1);
159
        va &= ~((1<<ps)-1);
166
        break;
160
        break;
167
    case 7: /*cnt 16384-65535*/
161
    case 7: /*cnt 16384-65535*/
168
    case 8: /*cnt 65536-(256K-1)*/
162
    case 8: /*cnt 65536-(256K-1)*/
169
        /*cnt=((cnt-1)/16384)+1;*/
-
 
170
        ps = PAGE_WIDTH+14;
163
        ps = PAGE_WIDTH+14;
171
        va &= ~((1<<ps)-1);
164
        va &= ~((1<<ps)-1);
172
        break;
165
        break;
173
    default:
166
    default:
174
        /*cnt=((cnt-1)/(16384*16))+1;*/
-
 
175
        ps=PAGE_WIDTH+18;
167
        ps=PAGE_WIDTH+18;
176
        va&=~((1<<ps)-1);
168
        va&=~((1<<ps)-1);
177
        break;
169
        break;
178
    }
170
    }
179
    /*cnt+=(page!=va);*/
-
 
180
    for(; va<(page+cnt*(PAGE_SIZE)); va += (1<<ps)) {
171
    for(; va<(page+cnt*(PAGE_SIZE)); va += (1<<ps)) {
181
        asm volatile (
172
        asm volatile (
182
            "ptc.l %0,%1;;"
173
            "ptc.l %0,%1;;"
183
            :
174
            :
184
            : "r" (va), "r" (ps<<2)
175
            : "r" (va), "r" (ps<<2)
Line 500... Line 491...
500
    if((va >= IO_OFFSET ) && (va < IO_OFFSET + (1<<IO_PAGE_WIDTH)))
491
    if((va >= IO_OFFSET ) && (va < IO_OFFSET + (1<<IO_PAGE_WIDTH)))
501
        if(TASK){
492
        if(TASK){
502
           
493
           
503
            uint64_t io_page=(va &  ((1<<IO_PAGE_WIDTH)-1)) >> (USPACE_IO_PAGE_WIDTH);
494
            uint64_t io_page=(va &  ((1<<IO_PAGE_WIDTH)-1)) >> (USPACE_IO_PAGE_WIDTH);
504
            if(is_io_page_accessible(io_page)){
495
            if(is_io_page_accessible(io_page)){
505
                //printf("Insert %llX\n",va);
-
 
506
 
-
 
507
                uint64_t page,frame;
496
                uint64_t page,frame;
508
 
497
 
509
                page = IO_OFFSET + (1 << USPACE_IO_PAGE_WIDTH) * io_page;
498
                page = IO_OFFSET + (1 << USPACE_IO_PAGE_WIDTH) * io_page;
510
                frame = IO_FRAME_BASE + (1 << USPACE_IO_PAGE_WIDTH) * io_page;
499
                frame = IO_FRAME_BASE + (1 << USPACE_IO_PAGE_WIDTH) * io_page;
511
 
500
 
Line 519... Line 508...
519
                entry.ma = MA_UNCACHEABLE;     
508
                entry.ma = MA_UNCACHEABLE;     
520
                entry.a = true;         /* already accessed */
509
                entry.a = true;         /* already accessed */
521
                entry.d = true;         /* already dirty */
510
                entry.d = true;         /* already dirty */
522
                entry.pl = PL_USER;
511
                entry.pl = PL_USER;
523
                entry.ar = AR_READ | AR_WRITE;
512
                entry.ar = AR_READ | AR_WRITE;
524
                entry.ppn = frame >> PPN_SHIFT;    //MUSIM spocitat frame
513
                entry.ppn = frame >> PPN_SHIFT;
525
                entry.ps = USPACE_IO_PAGE_WIDTH;
514
                entry.ps = USPACE_IO_PAGE_WIDTH;
526
   
515
   
527
                dtc_mapping_insert(page, TASK->as->asid, entry); //Musim zjistit ASID
516
                dtc_mapping_insert(page, TASK->as->asid, entry);
528
                return 1;
517
                return 1;
529
            }else {
518
            }else {
530
                fault_if_from_uspace(istate,"IO access fault at %p",va);
519
                fault_if_from_uspace(istate,"IO access fault at %p",va);
531
                return 0;
520
                return 0;
532
            }      
521
            }