1801BM1 / cpu11

Revengineered ancient PDP-11 CPUs, originals and clones
Other
155 stars 25 forks source link

VM3 mtpi in usermode not work. #20

Open xolod79 opened 3 months ago

xolod79 commented 3 months ago

This problem exists in real VM3 processors, but it may be possible to solve it in the verilog model. Which theoretically increases compatibility with DEC OS. These problems are mentioned in the DEMOS source codes. https://github.com/sergev/vak-opensource/tree/master/bk/demos-dvk DEMOS/src/sys/stand/bootstrap/M.s 94/05/13 / Вставлены заглушки для дебильных процессоров ВМ3, в которых mtpi / не работает из-под пользовательского режима (mtpi, mfpi, clrseg). ... /P3: Заменена на медленный аналог на C, работающий через mtpi(). /Это проще, чем переписывать, и не настолько уж медленно. // clrseg(addr,count) /.globl _clrseg /_clrseg: / mov 4(sp),r0 / beq 2f / asr r0 / bic $!77777,r0 / mov 2(sp),r1 /1: / clr -(sp) / mtpi (r1)+ / sob r0,1b /2: / rts pc

/ mtpd(word,addr) .globl _mtpd _mtpd: cmp _cputype,$23. / ДВК, однако beq mtpi_23 mov 4(sp),r0 mov 2(sp),-(sp) mtpd (r0)+ rts pc

/ mtpi(word,addr) .globl _mtpi _mtpi: cmp _cputype,$23. beq mtpi_23 mov 4(sp),r0 mov 2(sp),-(sp) mtpi (r0)+ rts pc

/P3: Вот mtpi(), которое не содержит mtpi. /В оригинале есть побочный эффект: возвращается адрес+2. Не знаю, нужно /ли это кому-нибудь. На всякий случай поддержано. Предполагается, что /мы находимся где-то внизу адресного пространства программы и можем /двигать сегмент #6. mtpi_23: mov 4(sp),r0 / addr mov 2(sp),r1 / value mov r2,-(sp) mov r3,-(sp)

mov r0,r2       / Вычисляем индекс сегмента назначения
ash     $-12.,r2
bic     $177761,r2

mov *$UISA6,r3  / Спасаем и устанавливаем сегмент #6
mov KISA0(r2),*$UISA6

mov r0,r2       / Относим смещение к базе #6
bic     $160000,r2
bis $140000,r2

mov r1,*r2

mov r3,*$UISA6  / Восстанавливаем базу #6

mov (sp)+,r3
mov (sp)+,r2
add $2,r0
rts pc
1801BM1 commented 3 months ago

Not sure the kernel space access should be allowed from user mode. F-11 factory tests of mtpd/mtpi instructions are done for "previous user mode" only. Would be interesting to test for "previous kernel mode".

But there is another errata related:

"Дополнения от Полетаева из стаpых постингов:

  1. Процессоры выпуска до середины 1989 года (приблизительно - дату точно не помню) имели ошибку в командах MFPD/MTPD - они отрабатывались как байтовые. Из-за них не работал TSX. Ошибка обходилась заменой на команды MTPI/MFPI.

Следующие ошибки, насколько мне известно, остались неустраненными.

  1. Ошибка в реализации команд MTPI/MTPD. Согласно PDP11 processor handbook эти команды должны выполняться следующим образом: (temp) <- (SP)+; (dst) <- (temp).

В 1801ВМ3 команда выполняется без использования промежуточного регистра. Проявляется в случае выполнения команды MTPI SP при совпадении текущего и предыдущего режимов работы процессора - значение указателя стека оказывается на 2 большим. Влияние на программное обеспечение не отмечено."