Обновление shared image на странице RTEM.
Поправлен косяк в KMON который обрушивает систему при попытке выгрузить foreground job.
Проблема сама по себе не относится к RTEM, просто дошли руки поковырять...
DEC немного перемудрил.
При выгрузке FG job, KMON пытается отменить назначения ему устройств в личное пользование.
При этом тупо сканится таблица $OWNER без всяких проверок загружен драйвер или нет.
Для простого драйвера такой способ работает - просто лишняя работа получается, а для драйвера с поддержкой 64 устройств используется дополнительная таблица которой не существует если драйвер не загружен в память (или, к слову, если драйвер при загрузке сам не сделал на нее ссылку). Как результат - вместо таблицы под раздачу попадают вектора устройств.
Код:
OINST MOV .$OWNER,R0,* ;Start at the beginning of the $OWNER table
MOV #<$SLOT>,R2 ;Get number of device slots for loop count
10$:
.IF NE UNI$64
CMP @R0,#<OWN.EX> ;Is this an extended unit entry?
BNE 20$ ;No
MOV #<32.>,R5 ;R5 = # bytes to check (extended ownership)
MOV R0,-(SP) ;Save R0 pointer into real $OWNER table
MOV 2(R0),R0 ;Point to the extended ownership table
CALL 40$ ;Clean out the extended ownership table
MOV (SP)+,R0 ;Restore R0
CMP (R0)+,(R0)+ ;Point R0 at next entry
BR 30$ ;And move onto next entry
Я не стал возиться с проверкой что драйвер загружен - просто добавил проверку что расширенной таблицы нет.
Теперь все выглядит так:
Код:
.FR FJTST
F>
*** EXIT ***
B>
.UNL F
.
А было так:
Код:
.FR FJTST
F>
*** EXIT ***
B>
.UNL F
02:56:13 Task "RTET55" terminated
SST abort. Bad stack
R0=110234
R1=000000
R2=000000
R3=000003
R4=140006
R5=137600
SP=177764
PC=140476
PS=170005
>
Ну и понятно, что проблема проявляется только в системах, собранных с расшиненными унитами и таблицей $OWNER. Если в такой системе загрузить в память драйверы которые поддерживают расширенные номера (обычно это LD и DU), то проблема тоже не проявляется.