Subversion Repositories HelenOS

Rev

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

Rev 2449 Rev 2471
Line 64... Line 64...
64
    ipcarg_t offset;
64
    ipcarg_t offset;
65
 
65
 
66
    while (1) {
66
    while (1) {
67
        callid = async_get_call(&call);
67
        callid = async_get_call(&call);
68
        switch (IPC_GET_METHOD(call)) {
68
        switch (IPC_GET_METHOD(call)) {
69
            case IPC_M_PHONE_HUNGUP:
69
        case IPC_M_PHONE_HUNGUP:
70
                ipc_answer_fast(callid, 0,0,0);
70
            ipc_answer_fast(callid, 0, 0, 0);
71
                return;
71
            return;
72
            case IPC_M_AS_AREA_SEND:
72
        case IPC_M_AS_AREA_SEND:
73
                ipc_answer_fast(callid, 0, (uintptr_t)fs_addr, 0);
73
            ipc_answer_fast(callid, 0, (uintptr_t) fs_addr, 0);
74
                continue;
74
            continue;
75
            case RD_READ_BLOCK:        
75
        case RD_READ_BLOCK:        
76
                offset = IPC_GET_ARG1(call);
76
            offset = IPC_GET_ARG1(call);
77
                memcpy((void *)fs_addr, rd_addr+offset, BLOCK_SIZE);
77
            memcpy((void *) fs_addr, rd_addr + offset, BLOCK_SIZE);
78
                retval = EOK;
78
            retval = EOK;
79
                break;
79
            break;
80
            default:
80
        default:
81
                retval = EINVAL;
81
            retval = EINVAL;
82
        }
82
        }
83
        ipc_answer_fast(callid, retval, 0, 0);
83
        ipc_answer_fast(callid, retval, 0, 0);
84
    }  
84
    }
85
}
85
}
86
 
86
 
87
 
87
 
88
static bool rd_init(void)
88
static bool rd_init(void)
89
{
89
{
90
    int retval, flags;
90
    int retval, flags;
91
 
91
 
92
    size_t rd_size = sysinfo_value("rd.size");
92
    size_t rd_size = sysinfo_value("rd.size");
93
    void * rd_ph_addr = (void *) sysinfo_value("rd.address.physical");
93
    void *rd_ph_addr = (void *) sysinfo_value("rd.address.physical");
94
   
94
   
95
    if (rd_size == 0)
95
    if (rd_size == 0)
96
        return false;
96
        return false;
97
   
97
   
98
    rd_addr = as_get_mappable_page(rd_size);
98
    rd_addr = as_get_mappable_page(rd_size);
99
   
99
   
100
    flags = AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE;
100
    flags = AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE;
-
 
101
    retval = physmem_map(rd_ph_addr, rd_addr,
101
    retval = physmem_map(rd_ph_addr, rd_addr, ALIGN_UP(rd_size, PAGE_SIZE) >> PAGE_WIDTH, flags);
102
        ALIGN_UP(rd_size, PAGE_SIZE) >> PAGE_WIDTH, flags);
102
 
103
 
103
    if (retval < 0)
104
    if (retval < 0)
104
        return false;
105
        return false;
105
   
106
   
106
    size_t fs_size = ALIGN_UP(BLOCK_SIZE * sizeof(char), PAGE_SIZE);
107
    size_t fs_size = ALIGN_UP(BLOCK_SIZE * sizeof(char), PAGE_SIZE);