equal
deleted
inserted
replaced
97 |
97 |
98 void TSubScheduler::SaveTimesliceTimer(NThreadBase* aT) |
98 void TSubScheduler::SaveTimesliceTimer(NThreadBase* aT) |
99 { |
99 { |
100 if (aT->iTime>0 && !aT->i_NThread_Initial) |
100 if (aT->iTime>0 && !aT->i_NThread_Initial) |
101 { |
101 { |
102 TUint32 remain32 = read_apic_reg(CURRCNT); |
102 TUint32 x = read_apic_reg(CURRCNT); |
103 TUint64 x(remain32); |
103 iSSX.iTimerFreqRI.iI.Mult(x); |
104 x *= TUint32(iSSX.iTimerPeriodM); |
|
105 x += 1u<<(iSSX.iTimerPeriodS-1); |
|
106 x >>= iSSX.iTimerPeriodS; |
|
107 aT->iTime = (TInt)x; |
104 aT->iTime = (TInt)x; |
108 } |
105 } |
109 write_apic_reg(INITCNT, 0); |
106 write_apic_reg(INITCNT, 0); |
110 } |
107 } |
111 |
108 |
126 aOld = iInitialThread; |
123 aOld = iInitialThread; |
127 if (!aNew) |
124 if (!aNew) |
128 aNew = iInitialThread; |
125 aNew = iInitialThread; |
129 if (aNew->iTime>0) |
126 if (aNew->iTime>0) |
130 { |
127 { |
131 TUint32 remain32 = (TUint32)aNew->iTime; |
128 TUint32 x = (TUint32)aNew->iTime; |
132 TUint64 x(remain32); |
129 iSSX.iTimerFreqRI.iR.Mult(x); |
133 x *= TUint32(iSSX.iTimerFreqM); |
130 write_apic_reg(INITCNT, x); |
134 x += TUint64(0x80000000u)<<iSSX.iTimerFreqS; |
|
135 x >>= (32+iSSX.iTimerFreqS); |
|
136 write_apic_reg(LVTTMR, TIMESLICE_VECTOR); |
|
137 write_apic_reg(INITCNT, (TUint32)x); |
|
138 } |
131 } |
139 if (aNew!=aOld) |
132 if (aNew!=aOld) |
140 { |
133 { |
141 TUint64 now = NKern::Timestamp(); |
134 TUint64 now = NKern::Timestamp(); |
142 TUint64 delta = now - iLastTimestamp.i64; |
135 TUint64 delta = now - iLastTimestamp.i64; |